SOFTWARE DE SISTEMA – SISTEMA OPERACIONAL AULA 10 – Arquitetura de Computadores Gil Eduardo de Andrade O conteúdo deste documento é baseado no livro “Princípios Básicos de Arquitetura e Organização de Computadores” – Linda Null e Julia Labur Introdução Nas aulas anteriores foram introduzidos os principais conceitos sobre a organização dos computadores. Esses conceitos se caracterizaram, de uma forma simplista, em visualizar o computador como um conjunto de máquinas virtuais divididas em vários níveis, cada qual fornecendo uma abstração para o nível logo abaixo. Também foram discutidas linguagens simbólicas com a arquitetura da máquina (software didático SAVON). Esta aula, tem por objetivo, estudar o software encontrado no nível 3 (ver aula 02), ligando-o com o software encontrado no quarto e quinto níveis dessa hierarquia. Esse conjunto de softwares é executado abaixo dos programas de aplicação e logo acima da arquitetura do conjunto de instruções. Estes são os componentes de software, as “máquinas” com os quais seu código fonte de aplicação interage. Os programas nestes níveis trabalham juntos para garantir o acesso aos recursos de hardware que realizam os comandos contidos nos programas de aplicação. Embora nosso modelo de sistema de computação coloque somente o sistema operacional no nível de “software de sistema”, o estudo deste, muitas vezes inclui compiladores e outros utilitários, assim como uma categoria de programas complexos algumas vezes chamados de middleware. O middleware, de forma geral, nada mais é do que uma camada de software acima do sistema operacional que fornece serviços para as aplicações, que se localizam na camada logo acima. Quando estudamos a hierarquia de níveis vimos que havia um grande intervalo entre as linguagens de alto nível/aplicações e os componentes físicos do sistema, este intervalo deve ser imperceptível para o usuário, e o responsável por essa característica, criando essa invisibilidade é o middleware. Sendo o sistema operacional o suporte a todo o software de sistema, praticamente todos os sistemas de software interagem com o sistema operacional de alguma maneira. Sistemas Operacionais Originalmente, o principal papel de um sistema operacional era auxiliar as diversas aplicações a interagir com o hardware do computador. Sistemas operacionais fornecem um conjunto de funções necessárias para permitir aos pacotes de software controlar o hardware do computador. Sem um sistema operacional, cada programa que você executa necessitaria de seu próprio controlador para a placa de vídeo, para placa de som, para o disco rígido e assim por diante. Embora sistemas operacionais modernos ainda executem esta função, as expectativas de usuários a respeito deles têm mudado consideravelmente. Eles consideram que um sistema operacional vai tornar mais fácil para eles gerenciar o sistema e seus recursos. Essa expectativa gerou o controle de arquivos “arrastar e largar”, bem como o controle de dispositivos “ligar e usar”. Olhando pela perspectiva do programador, o sistema operacional obscurece os detalhes dos níveis mais baixos da arquitetura do sistema, permitindo um foco maior na solução de alto nível de problemas. Os sistemas operacionais criam um ambiente mais amigável, no qual os recursos do sistema são utilizados efetivamente e eficientemente e onde não é exigido programar em código de máquina. O sistema operacional não apenas fornece esta interface ao programador, mas também atua como uma camada entre o software de aplicação e o hardware real da máquina. Ele lida com dispositivos reais e hardware real, de modo que os programas de aplicação e os usuários não tenham que fazer isso. O sistema operacional é um pouco mais que uma peça de software, ele difere dos outros pelo fato de que é carregado na inicialização do computador e posteriormente executado diretamente pelo processador, sendo assim cabe a ele controlar o processador (bem como a outros recursos) e a execução de instruções no mesmo. Sistemas operacionais para computadores pessoais Sistemas operacionais para computadores pessoais possuem um objetivo diferente daqueles para sistemas maiores. Enquanto sistemas maiores querem fornecer uma excelente performance e utilização de hardware (ao mesmo tempo tornando o sistema mais fácil de usar), sistemas operacionais para computadores pessoais tem um objetivo principal: tornar o sistema amigável para o usuário. Quando a Intel trouxe o microprocessador 8080 em 1974, a empresa solicitou a Gary Kildall que escrevesse um sistema operacional. Kildall construiu um controlador para um disco flexível, conectou o disco ao 8080 e escreveu o software do sistema operacional para controlar os dispositivos. Ele chamou esses sistema baseado em disco de CP/M (Control Program for Microcomputers). O BIOS (basic input/output system) permitiu que o CP/M fosse facilmente exportado para diferentes tipos de PCs porque fornecia as interações necessárias com dispositivos de entrada/saída. Como dispositivos de E/S são componentes mais prováveis de variar de sistema para sistema, o empacotamento das interfaces para estes dispositivos em um módulo fez com que o sistema operacional pudesse permanecer mesmo para diversas máquinas. A Intel erroneamente assumiu que as máquinas baseadas em disco teriam um futuro triste. Depois de decidir não usar mais o novo sistema operacional, a Intel deu os direitos sobre o PC/M para Kildall. Em 1980 a IBM necessitou de um sistema operacional para o IBM PC. Embora a IBM tivesse entrado em contato com Kildall primeiro, o negócio terminou indo para a Microsoft, que havia comprado um sistema operacional baseado em disco denominado QDOS (Quick and Dirty Qperating System), da Seatle Computer Products Company, por $15.000,00. O software foi renomeado de MS-DOS e o resto é história. Os sistemas operacionais para os primeiros computadores pessoais operavam sob comandos digitados via teclado. Alan Key, inventor da GUI (graphical user interface) e Doug Engelbart, inventor do mouse, ambos do centro de pesquisas da Xerox, mudaram para sempre a face dos sistemas operacionais quando suas ideias foram incorporadas aos sistemas operacionais. Por meio dos seus esforços, os símbolos de comandos foram substituídos por janelas, ícones e menus drop-down. A microsoft popularizou as idéias (mas não as inventou) por intermédio de suas séries de sistemas operacionais Windows: Windows 1.x, 2.x, 3.x, 95, 98, ME, NT, 2000, XP, Vista, Seven. O sistema operacional gráfico do Macintosh, MacOS, que precedeu o Windows GUI em muitos anos, também teve numerosas versões. O Unix tem ganho popularidade também no mundo dos computadores pessoais através do Linux e OpenBSD. Projeto de Sistemas Operacionais O sistema operacional controla as funções básicas do computador, incluindo gerenciamento de memória e E/S. Um sistema operacional difere da maioria dos outros softwares no sentido de ser guiado por eventos, significando que ele realiza tarefas em resposta a comandos, programas de aplicações, dispositivos de E/S e interrupções. Quatro fatores principais guiam o projeto de um sistema operacional: performance, potência, custo e compatibilidade. A maioria dos sistemas operacionais possuem interfaces similares, mas variam enormemente no modo de realizar tarefas. Alguns sistemas são minimalistas no projeto, enquanto outros tentam incluir todos os recursos concebíveis. Alguns têm interfaces superiores, mas deixam a desejar em outras áreas, preferindo cobrir funções mais básicas (Windows – na minha opinião [Gil Eduardo de Andrade]), enquanto outros são superiores em gerenciamento de memória e E/S, mas se descuidam da tarefa de ser amigável para o usuário (Linux, até tempos atrás – minha opinião [Gil Eduardo de Andrade]). Nenhum sistema operacional único é superior em todos os aspectos. Dois componentes são cruciais no projeto de sistemas operacional: o núcleo (kernel) e os programas do sistema. O kernel é o núcleo do sistema operacional. Ele é usado pelo gerente de processos, pelo escalonador, pelo gerente de recursos e pelo gerente de E/S. O núcleo é responsável por escalonamento, sincronismo, proteção/segurança, gerência de memória e tratamento de interrupções. Ele tem o controle primário do hardware do sistema, incluindo registradores de controle e temporizadores. Ele carrega todos os controladores de dispositivos, fornece os utilitários comuns e coordena toda a atividade de E/S. O núcleo deve conhecer as especificidades do hardware para combinar todas estas peças em um sistema que funcione. Os dois extremos do projeto do núcleo são as arquiteturas microkernel e núcleos monolíticos. Microkernels fornecem a funcionalidade rudimentar do sistema operacional, apoiando-se em outros módulos para realizar tarefas específicas, transferindo assim muitos serviços típicos do sistema operacional para o espaço do usuário. Isto permite que muitos serviços sejam reiniciados ou reconfigurados sem a necessidade de reiniciar todo o sistema operacional. Microkernels fornecem segurança porque os serviços que são executados em nível de usuário têm acesso restrito aos recursos do sistema. Suas principais características são seu pequeno tamanho, sua fácil portabilidade e seu conjunto de serviços executados um nível abaixo do núcleo. Contudo, é necessária uma comunicação adicional entre o núcleo e os outros módulos, resultando muitas vezes em um sistema mais lento e menos eficiente. Exemplos de microkernel incluem Windows 2000 e Mach. Núcleos monolíticos fornecem a sua funcionalidade essencial por meio de um único processo. Consequentemente, eles são significativamente maiores do que os microkernels. Geralmente orientados para um hardware em específico, núcleos monolíticos interagem diretamente com o hardware, de modo que podem ser otimizados mais facilmente do que sistemas operacionais microkernel. É por esta razão que núcleos monolíticos não são facilmente portáveis. Exemplos de sistemas operacionais de núcleo monolítico incluem Linux, MacOS e DOS. Visto que um sistema operacional consome, além de gerenciá-los, os projetistas devem considerar o tamanho total do produto pronto. Por exemplo, o Solaris da Sun Microsystem (versões antigas) requer cerca de 8 MB de espaço em disco para uma instalação completa; o Windows 2000 requer cerca do dobro desta quantidade. Isso mostra o grande aumento da funcionalidade de sistemas operacionais nas últimas décadas. O MS-DOS 1.0 cabia confortavelmente em um único disquete de 100 KB. Serviços do Sistemas Operacionais Durante as seções anteriores foram mencionados alguns serviços mais importantes que o sistema operacional fornece. O SO supervisiona todas as tarefas críticas de gerenciamento do sistema, incluindo gerência de memória e processos, proteção e interação com dispositivos de E/S. Em seu papel de interface, o sistema operacional determina como o usuário interage com o computador, servindo como um isolador entre o usuário e o hardware. Cada uma dessas funções é um fator importante na determinação da performance geral do sistema e de sua usabilidade. De fato, algumas vezes poderemos aceitar uma performance reduzida se o sistema for fácil de usar. Em nenhum lugar este compromisso é mais aparente do que na área de interfaces gráficas. A Interface Humana O sistema operacional fornece um nível de abstração entre o usuário e o hardware da máquina. Nem usuários nem aplicações veem o hardware diretamente porque o sistema operacional providencia uma interface para esconder os detalhes da máquina nua. As interfaces de usuário do sistema operacional podem ser divididas em duas categorias gerais: interfaces de linha de comando e interfaces gráficas com usuário (GUIs). Interfaces de linha de comando fornecem um prompt para o usuário entrar com diversos comandos, incluindo aqueles para copiar arquivos, eliminar arquivos, fornecer listagem de diretório e de manipulação da estrutura de diretórios. As interfaces de linha de comando exigem que o usuário conheça a sintaxe do sistema, que muitas vezes é demasiado complicada para o usuário médio. GUIs, por outro lado, fornecem uma interface mais acessível para o usuário casual. GUIs modernas consistem de janelas colocadas em uma superfície. Elas incluem características tais como ícones e outras representações gráficas de arquivos que são manipuladas usando mouse. Exemplos de interfaces de linha de comando incluem shell do Unix e o DOS. Exemplos de GUIs incluem as diversas variantes do Microsoft Windows e MacOS. A interface de usuário é um programa, ou um pequeno conjunto de programas, que constituem o gerenciador de exibição. Esse módulo é normalmente separado das funções básicas do sistema operacional encontradas no kernel do sistema operacional. Gerenciamento de Processos O gerenciamento de processos repousa no coração dos serviços do sistema operacional. Ele inclui tudo, desde a criação dos processos (configurando as estruturas apropriadas para armazenar informações sobre cada um) e o escalonamento dos diversos recursos usados pelos processos até a eliminação dos processos e a limpeza após o seu término. O sistema operacional mantém um olhar cuidadoso sobre as atividades de cada processo para evitar problemas de sincronização, os quais ocorrem quando processos concorrentes têm acesso a recursos compartilhados. Estas atividades devem ser monitoradas cuidadosamente para evitar inconsistências nos dados e interferência acidental. O escalonamento de processos é uma grande parte da rotina normal do sistema operacional. Primeiro, o sistema operacional deve determinar quais são os processos a serem admitidos no sistema. Depois ele deve determinar quais processo terão acesso à UCP a qualquer dado instante. Se um processo em execução necessita de E/S ou de outros recursos, ele voluntariamente libera a UCP e se coloca em uma lista de espera e outro processo é escalado para execução. Esta sequência de eventos provoca a chamada troca de contexto. Durante uma troca de contexto, todas as informações pertinentes a respeito dos processos atualmente em execução são salvas, de modo que quando aquele processo retorna, ele pode ser restaurado ao estado exato no qual ele foi interrompido. Gerenciamento de Recursos Além de gerenciar processos, o sistema operacional gerencia os recursos do sistema. Visto que estes recursos são relativamente caros, é preferível permitir que eles sejam compartilhados. Por exemplo, vários processos podem compartilhar um processador, vários programas podem compartilhar memória física e diversos usuários e arquivos podem compartilhar o disco. Existem três recursos que constituem a preocupação principal do sistema operacional: a UCP, a memória e a E/S. O acesso à UCP é controlado pelo escalonador. O acesso à memória e à E/S requerem um conjunto diferente de controles e funções. Relembrando a aula de memórias, sabemos que a maior parte dos sistemas modernos tem algum tipo de memória virtual que estende a RAM. Isto implica que partes de diversos programas coexistam na memória e que cada processo deva ter uma tabela de páginas. Originalmente, antes de sistemas operacionais serem projetados para lidar com memória virtual, o programador implementava a memória virtual usando uma técnica de sobreposição. Se um programa era muito grande grande para caber na memória, o programador o dividia em partes, carregando apenas os dados e as instruções necessárias para serem executadas em um dado momento. O programador era responsável por gerenciar a memória. Agora os sistemas operacionais tomaram para si esta tarefa. O sistema operacional traduz endereços virtuais para endereços físicos, transfere páginas de e para o disco e mantém as tabelas de página de memória. Segurança e Proteção Em seu papel de gerenciador de recursos e processos, o sistema operacional tem de assegurar que tudo funcione de forma correta, suave e eficiente. O compartilhamento de recursos, entretanto, cria muitas situações, tais como possibilidade de acesso não autorizado ou a modificação de dados. Portanto, o sistema operacional também atua como protetor de recursos, assegurando que “usuários e aplicativos maliciosos” e software com defeito não arruíne as coisas para todos os outros. Os processos concorrentes devem ser protegidos uns dos outros, e processos do sistema operacional devem ser protegidos contra todos os processos de usuário.