7 Sistemas Operacionais 7.1 Fundamentos da ciência da computação Cengage Learning
Objetivos 7.2 Compreender o papel do sistema operacional. Compreender o processo de inicialização para carregar o sistema operacional na memória. Listar os componentes de um sistema operacional. Discutir o papel do gerenciador de memória. Discutir o papel do gerenciador de processo. Discutir o papel do gerenciador de dispositivos. Discutir o papel do gerenciador de arquivos em um sistema operacional. Entenda as principais características dos três sistemas operacionais comuns: UNIX, Linux e Windows
7.3 Computador é um sistema composto de dois importantes componentes: hardware e software. Hardware é o equipamento físico, e software, o conjunto de programas que permite que o hardware faça seu trabalho. O software é dividido em duas amplas categorias: o sistema operacional e os programas da aplicação (aplicativos).
7.4 Figura 7.1 Sistema computacional
7-1 INTRODUÇÃO Um sistema operacional é complexo, portanto é difícil dar uma definição simples e universal. Em vez disso, aqui estão algumas definições comuns: Um sistema operacional é uma interface entre o hardware de um computador e o utilizador (programas ou seres humanos). Um sistema operacional é um programa (ou um conjunto de programas) que facilita a execução de outros programas. Um sistema operacional atua como um gerente geral supervisionando a atividade de cada componente no sistema de computador. 7.5
i Um sistema operacional é uma interface entre o hardware de um computador e o utilizador (Programas ou humanos) que facilita a execução de outros programas e o acesso a recursos de hardware e software Dois grandes objetivos do projeto de um sistema operacional são: Uso eficiente de hardware. A facilidade de utilização dos recursos. 7.6
Processo de inicialização O sistema operacional, com base nas definições acima, fornece suporte para outros programas. Por exemplo, é responsável por carregar outros programas na memória para execução. No entanto, o próprio sistema operacional é um programa, que precisa de ser carregado para a memória e ser executado. Como este dilema é resolvido? A solução é um processo em duas fases. 7.7
Processo de inicialização Uma pequena seção de memória é feita de ROM e possui uma pequena programa chamado o programa de inicialização. Quando o computador é ativada, o contador de CPU está definido para a primeira instrução deste programa de inicialização e executa as instruções contidas neste programa. Quando o carregamento for feito, o contador de programa está definido para a primeira instrução do sistema operacional na RAM. 7.8
7.9 Figura 7.2 O processo de bootstrap
7-2 EVOLUÇÃO Sistemas de lote (batch) Sistemas operacionais lote foram projetados na década de 1950 para controlar computadores mainframe. Os computadores eram grandes máquinas que utilizavam cartões perfurados para a entrada, impressoras de linha para saída e unidades de fita para mídia de armazenamento secundário. Cada programa a ser executado foi chamado de job. O programador que quisesse executar um trabalho envia uma solicitação para o sistema operacional. 7.10
7-2 EVOLUÇÃO 7.11 http://www.computerhistory.org/revolution/mainframe-computers/7/166/662
Sistemas de compartilhamento de tempo Para utilizar com eficiência os recursos de um sistema computacional, foi criada a multiprogramação. A ideia é manter vários jobs (trabalhos) na memória, ao mesmo tempo, e somente atribuir um recurso para um job que esteja precisando, com a condição de que o recurso esteja disponível. Multiprogramação trouxe a ideia de compartihamento de tempo: os recursos podem ser compartilhados entre diferentes jobs. Como o computador é muito mais rápido que um humano, cada usuário tem a impressão de que todo o sistema o está servindo exclusivamente. 7.12
Sistemas pessoais Quando os computadores pessoais foram desenvolvidos, havia necessidade de um sistema operacional para esse novo tipo de computador. Foram criados os sistemas operacionais de um único usuário (monousuário), como o DOS (Disk Operating System [Sistema Operacional em Disco]). Sistemas paralelos A necessidade de mais velocidade e eficiência levou à concepção de sistemas paralelos: múltiplas CPUs na mesma máquina. Cada CPU pode ser utilizada para servir um programa, ou parte de um, o que significa que muitas tarefas podem ser realizadas paralelamente, em vez de serial. Os sistemas operacionais exigidos para isso são mais complexos do que aqueles compatíveis com CPUs individuais. 7.13
Sistemas distribuídos As operações em rede e inter-redes criaram uma nova dimensão nos sistemas operacionais. Um job que foi previamente feito para um computador pode agora ser compartilhado entre computadores, que podem estar a milhares de quilômetros de distância. Os sistemas distribuídos combinam recursos da geração anterior com novas exigências, como o controle de segurança. Sistemas de tempo real Espera-se que um sistema de tempo real realize uma tarefa dentro de uma restrição de tempo específica. Esses sistemas são utilizados com aplicações de tempo real, que monitoram, respondem ou controlam processos ou ambientes externos. 7.14
7-3 COMPONENTES Um sistema operacional precisa gerenciar diferentes recursos em um sistema computacional. Isso se assemelha a uma organização com diversos gerentes no nível superior. Cada gerente é responsável por gerir seu departamento, mas também precisa cooperar com outros e coordenar atividades. Um moderno sistema operacional tem, pelo menos, quatro componentes gerenciadores: de memória, de processos, de dispositivos e de arquivos. 7.15
7.16 Figura 7.3 Componentes de um sistema operacional
Interface com o usuário Cada sistema operacional tem uma interface com o usuário, um programa que aceita solicitações dos usuários (processos) e as interpreta para o restante do sistema operacional. Esta interface, em alguns sistemas operacionais, como UNIX, é chamada shell. Em outros sistemas, é chamada janela, para denotar que esse sistema é dirigido por menu e tem um componente GUI (graphical user interface [interface gráfica do usuário]). 7.17
Gerenciador de memória Embora o tamanho da memória dos computadores tenha aumentado enormemente nos últimos anos, isso também aconteceu com o tamanho dos programas e dos dados a serem processados. A alocação de memória deve ser gerenciada para evitar que aplicações tenham sua memória esgotada. Os sistemas operacionais podem ser divididos em duas amplas categorias de gerenciamento de memória: monoprogramação e multiprogramação. 7.18
Monoprogramação Na monoprogramação, a maior parte da capacidade de memória é dedicada a um único programa; somente uma pequena parte é necessária para manter o sistema operacional. Nessa configuração, o programa inteiro está na memória para execução. Quando o programa termina sua execução, a área do programa é ocupada por outro. 7.19 Figura 7.4 Monoprogramação
Multiprogramação Na multiprogramação, há mais de um programa na memória ao mesmo tempo, e eles são executados concorrentemente, com a CPU alternando rapidamente entre os programas. 7.20 Figura 7.5 Multiprogramação
7.21 Figura 7.6 Categorias de multiprogramação
Particionamento No particionamento a memória é dividida em seções de tamanho variável. Cada seção da partição mantém um programa. A CPU alterna entre programas, começando com um, executando algumas instruções, até que encontre uma operação de entrada/saída ou que se esgote o tempo alocado para aquele programa. 7.22 Figura 7.7 Particionamento
Particionamento A CPU, então, grava o endereço da localização de memória em que a última instrução foi executada e se move para o programa seguinte. O mesmo procedimento é repetido com o segundo programa. Depois que todos os programas foram atendidos, a CPU volta para o primeiro programa. Os níveis de prioridade também podem ser utilizados para controlar o quanto de tempo de CPU é alocado para cada programa. 7.23 Figure 7.7 Partitioning
Paginação A paginação melhora a eficiência do particionamento, pois a memória é divida em seções de tamanhos iguais, chamadas frames. Os programas também são divididos em seções de igual tamanho, chamadas páginas. 7.24 Figura 7.8 Paginação
Paginação Se um programa tem três páginas, ele ocupa três frames na memória. O programa não precisa ser contíguo na memória; duas páginas consecutivas podem ocupar frames não contíguos na memória. 7.25 Figure 7.8 Paging
Paginação A vantagem da paginação sobre o particonamento é que dois programas, cada um deles utilizando três frames não contíguos, podem ser substituídos por um programa que precisa de seis frames. 7.26 Figura 7.8 Paginação
Paginação por demanda A paginação não requer que o programa esteja em localizações de memória contíguas, mas ainda exige que o programa inteiro esteja na memória para execução. A paginação por demanda eliminou essa última restrição. Figura 7.9 Paginação por demanda 7.27
Segmentação por demanda Em segmentação por demanda, o programa é dividido em segmentos que correspondem à visão do programador. Eles são carregados na memória, executados e substituídos por outro módulo do mesmo ou de um programa diferente. Figura 7.10 Segmentação por demanda 7.28
Memória virtual A paginação por demanda e a segmentação por demanda significam que: Quando um programa está sendo executado, parte do programa está na memória e parte está no disco. Por exemplo, uma memória de 10 MB de tamanho pode executar 10 programas, cada um com tamanho de 3 MB, totalizando 30 MB. A qualquer momento, apenas 10 MB do 10 programas estão na memória e 20 MB estão no disco. Existe, portanto, um tamanho real de memória igual a 10 MB, mas um tamanho de memória virtual igual a 30 7.29 MB.
7.30 Figura 7.11 Memória virtual
Gerenciador de processos Uma segunda função de um sistema operacional é o gerenciamento de processos, mas, antes de comentar esse conceito, precisamos definir alguns termos. Programa, job, e processo Programa é um conjunto de instruções, não ativo, armazenado em disco (ou fita), que pode ou não se transformar em um job. Um programa se torna um job no momento em que é selecionado (preparado) para execução, e assim permanece até o momento em que a execução é concluída, quando se torna novamente um programa. Processo é um programa em execução, ou seja, um programa que iniciou, ma não foi concluído. 7.31
Diagramas de estado A relação entre um programa, um job e um processo se torna mais clara se consideramos como um programa se torna um job e como um job se torna um processo. Isso pode ser ilustrado com um diagrama de estados, que mostra os diferentes estados de cada uma dessas entidades. 7.32
Figura 7.12 Diagramas de estados representando limites entre programa, job 7.33 e processos
Escalonadores Para mover um job ou um processo de um estado para outro, o gerenciador de processos utiliza dois escalonadores: o de jobs e o de processos. O escalonador de jobs move um job do estado de preparação para pronto ou do estado de execução para concluído. 7.34 Figura 7.13 Escalonador de jobs
Escalonadores O escalonador de processos move um processo do estado de execução para o de espera, em que o processo espera que algum evento ocorra. Move o processo do estado de espera para pronto quando o evento ocorreu, e move do estado de execução para pronto se o intervalor de tempo do processo tiver se esgotado. Figura 7.14 Escalonador de processos 7.35
Filas de espera Nosso diagrama de estado mostra um job ou processo se movendo de um estado para outro. Na realidade, existem muitos jobs e processos competindo entre si pelos recursos do computador. Para lidar com múltiplos processos e jobs, o gerenciador de processos utiliza filas (listas de espera). 7.36
Filas de espera Um bloco de controle de job ou bloco de controle de processo é associado a cada job ou processo. Esse é um bloco de memória que armazena informações sobre um job ou processo. O gerenciador de processos armazena o bloco de controle de job ou processo nas filas, em vez do próprio job ou processo em si. 7.37
7.38 Figura 7.15 Filas para gerenciamento de processos
Sincronização de processos A ideia geral do gerenciamento de processos é o sincronizar diferentes processos com diferentes recursos. Sempre que recursos podem ser utilizados por mais de um usuário (ou processo, neste caso) podemos ter duas situações problemáticas: deadlock e starvation. 7.39
i Figura 7.16 Deadlock O deadlock ocorre quando o sistema operacional não define restrições de recursos para os processos. 7.40
7.41 Figura 7.17 Deadlock em uma ponte
Deadlock Existem quatro condições necessárias para que ocorra um deadlock (pré-condições necessárias mas não suficientes): Exclusão mútua. Somente um processo pode manter um recurso. Retenção de recursos. Um processo mantém um recurso, mesmo que não possa utilizá-lo até que outros recursos estejam disponíveis. Sem preempção. O sistema operacional não pode realocar um recurso temporariamente. Espera circular. Todos os processos e recursos envolvidos formam um laço. Para preveni-lo ou evitá-lo: não permitir que uma dessas condições ocorra. 7.42
Starvation Starvation é o oposto de deadlock. Pode ocorrer quando o sistema operacional define muitas restrições de recursos para um processo. Por exemplo, imagine um sistema operacional que especifica que um processo deve ter em sua posse os recursos exigidos, antes que possa ser executado. 7.43
7.44 Figura 7.18 Starvation
Starvation Um clássico problema relacionado a starvation foi introduzido por Edsger Dijkstra. Cinco filósofos estão sentados ao redor de uma mesa circular. Cada um deles precisa de dois hashis (os tradicionais pauzinhos de madeira) para comer uma tigela de arroz. No entanto, um ou ambos hashis podem ser utilizados por alguém sentado a seu lado. É possível que um filósofo fique em starvation (faminto) se dois hashis não estiverem disponíveis ao mesmo tempo. 7.45
i Figura 7.19 O problema do jantar dos filósofos Starvation é o oposto de deadlock. Pode ocorrer quando o sistema operacional define muitas restrições de recursos para um processo. 7.46
Gerenciador de dispositivos O gerenciador de dispositivos, ou gerenciador de entrada/saída, é responsável pelo acesso a dispositivos de entrada/saída. Existem limitações quanto ao número e a velocidade dos dispositivos de entrada/saída em um sistema computacional. Monitora cada dispositivo de entrada/saída constantemente para garantir que esteja funcionando de forma apropriada. Mantém uma fila para cada dispositivo de entrada/saída ou uma ou mais filas para dispositivos similares. Controla as diferentes políticas de acesso a dispositivos de entrada/saída. 7.47
Gerenciador de arquivos Os sistemas operacionais utilizam um gerenciador de arquivos para controlar o acesso a arquivos. O gerenciador de arquivo: controla o acesso a arquivos (ler, escrever, e executar). supervisiona a criação, exclusão e modificação dos arquivos. pode controlar a nomeação de arquivos. supervisiona o armazenamento de arquivos: como e onde são armazenados. é responsável pelo arquivamento e pelos backups. 7.48