Baixe o app para aproveitar ainda mais
Prévia do material em texto
Tipos de Sistemas Operacionais 3.1 Introdução Evolução dos Sistemas Operacionais -> Hardware Programa e Job X Processo e Subprocesso X Tarefa e Thread. Tipos de Sistemas Operacionais o Monoprogramáveis / Monotarefa o Multiprogramáveis / Multitarefa o Multiplos Processadores 3.2 - Sistemas Monoprogramáveis / Monotarefa Execução de um único programa (JOB). Relacionados ao surgimento dos mainframes -> PCs, estaçoes de trabalho Todos recursos do sistema ligados a apenas uma tarefa 3.3 – Sistemas Multiprogramáveis / Multitarefa Mais complexos e eficientes que os monoprogramáveis. Vários programas dividem os mesmos recursos. Sistema Operacional gerencia o acesso concorrente aos recursos e dispositivos. Aumento de produtividade Mais de um usuário pode interagir com o sistema. Sistemas Monousuários X Multiusuários Sistemas Batch X Tempo Compartilhado X Tempo Real 3.3.1 – Sistemas Batch (LOTE) Execução Sequencial. Os JOBS não exigem interação com o usuário, como compilação, sorts, backups. 3.3.2 – Sistemas de Tempo Compartilhado (Sistemas OnLine) Interação usuário – Vídeo, Teclado, Mouse, etc.. Usuário comunica direto com o Sistema Operacional. Cada usuário possue fatias de tempo dos recursos, aparentando estarem dedicados. 3.3.3 – Sistemas de Tempo Real Tempos de respostas devem estar dentro de limites rígidos. Recursos dedicado ao Programa de maior prioridade, controlado pela própria aplicação. 3.4 – Sistemas com Múltiplos Processadores Uma ou mais CPUs interligadas, trabalhando em conjunto. Fator Chave = Comunicação entre CPUs e grau de compartilhamento dos recursos. Sistemas Fortemente Acoplados X Fracamente Acoplados 3.5 – Sistemas Fortemente Acoplados Vários processadores compartilhando única memória e apenas um Sistema Operacional Vários programas podem ser executados ao mesmo tempo Um programa pode ser dividido em subprogramas. Ampliação da capacidade, adquirindo apenas novos processadores, menos custos. 3.5.1 – Sistemas Assimétricos Um processador primário responsável pelos demais e pelo Sistema Operacional Outros processadores são secundários e executam programas de usuários Se o processador primário falhar, o sistema para. O Sistema pode ser reconfigurado para outro processador assumir Utilização ineficiente do Hardware devido a assimetria dos processadores, que não realizam as mesmas funções. 3.5.2 – Sistemas Simmétricos Todos processadores têm as mesmas funções. Podem executar o Sistema Operacional Independentemente. Sistema Operacional e Hardware responsáveis pela distribuição dos recursos. Se o sistema falha, o sistema continua rodando. Mais poderosos que o s assimétricos, melhor balanceamento do processamento e das operações de I/O. Implementação bastante complexa. 3.5.3 - Multiprocessamento Uma tarefa pode ser dividida e executada, ao mesmo tempo, por mais de um processador. Processamento Vetorial o Permite manipulação de vetores inteiros o Exemplo “c = a + b” substitui ”para i=1 até 100 fazer c[i] = a[i] + b[i]” o Possui também um processador escalar o Identifica o tipo de instrução e envia ao processador adequado Processamento Paralelo o Aplicação pode ser executada por mais de um processador o A aplicação precisa ser dividida em partes independentes 3.6 – Sistemas Fracamente Acoplados Possui dois ou mais sistemas de computação interligados Cada nó possui seu sistema operacional gerenciando os recursos. 3.6.1 – Sistemas Operacionais de Rede Cada nó possui o seu próprio Sistema Operacional, podendo eles serem diferentes o conexão à outros nós o recursos de hardware compartilhados o total independência dos outros Caso algum nó caia, o sistema pode continuar rodando apesar de alguns recursos indisponíveis Exemplo : Local Area Network (LAN). 3.6.2 – Sistemas Operacionais Distribuídos Cada nó possui o Seu próprio Sistema Operacional que devem ser todos iguais. o Recursos de hardware o Possui um relacionamento mais forte entre seus componentes. Para o usuário é como se não existisse uma rede de computadores, mas apenas um único sistema centralizado. Vantagem da possibilidade do balanceamento da carga (processador mais ocioso é escolhido). Num Cluster, qualquer usuário conectado ao mesmo poderá Ter acesso aos dispositivos compartilhados, independente de que sistema ele está rodando a aplicação. Permite que a aplicação seja dividida em diferentes partes, podendo cada uma ser processada em um sistema independente (aplicação distribuída). Possui a vantagem da redundância, se ocorrer algum problema com algum componente outro assume o papel do defeituoso. Sistemas Multiprogramáveis 1. Introdução Possibilidade de periféricos e dispositivos funcionarem simultaneamente junto com a CPU permitiu execução de tarefas concorrentes. Sistemas Operacionais podem ser vistos como um conjunto de rotinas que executam concorrentemente de uma forma ordenada Sistemas multiprogramáveis X baixa utilização dos recursos do sistema. Uso Médio CPU – monoprogramáveis 30% X multiprogramáveis 90%. Vários programas podem estar residentes na memória, deixando-a menos ociosa Quando um programa perde o uso do processador, o estado do processamento deve ser armazenado para quando ele retornar para continuar executando a partir de onde parou. Compartilhamento de periféricos e recursos do sistema por vários usuários e programas. Maior compexibilidade do Sistema Operacional. 2. Interrupção e Exceção Interrupção X Exceção o Interrupção gerada por evento síncrono e Exceção gerada por evento assíncrono. o Evento síncrono – Resultado direto da execução do programa corrente e são previsíveis. o Evento assíncrono – Ocorre independentemente da execução do programa corrente e são imprevisíveis. Interrupções o Tornou possível a implementação da concorrência nos sistemas multiprogramáveis. o Eventos que causam intervenção no Sistema Operacional durante a execução de programas. o Gerados pelo próprio Sistema Operacional ou por Hardware. o O sistema é desviado para uma rotina especial de tratamento. o Vetor de Interrupção – Relação de todas as rotinas de tratamento das interrupções. o Mecanismo de Interrupção – Procedimento para detectar a interrupção, salvar o contexto do programa e desviar para a rotina de tratamento. Na maioria das vezes implementados pelos projetistas e realizados pelo harware. o Mascaráveis (podem ser desabilitadas) X Não-Mascaráveis (tratamento obrigatório). o As interrupções possuem prioridades de execução. o Controlador de pedidos de interrupção – avalia as interrupções geradas e suas prioridades de atendimento. Exceção o Resultado direto da execução de uma instrução do próprio programa (ex: divisão por zero, overflow). o Muitas vezes pode ser escrita pelo próprio programador, sendo possível evitar que um programa seja encerrado no caso de alguma exceção ocorrer. 3. Operações de Entrada/Saída Instruções de entrada/saída: o Primitivo. o Comunicação entre a CPU e os periféricos controladas por um conjunto de instruções especiais. o Limitava a comunicação do processador a um conjunto particular de dispositivos. controlador de interfaçe: o Mais atual o CPU interage independente dos dispositivos de E/S. o CPU não comunica diretamente com periféricos, mas atravéz de um controlador. o Controle de operações de E/S pelo processador o Controladapor programa: o CPU sincronizada com periférico no início daoperação o Sistema testa periférico esperando final da operação o Ocupa CPU até término da operação (busy wait) o Desperdício de CPU. o Por Polling o CPU liberada para outras tarefas. o Controlador testa final da operação a cada período de tempo (polling). o Permitiu o paralelismo e sistemas multiprogramáveis. o Mais eficiente DMA o Polling exigiu a implementação, por parte do controlador, da Direct Memory Access (DMA). o Transferir blocos de dados entre memória e periféricos, sem intervenção da CPU, a não ser no início e término da operação. o CPU interrompida só no início e final da Operação. o No momento da Transferência da DMA, CPU interrompe acesso ao bus. No IBM 7094: Extensão do conceito de DMA Canal de E/S – processador para executar programas de E/S. Controle total sobre operações de entrada e saída. Instruções E/S armazenadas na memória principal pela CPU CPU instrui canal para executar programa de canal. O canal avisa o término da operação. Um canal pode controlar múltiplos dispositivos através de diversos controladores. Um controlador pode manipular um dispositivo, ou um conjunto de dispositivos. Canal - ligação entre CPU e controlador. Processador de E/S: Evolução com memória própria. Sem necessidade de programas de E/S serem carregados na Memória Principal. Controle com mínima intervenção da CPU. 4. Buffering Utilização de uma área da memória para transferência de dados entre periféricos e memória principal denomidada buffer. Os dado são transferidos para o buffer. O dispositivo pode iniciar nova leitura enquanto a CPU manipula os dados do buffer. O mesmo pode ser aplicado para operações de gravação. Minimiza o problema da disparidade da velocidade de processamento e dispositivos de E/S Objetiva manter CPU e dispositivos de E/S ocupados na maior parte do tempo. O buffer possui uma fila FIFO podendo conter vários registros (unidade de transferência usada no mecanismo de buffering). 5. Spooling (simultaneous pefipheral operation on-line) Surgiu no final dos anos 50. Base dos Sistemas Batch Antes, as Operações I/O eram lentas, deixando a CPU ociosa. No spooling vários programas (JOBS) eram armazenados em uma fita magnética, então eram enviados para processamento. Diminuição do tempo de execução dos jobs e transição entre eles. Da mesma forma um job poderia direcionar as saídas para impressora para outra fita. Sistemas estritamente sequenciais devido as fitas magnéticas. Mais eficiência com o surgimento de dispositivos de acesso direto, como discos e atribuição de prioridades aos jobs. 6. Reentrância Diversos usuários podem estar rodando o mesmo utilitário (compartilhado) simultaneamente. Não precisa ter mais de uma cópia do mesmo utilitário na memória Exige que o código reentrante não possa ser modificado por nenhum usuário enquanto está sendo executado. Diversos usuários podem acessar partes diferentes do código manipulando seus próprios dados Exemplo: Editores de texto, compiladores, linkers. 7. Proteção do Sistema Garantia de proteção de recursos compartilhados, como memória, dispositivos de E/S e CPU Na memória, cada usuário deve possuir uma área de dados e códigos armazenados de forma que outros não interfiram nessas informações. Numa impressão, não deve ser possível a utilização até que a impressão corrente termine. O Sistema Operacional deve implementar esses mecanismos (modos de acesso). Sistemas Operacionais Capítulo 5 Estrutura do Sistema Operacional 5.1 – Introdução Kernel -> conjunto de rotinas que oferecem serviços aos usuários do sistema e suas aplicações, bem como a outras rotinas do próprio sistema. o Principais rotinas: o tratamento de interrupções; o criação e eliminação de processos; o sincronização e comunicação entre processos; o escalonamento e controle dos processos; o gerência da memória; o gerência do sistema de arquivos; o operações de entrada e saída; o contabilização e segurança do sisteama. 5.2 – System Calls (chamadas ao sistema) Comunicação do usuário ou aplicação com o núcleo do sistema operacional. Para cada serviço existe uma system call. System call X modularização. Grupos de funções: o Gerência de processos: Criação e eliminação de processos; Alteração das características do processo; Sincronização e comunicação entre processos. o Gerência de memória: Alocação e desalocação de memória o Gerência de entrada e saída: Operações de entrada/saída; Manipulação de Arquivos. 5.3 – Modos de Acesso Restrição quanto à utilização de algumas funções do sistema Instruções privilegiadas o oferecem perigo ao sistema) o funcionam no modo kernel o acesso ao conjunto total de instruções do processador Instruções não privilegiadas o não oferecem perigo ao sistema o funcionam no modo usuário o acesso à um número reduzido de instruções A system call altera o modo de acesso do processador para o modo kernel Quando uma aplicação necessita de um serviço de risco a um sistema, chama uma system call. 5.4 – Sistemas Monolíticos Mais comum de ser encontrada Rotinas interagem livremente umas com as outras 5.5 – Sistema em Camadas Sistema operacional dividido entre camadas sobrepostas Cada módulo possui um conjunto de funções que podem ser utilizadas por outro módulo Módulos de uma camada podem apenas fazer referência a módulos das camadas inferiores Camadas internas tem mais privilégios que as camadas externas 5.6 – Sistema Cliente-Servidor Tendência de tornar o núcleo menor e mais simples possível. Sistema dividido em processos, cada qual responsável por um conjunto de serviços Núcleo é responsável pela comunicação entre clientes e servidores Apenas núcleo executa no modo kernel Caso um servidor dê problemas, não compromete o funcionamento do resto do sistema Mais fácil manutenção do Sistema Operacional Permite que um cliente solicite um serviço e a resposta seja processada remotamente Na prática, implementação muito difícil e combinada com o sistema em camadas. Sistemas Operacionais Capítulo 6 Processo 6.1 – Introdução De forma simples, o processo é um programa em execução. Extensão do conceito: Estrutura responsável pela manutenção de todas as informações necessárias à execução de um programa, como conteúdo de registradores e espaço na memória 6.2 – Modelo de Processo Processo = ambiente onde se executa um programa Um mesmo programa pode produzir resultados diferentes, dependendo do processo no qual ele é executado. Bloco de controle do processo (Process Control Block – PCB) – Estrutura onde o SO guarda todas as informações do processo, contendo sua identificação, prioridade, estado corrente, recursos alocados por ele e informações sobre o programa em execução O Sistema Operacional gerencia os processos através de System Calls. Processo : contexto de hardware, software e espaço de endereçamento. 6.2.1 – Contexto de Hardware Constitui-se do conteúdo de registradores A troca de um processo por outro na CPU, pelo sistema operacional, é denominada mudança de contexto. Mudança de Contexto - salva o conteúdo dos registradores da CPU e carregá-los com os valores referente ao do processo que está ganhando a utilização do processador. 6.2.2 – Contexto de Software Características do processo incluídas na execução de um programa, divididasem: o Identificação – Principalmente número (PID) de identificação e identificação do processo ou usuário (UID) que o criou. o Quotas – Limites de cada recurso do sistema que um processo pode alocar o Privilégios – o que o processo pode ou não fazer em relação ao sistema e aos outros processos. 6.2.3 – Espaço de Endereçamento Área da memória do processo onde o programa será executado e para dados utilizados por ele. Deve ser protegido do espaço de endereçamento dos demais processos 6.3 – Estado do Processo Em sistemas Multitarefas o processo não é executado todo o tempo pelo processador 3 tipos de estados: o Execução (running) – O processo está sendo executado pela CPU. o Pronto (ready) – O processo está pronto e esperando para ser executado pela CPU. o Espera (wait) – O processo está esperando algum evento externo ou por algum recurso para poder prosseguir seu processamento. Bloqueado – O processo está esperando por algum recurso do sistema que não se encontra disponível. 6.4 – Mudança de Estado do Processo Mudança de estado por eventos do próprio processo (eventos voluntários) ou causados pelo sistema operacional (eventos involuntários). Dividido em 4 mudanças: o Pronto -> Execução = Quando um processo é criado, é colocado em uma lista de processos no estado pronto. Então é escolhido pelo sistema para ser executado. o Execução -> Espera = O processo passa para espera quando aguarda a conclusão de um evento solicitado. o Espera -> Pronto = O processo passa para pronto quando a operação solicitada é atendida ou o recurso esperado é concedido. o Execução -> Pronto = O processo passa de execução para pronto por eventos gerados pelo sistema. 6.5 – Subprocesso e Thread Subprocesso ou processo filho o processos criados por um outro processo, de maneira hierárquica. o O subprocessos são eliminados quando o processo pai deixa de existir. o Permite dividir a aplicação para trabalhar de forma concorrente. o Cada processo e subprocesso possui seu ambiente e recursos alocados. Thread ou Linha de Controle o No ambiente multthread cada processo pode responder a várias solicitações concorrentes ou mesmo simultaneamente, se houver mais de um processador. o Threads compartilham o processador da mesma forma que um processo. o Cada Thread possui seu próprio conjunto de registradores, porém compartilha o mesmo espaço de endereçamento com as demais threads do processo. o Uma Thread pode alterar os dados de outra Thread. 6.6 – Processos do Sistema Grande parte do núcleo do sistema é executada no contexto de processos, inclusive no contexto de processos de usuários, como: o auditoria e segurança: o serviços de rede; o contabilização do uso de recursos; o contabilização de erros; o gerência de impressão; o gerência de jobs batch; o temporização; o comunicação de eventos; o inteface de comando (shell). 6.7 – Tipos de processos CPU-bound (Ligado à CPU) o O processo passa a maior parte do tempo no estado de execução. o Realiza poucas operações de I/O o Encontrado em aplicações que efetuam muitos cálculos. I/O-bound (Ligado à E/S) o O processo passa a maior parte do tempo no estado de espera o Encontrado em aplicações comerciais com bastante leitura, processamento e gravação. o Encontrado também em aplicações interativas. Sistemas Operacionais Capítulo 7 Comunicação entre Processo 7.1 – Introdução Compartilhamento de recursos entre processos pode gerar situações indesejáveis Mecanismos de sincronização – garantem a comunicação entre processos concorrentes e o acesso a recursos compartilhados 7.2 – Especificação de Concorrência em Programas Primeira notação para especificação da concorrência: FORK e JOIN o FORK – Inicia a execução de outro programa concorrentemente o JOIN – O programa chamador espera o outro programa terminar para continuar o processamento Implementação mais simples: PARBEGIN e PAREND o PARBEGIN – Inicia lista de programas que serão executados paralela e aleatoriamente. o PAREND – Especifica o ponto de sincronização. 7.3 – Problemas de Compartilhamento de Recursos Mecanismos de controle devem existir para evitar problemas Exemplos: o Atualização de arquivos compartilhados ao mesmo tempo o Cálculos com mesmas variáveis ao mesmo tempo. 7.4 – Solução para os Problemas de Compartilhamento Exclusão Múltua (solução mais simples): impedir que dois ou mais processos acessem um mesmo recurso no mesmo instante, um deve esperar que o outro termine para utilizar. Região crítica: parte do código onde é feito o acesso ao recurso compartilhado. Usualmente utiliza-se de um protocolo ao entrar em uma região crítica e ao sair dela. 7.5 – Problemas de Sincronização Problemas introduzidos pela exclusão múltua. Velocidade de Execução dos Processos: o Processos com diferenças de velocidade ou maior tempo de processamento Starvation: o Situação em que um processo nunca consegue executar sua região crítica e acessar o recurso compartilhado. o Ocorre quando dois ou mais processos esperam por um mesmo recurso alocado. Caso o sistema escolha o processo aleatoriamente quando o recurso é liberado, um processo pode nunca ser escolhido o Quando um processo tem baixa prioridade também pode nunca ser escolhido. o Filas FIFO eliminam esse problema. Sincronização Condicional: o Quando um recurso não se encontra pronto para ser utilizado pelos processos, o processo deve ser colocado no estado de espera, até a liberação do recurso. o Problema de processo produtor/consumidor: exemplo, quando um processo tenta gravar num buffer e outro tenta ler. Um processo não poderia ler de um buffer cheio nem tentar ler de um buffer vazio. 7.6 – Soluções de Hardware Desabilitação de Interrupções: o Desabilitar interrupções externas ao entrar numa região critica e habilitar ao sair. o Se o processo não habilitar as interrupções ao sair da região crítica, o sistema pode estar comprometido. Instrução Test-and-set: o Instrução especial que permite ler uma variável, armazenar seu conteúdo em uma outra área e atribuir um novo valor a essa variável. o Executa sem interrupção o É uma instrução invisível o Assim, dois processos não podem manipular uma variável compartilhada ao mesmo tempo (exclusão múltua). 7.7 – Solução de Software Fatores para a solução de problemas de sincronização: o O número de processadores e o tempo de execução dos processos concorrentes devem ser irrelevantes; o Um processo, fora de sua região crítica, não pode impedir que outros processos entrem em suas próprias regiões críticas; o Um processo não pode permanecer indefinidamente esperando para entrar em sua região crítica. 7.7.1 – Semáfaros Solução mais geral e simples de ser implementada. Variável inteira, não negativa, que só pode ser manipulada por duas instruções: DOWN e UP. Mutexes (mutual exclusion semaphores): o Semáfaros aplicados ao problema da exclusão múltua o Na exclusão múltua, as instruções DOWN e UP funcionam como protocolos de entrada e saída. Valor > 0, recurso liberado, Valor = 0, processo impedido do acesso. o Processo entra na região crítica executa DOWN, impedindo outros processos do acesso. o Processo sai da região crítica executa UP, liberando o acesso para outros processos. o Normalmente, UP e DOWN são System Calls. Semáfaros aplicados ao problema de sincronização condicional: o Em geral, se existe um processo que deve ser notificado sobre a ocorrência de um evento e um outro capaz de detectar sua ocorrência, pode-se utilizarum semáfaro acossiado ao evento esperado para sincronizar ambos os processos o Semáfaros contadores: úteis quando aplicados na alocação de recursos do mesmo tipo (pool). 7.7.2 – Monitores Mecanismos de sincronização de alto nível que tentam tornar mais fácil o desenvolvimento e correção de programas concorrentes. Conjunto de procedimentos, variáveis e estrutura de dados definidos dentro de um módulo. Somente um processo pode estar executando um dos procedimentos do monitor em um determinado instante. Implementação da exclusão mútua nos monitores é realizada pelo compilador. WAIT – Faz um processo entrar em estado de espera quando uma variável de condição (estrutura de dados tipo fila) está impedindo a liberação para outros processo. SIGNAL – Liberação do recurso pelo processo que o alocou. 7.7.3 – Troca de Mensagens Mecanismo de comunicação e sincronização entre processos. SEND – Envia uma mensagem a um processo receptor o SEND (Receptor, Mensagem) RECEIVE – Recebe uma mensagem de um processo transmissor o RECEIVE (Emissor, Mensagem) Não ocorre exclusão multua. Uma mensagem só pode ser lida apos Ter sido enviada. Pode ocorrer perda de mensagens ACK (acknowledgement) – enviada pelo processo receptor para informar o recebimento da mensagem. Se o emissor não receber um ACK em determinado tempo, reenvia a mensagem. Endereçamento direto – só permite a comunicação entre dois processos. Endereçamento indireto – utiliza uma área compartilhada (buffer conhecido como mailbox) onde as mensagens podem ser colocadas pelo emissor e retiradas pelo receptor Comunicação síncrona (rendezvous): o Um processo envia uma mensagem e fica esperando até que o receptor leia a mensagem o Um receptor tenta receber uma mensagem e fica esperando até que o processo transmissor grave alguma mensagem. o Dispensa necessidade de buffers. o A necessidade de espera reduz o grau de concorrência. Comunicação assíncrona: o O transmissor não aguarda o recebimento da mensagem. o O receptor não aguarda o envio de uma mensagem. o Necessita de buffers o Maior paralelismo na execução dos processos em relação a síncrona. 7.8 – Deadlock Um processo espera por um evento que nunca ocorrerá. Conseqüência, em geral, do compartilhamento de recursos do sistema entre vários processos de forma exclusiva. Espera circular – quando, por exemplo, um processo A, utilizando um recurso P, necessita de um recurso Q, alocado pelo processo B, para continuar o processamento e o processo B necessita do recurso P para continuar o processamento. Deadlocks ocorrem quando 4 condições são verdadeiras: 1. Exclusão mútua - Cada recurso só pode estar alocado a um único processo em um determinado instante. 2. Um processo, além dos recursos já alocados, pode estar esperando por outros recursos. 3. Não-preempsão – Um recurso não pode ser liberado de um processo só porque outros processos desejam o mesmo recurso. 4. Espera circular – Um processo pode Ter de esperar por um recurso alocado a outro processo e vice-versa. 7.8.1 – Prevenção de Deadlock Garantir que uma das quatros condições nunca se satisfaçam 1a condição: o A ausência da exclusão múltua acaba com o problema. o Pode causar sérios problemas de consistência. 2a condição: o Alocar todos os recursos necessários para a execução, antes de se executar, caso não disponíveis, fica em espera. o Pode ocorrer starvation, pois seus recursos podem nunca estarem liberados todos ao mesmo tempo o Dificuldade de se determinar o número de recursos que um processo deverá alocar antes de sua execução. o Algum recurso pode demorar a ser liberado. 3a condição: o Evitada quando permitimos que um recurso seja retirado de um processo, no caso de outro processo necessitar do mesmo. o Pode perder o processamento feito até o momento. o Pode ocorrer starvation, quando o processo garante alguns recursos e o sistema os libera em seguida. 4a condição: o Forçar ao processo Ter apenas um recurso de cada vez, se precisar de outro recurso, deve liberar o primeiro. 7.8.2 – Detecção do Deadlock Mecanismo que determina a existência de deadlock, permitindo identificar os recursos e processos envolvidos no sistema Existe uma estrutura de dados capaz de identificar cada recurso do sistema. Geralmente os algoritmos verificam a existência de espera circular, percorrendo toda a estrutura quando um processo solicita um recurso que não pode ser imediatamente garantindo. 7.8.3 – Correção do Deadlock Eliminar um ou mais processos envolvidos no deadlock e desalocar os recursos já garantidos por eles, eliminando a espera circular. A escolha dos processos é normalmente feita aleatoriamente ou com base em prioridades. Pode gerar um elevado overhead ao sistema. Rollback : o liberação de apenas uns recursos alocados até o ciclo de espera terminar o o processo retorna seu processamento quando o recurso é devolvido. o Difícil de ser implementado devido ser bastante dependente da aplicação. Sistemas Operacionais Capítulo 8 Gerência do Processador (Escalonamento de Processos) 8.1 – Introdução Compartilhamento da CPU em sistemas multiprogramáveis. Critérios de escolha da ordem dos processo a entrar em execução. Scheduler (escalonador): o Uma das principais funções do Sistema Operacional o Parte do código do Sistema Operacional responsável pelo scheduling (escalonamento). Funções do escalonamento: o Manter a CPU ocupada a maior parte do tempo. o Balancear a utilização do processador entre diversos processos. o Maximizar o throughput do sistema o Oferecer tempos de respostas razoáveis para os usuários interativos. o Evitar starvation. 8.2 – Critérios de Escalonamento Utilização da CPU o Em geral, é desejável que o processador permaneça a maior parte do tempo ocupado Throughput o Número de processos executados em um determinado intervalo de tempo. o Em geral, a maximização do throughput é desejada. Tempo de turnaroud o Tempo que um processo leva desde sua admissão no sistema até seu término. o Considera tempo de espera para alocação de memória, espera na fila de processos prontos, processamento e operações de entrada e saída. o Em geral, a minimização do tempo de turnaround é desejada. Tempo de resposta o Tempo decorrido do momento da submissão de um pedido ao sistema até a primeira resposta produzida. o Em geral, a minimização do tempo de resposta é desejada. 8.3 – Escalonamento Não-preemptivo Existente nos primeiros sistemas multiprogramáveis, onde predominava o processamento batch. Quando um processo (JOB) ganha o direito de utilizar a CPU, nenhum outro processo pode lhe tirar esse recurso 8.3.1 – Escalonamento First-In-First-Out (FIFO) O processo que chegar primeiro, é o primeiro a ser selecionado para a execução. Necessário apenas uma fila de processos prontos, esperando pelo uso do processador. O processo utiliza a CPU sem ser interrompido. Problemas: o Impossibilidade de prever quando um processo entrará em execução. o Possibilidade de processos CPU-bound de menor importância prejudicarem processos de I/O-bound mais proprietários. 8.3.2 – Escalonamento Shortest-Job-First (SJF) Associa cada processo (JOB) ao seu tempo de execução. Quando o processador está livre, o processamento que ocupar menos tempo da CPU para terminar seu processamento é selecionado. Favorece os programas menores. Reduz o tempomédio de espera em relação ao FIFO. Problemas: o Determinar, exatamente, quanto tempo de CPU o processo vai utilizar para terminarseu processamento. 8.3.3 – Escalonamento Cooperativo O processo está em execução libera voluntariamente o processador, retornando para a fila de pronto, cooperando com os outros processos. Permite uma melhor distribuição do processador entre os processos. Não existe intervenção do Sistema Operacional na execução do processo. Exemplos: Microsoft Windows 3.1 e 3.11 Problemas: o Um programa mal escrito pode entrar em looping, monopolizando a CPU. 8.4. Escalonamento Preemptivo O Sistema pode interromper um processo em execução para que outro processo utilize o processador. Permite que o sistema dê atenção imediata a processos mais prioritários, como no caso de sistemas em tempo real. Proporciona melhores tempos de resposta em sistemas de tempo compartilhado Compartilhamento do processador de uma maneira mais uniforme entre os processos. A troca de um processo pelo outro na CPU (mudança de contexto), causado pela preempção, gera um overhead no sistema. Critérios de preempção devem ser definidos para o overhead não se tornar crítico. 8.4.1 – Escalonamento Circular (round robin) ou preempção por tempo Implementado por um algoritmo semelhante ao FIFO, porém, quando um processo passa para o estado de execução, existe um tempo-limite (quantum ou time-slice) para sua utilização de forma contínua. Se o processo não terminou a execução, volta ao estado de pronto. Em geral, o valor do quantum de tempo está entre 100 e 300 ms. Nenhum processo poderá monopolizar a CPU. Algoritmo bastante adequado para sistemas multiusuários de tempo compartilhado. No caso, o processo CPU-bound tem mais chances de ser executado do que o processo IO-bound 8.4.2 – Escalonamento por Prioridades ou preempção por prioridade Processos possuem diferentes prioridades de execução. Processos de maior prioridade são escalonados preferencialmente. Algoritmo Implementado mediante um clock, que interrompe o processador em determinados intervalos de tempo, reavaliando prioridades e, possivelmente, escalonando outro processo. Todos os sistemas de tempo compartilhado implementam algum tipo de prioridade, sendo esta uma característica do contexto de software. Prioridade estática: o Não é modificada durante a existência do processo. o De simples de implementação. o Pode ocasionar tempos de resposta elevados. Prioridade dinâmcia: o Pode ser modificada durante a execução do processo. o O processo recebe um acréscimo à sua prioridade ao sair do estado de espera. o Processos I/O-bounds terão mais chances de serem escalonados, compensando o tempo que passam no estado de espera. o Os processos CPU-bounds podem ser executados enquanto os processos CPU-bounds esperam por algum evento. O tempo de resposta compensa o maior overhead e complexidade algorítmica. 8.4.3 – Escalonamento por Múltiplas filas Implementa diversas filas de processos no estado pronto, onde cada processo é associado exclusivamente a uma delas. Cada fila possui um mecanismo próprio de escalonamento, em função das características dos processos. Cada fila possui uma prioridade associada. O sistema só pode escalonar processos de uma fila, se todas as outras de prioridade maior estiverem vazias. 8.4.4 – Escalonamento por Múltiplas Filas com Realimentação Também Implementa diversas filas onde cada uma tem uma prioridade de execução associada, porém, os processos não permanecem em uma mesma fila até o término do processamento. O sistema identifica dinamicamente o comportamento de cada processo, ajustando assim suas prioridades de execução e mecanismos de escalonamento. Os processos não são previamente associados às filas de pronto, e sim direcionados pelo sistema entre as diversas filas com base em seu comportamento. Execução: o Processo criado entra no final da fila de mais alta prioridade. o Cada fila implementa o mecanismo de FIFO para escalonamento. o Quando o processo em execução deixa a CPU por preempção por prioridade ou por solicitação a um recurso do sistema ele é reescalonado para dentro da mesma fila. o Caso o processo esgote seu quantum de tempo, ele é redirecionado para um a fila de menor prioridade (preempção por tempo), e assim por diante. o A fila de mais baixa prioridade implementa o mecanismo de escalonamento circular. o O quantum em cada fila varia em função da sua prioridade. Quanto maior a prioridade, menor seu quantum de tempo. Atende as necessidades dos diversos tipos de processos. Pode ser implementado em qualquer tipo de Sistema Operacional. Pode gerar um grande overhead no sistema, ainda assim, pode justificar sua implementação. 8.4.5 – Escalonamento de Sistemas de Tempo Real Fator de tempo crítico, pequeno tempo de resposta obrigatório. Escalonamento feito unicamente com base no esquema de prioridades estáticas. Quanto maior a importância de uma tarefa, maior sua prioridade de execução em relação às demais. 8.5 – Escalonamento com Múltiplos Processadores Escalonamento bem mais complexo do que com um único processador. Sistemas Fracamente Acoplados: o cada processador faz seu processamento local. Sistemas Fortemente Acoplados o Possível implementar uma única fila de pronto para todos os processadores. o Importante a implementação da exclusão mútua. o Não pode haver a possibilidade de um mesmo processo ser escalonado por dois processadores diferentes. Sistemas Operacionais Capítulo 9 Gerência de Memória 9 – Gerência de Memória 9.1 – Introdução Na memória principal residem os programas em execução. Memória secundária são mecanismos de armazenamento permanente, são mais abundantes e baratas. Para um programa ser executado deve ser carregado na memória principal. Gerenciamento complexo em sistemas multiprogramáveis com múltiplos usuários utilizando-a eficientemente. 9.2 – Alocação Contígua Simples Implementada nos primeiros Sistemas Operacionais e ainda existentes em alguns sistemas monoprogramáveis. Memória dividida em duas partes, Sistema Operacional e programa do usuário. O programador tem controle sobre toda a memória principal, podendo acessar qualquer posição da memória, inclusive onde está residente o Sistema Operacional. Um mecanismo de proteção utilizado é delimitar a área do Sistema Operacional que delimita a área do mesmo. Fácil implementação e código reduzido, porém Ineficiência no uso do processador e da memória pois apenas um usuário pode dispor desse recurso. Programas limitados ao tamanho da memória disponível. Overlay (sobreposição) – Solução encontrada para dividir o programa em partes (módulos), de forma que pudessem executar independentemente uma da outra, utilizando uma mesma área de memória. A definição das áreas de Overlay são de responsabilidade do programador através de comandos específicos da linguagem utilizada. 9.3 – Alocação Particionada A eficiência da multiprogramação exige que vários programas estejam na memória ao mesmo tempo, vindo a necessidade de organização da memória. 9.3.1 – Alocação Particionada Estática: Divisão da memória em tamanhos fixos (partições) definidos na inicialização do Sistema em função dos programas que executariam no ambiente. A alteração do tamanho de uma partição necessita a inicialização do Sistema Operacional. Os programas só podiam executar em uma das partições, mesmo com outras disponíveis. Limitações impostas pelos compiladores e montadores que geravam apenas códigos absolutos. Posteriormente, evolução dos compiladores, linkers e loaders com geração de código realocável, sendo que osprogramas puderam ser carregados em qualquer partição (alocação particionada estática realocável). Surgimento da tabela de partições com informações de tamanho, uso e delimitações. Proteção da memória através de dois registradores, início e fim da partição. Os programas não preenchiam totalmente as partições onde eram carregados. Problemas de fragmentação. 9.3.2 – Alocação Particionada Dinâmica Aumento do grau de compartilhamento diminuindo o problema da fragmentação. Partições sem tamanho fixo, onde cada programa utiliza o espaço que necessita. Existe ainda o problema de fragmentação, conforme os programas vão terminando e deixando espaços cada vez menores. Soluções para resolver o problema de fragmentação: o Primeira – Reunir os espaços adjacentes, produzindo um único espaço de tamanho maior. o Segunda – Realocação de todas as partições ocupadas, eliminando todos os espaços entre elas (alocação dinâmica com realocação), porém, aumentando a complexibilidade do algoritmo e consumindo mais recursos do sistema. 9.3.3 – Estratégias para Escolha da Partição Função para determinar em qual partição livre um programa será carregado para execução. Função de evitar, ou diminuir, o problema da fragmentação antes que ele ocorra. O tamanho do programa é o fator mais importante para a adoção da melhor estratégia. Best-fit: o Escolhe a melhor partição, ou seja, aquela que o programa deixa o menor espaço sem utilização. o Lista de áreas livres alocada por tamanho, diminuindo o tempo de busca o Desvantagem de deixar pequenas áreas não contíguas, aumentando o problema da fragmentação. Worst-fit: o Escolhe a pior partição, ou seja, aquela que o programa deixa o maior espaço sem utilização. o Diminui o problema de fragmentação, deixando espaços livres maiores que permitem a um maior número de programas utilizar a memória. First-fit: o Escolhe a primeira partição livre de tamanho suficiente para carregar o programa o Lista de áreas livres ordenada por endereços crescentemente. o Grande chance de se obter uma grande partição livre nos endereços de memórias mais altos. o Mais rápida e consome menos recursos do sistema. 9.4 – Swapping Tenta resolver o problema de insuficiência da memória para todos os usuários. Aloca espaço para programas que esperam por memória livre para serem processados. O sistema escolhe um programa residente, que é levado da memória para o disco (swap out), retornando posteriormente para a memória principal (swap in) como se nada tivesse ocorrido. Problema da realocação dos programas. O loader realocável permite que um programa seja colocado em qualquer posição da memória, porém a realocação é realizada no momento do carregamento. Mecanismo ineficiente em função do tempo gasto para carregamento. Uma alternativa é esperar que a região de memória usada pelo programa na ocasião do seu primeiro carregamento esteja disponível. Realocação Dinâmica: o É a melhor solução, uma implementação no hardware dos computadores, permitindo que a realocação seja realizada durante a execução do programa. o Realizada através de um registrador especial denomidado registrador de alocação, que recebe o endereço inicial da região da memória que o programa irá ocupar no momento do carregamento do programa na memória. o Toda vez que ocorrer uma referência a algum endereço, o endereço contido na instrução será somado ao conteúdo do registrador, gerando assim, o endereço físico. Essencial para a implementação de um sistema multiprogramável. Permitiu um maior throughput através de um maior compartilhamento da memória. Mais eficiente para programas onde existiam poucos usuários competindo por memória e em ambientes que trabalhavam com aplicações pequenas. Seu maior problema é o elevado custo das operações de entrada/saída (swapped in/out). 9.5 – Memória Virtual Combina memória principal e secundária; Impressão da memória ser muito maior do que é; Desvinculação do endereçamento feito pelo programa dos endereços físicos da memória principal; Procura minimizar o problema de fragmentação da memória. 9.4.1 – Espaço de Endereçamento Virtual Conceito próximo a vetores em linguagens de alto nível; Referência a um componente do vetor sem preocupação com a posição da memória onde o dado está; Programa no ambiente de memória virtual não faz referência a endereços físicos de memória (endereços reais), mas apenas a endereços virtuais; Mapeamento – é a tradução do endereço virtual para o físico; Espaço de endereçamento virtual – é o conjunto de endereços virtuais que os processos podem endereçar. Espaço de endereçamento real – é o conjunto de endereços reais. Apenas parte do programa pode estar residente na memória em um determinado instante; O Sistema Operacional utiliza a memória secundária como uma extensão da memória principal. 9.5.2 – Mapeamento Mecanismo que transforma os endereços virtuais em endereços reais; Todo programa precisa estar no espaços de endereçamento real para poder ser referenciado ou executado; Atualmente, o mapeamento é realizado via hardware junto com o Sistema Operacional, de forma a não comprometer seu desempenho e torná-lo transparente aos usuários e suas aplicações; A maioria das aplicações tende a fazer referência a um reduzido número de páginas, logo, somente uma pequena fração da tabela de páginas é necessária. Memória associativa ou Translation Lookside Buffer – Hardware especial para mapear endereços virtuais para endereços físicos sem a necessidade de acesso à tabelas de páginas; Quando um programa está em execução, existe uma tabela de mapeamento do processo no qual o programa executa. Se outro programa for executado no contexto de outro processo, o sistema deve passar a referenciar a tabela do novo processo. Toda vez que há mudança de contexto, o registrador é atualizado com o endereço da nova tabela. 9.5.3 – Paginação Técnica de gerência de memória onde o espaço de endereçamento virtual e o espaço de endereçamento real são divididos em blocos do mesmo tamanho (páginas); Páginas virtuais no espaço virtual e páginas reais ou frames (molduras) no espaço real; Todo mapeamento é realizado a nível de página, através de tabelas de páginas, em que cada página virtual do processo possui uma entrada na tabela ETP; Paginação por demanda é quando as páginas dos processos são transferidas da memória secundária para a principal apenas quando são referenciadas. Paginação Antecipada é o carregamento de páginas na memória antecipadamente, sendo que o sistema tenta prever as páginas que serão necessárias à execução do programa. ALGORÍTMO DA PAGINAÇÃO. 9.5.3.1 – Working Set Problemas: o Paginação exigem operações de E/S (que deve ser evitado) quando um processo faz referência a uma página que não se encontra na memória; o O Sistema Operacional deve se preocupar em ter um certo número de páginas na memória que reduza ao máximo a taxa de paginação dos processos e não prejudique os demais processos que desejam acesso a memória. Observações: o Quando um programa começa a ser executado, percebe-se uma elevada taxa de page faults (páginas que não se encontram na memória), que se estabiliza com o decorrer de sua execução. o Localidade é a tendência que existe em um programa de fazer referências a posições de memória de forma quase uniforme, ou seja, instruções próximas. o A partir da observação da localidade Denning formulou o modelo de working set. Working Set de um processo é o conjunto de páginas referenciadaspor ele durante determinado intervalo de tempo, ou, segundo Denning, é o conjunto de páginas constantemente referenciadas pelo processo, devendo permanecer na memória principal para que execute de forma eficiente, evitando a elevada taxa de paginação (thrashing). Sempre que um processo é criado, todas as suas páginas estão na memória secundária. O Working Set deve Ter um limite máximo de páginas permitidas. 9.5.3.2 – Realocação de Páginas Problema em decidir quais páginas remover da memória principal. O Sistema Operacional deve considerar se uma página foi ou não modificada antes de liberá-la para outro processo, caso contrário, possíveis dados armazenados na página serão perdidos. Sempre que uma página é alterada, um bit de modificação é alterado de 0 para 1, informando que a página foi alterada. Melhor estratégia de realocação é escolher uma página que não será referenciada num futuro próximo. Tarefa difícil para o Sistema Operacional. Principais estratégias usadas pelos sistemas operacionais para realocação de páginas: o Aleatória (random): Não utiliza nenhum critério de seleção. Consome menos recursos do sistema. Raramente é utilizada. o First-In-First-Out (FIFO): A página que primeiro foi utilizada será a primeira a ser escolhida. Implementação bastante simples. Necessário apenas uma fila. o Least-Recently-Used (LRU): Seleciona a página utilizada menos recentemente, ou seja, a que está há mais tempo sem ser referenciada. Estratégia boa, mas pouco implementada; Grande overhead causado pela atualização, em cada página referenciada, do momento do último acesso, além do algoritmo de busca dessas páginas. o Not-Recently-Used (NRU): Escolha da página que não foi recentemente utilizada (semelhante ao LRU). Flag de referência – indica quando a página foi referenciada ou não. Inicialmente, todas as páginas estão com o flag = 0, à medida que as páginas são referenciadas, o flag é modificado para 1. o Last-Frequently-Used (LFU): Escolhe a página menos referenciada. Existe um controle do número de referências feitas às páginas. É escolhida a página que o contador tem o menor número de referências. Problema – As páginas que entrarem mais recentemente no working set serão as que estarão com o menor número no contador. 9.5.3.3 – Tamanho da Página Paginação leva a uma menor fragmentação, pois apenas poderá haver fragmentação na última página. A fragmentação é conseqüência do tamanho da página. Páginas pequenas, tabelas de mapeamento maiores, maior taxa de paginação e aumento do número de acesso à memória secundária, porém, menor fragmentação. Tamanho da página associado ao hardware e varia de sistema para sistema, norlamente entre 512 bytes e 64 kb. 9.5.4 – Segmentação Técnica de gerência de memória, onde os programas são divididos logicamente e em sub-rotinas e estruturas de dados e colocados em blocos de informações na memória Segmentos – blocos de tamanhos diferentes com seu próprio espaço de endereçamento. Segmentação X Paginação – Paginação com partes de tamanho fixo e segmentos com blocos de tamanhos variados e permite uma relação entre a lógica do programa e sua divisão na memória. Cada entrada na tabela de segmentos possuí o endereço do segmento na memória física, informações sobre o tamanho do segmento, sua proteção e se ele está na memória ou não. O Sistema Operacional mantém uma tabela com as áreas livres e ocupadas da memória. A escolha da área livre a ser ocupada por um processo a ser carregado na memória pode ser a mesma utilizada no item Alocação Particionada Dinâmica (best-fit, worst-fit ou first-fit). Apenas os segmentos referenciados são transferidos para a memória real. Os programas devem ser bem modularizados para uma maior eficiência. Existe também o problema da fragmentação e o problema da complexibilidade. 9.5.5 – Segmentação com Paginação Permite a divisão lógica dos programas e segmentos e, cada segmento é dividido fisicamente em páginas. Um endereço é formado pelo número do segmento, pelo número de página, contida nesse segmento, e pelo deslocamento dentro dessa página. O endereço físico é obtido somando-se a posição inicial do frame e o deslocamento. 9.5.6 – Proteção Necessária para impedir que um processo, ao acessar uma página/segmento do sistema, a modifique ou mesmo tenha acesso a ela. No esquema de memória virtual, cada processo tem sua própria tabela de mapeamento e a tradução dos endereços é realizada pelo sistema, impedindo assim, que um processo tenha acesso a áreas de memória de outros processos, a não ser que tenham compartilhamento explícito. A proteção deve ser realizada em nível de cada página/segmento na memória, utilizando-se as entradas da tabela de mapeamento, com alguns bits especificando permissões a cada uma das páginas/segmentos. 9.5.7 – Compartilhamento de Memória Bastante útil para programas de código reentrante. Bastante simples implementação do compartilhamento de código e dados entre vários processos, bastando que as entradas das tabelas de páginas/segmentos apontem para as mesmas páginas/segmentos na memória principal. Reduz o número de programas na memória principal e aumenta o número de usuários compartilhando o mesmo recurso. Segmentação X Paginação em relação ao compartilhamento: o O compartilhamento de segmentos é mais simples que o de páginas, pois as tabelas de segmentos mapeiam estruturas lógicas, como sub- rotinas e estruturas de dados. o Enquanto o mapeamento de um vetor necessita de várias entradas na tabela de páginas, na tabela de segmentos é necessária apenas uma única entrada. o O segmento pode variar seu tamanho durante a execução com o crescimento de um vetor, por exemplo, na paginação, isso implica na alocação de novas páginas. 9.5.8 – Swapping em Memória Virtual Quando existem novos processos que desejam ser processados e não existe memória real suficiente, o sistema seleciona um ou mais processos que deverão sair da memória para ceder espaço aos novos processos. Os critérios mais utilizados para a escolha são a prioridade, escolhendo processos de melhor prioridade, e o estado do processo, selecionando os processos que estão no estado de espera. 9.5.9 – Thrashing É a excessiva transferência de páginas/segmentos entre a memória principal e a memória secundária. Problema existente tanto em paginação quanto a segmentação. Na paginação: o A nível de processo: o working set de um processo pode ser pequeno demais para acomodar as páginas constantemente acomodadas referenciadas por ele, a solução é aumentar o tamanho do working set. O thrashing também pode ocorrer pela não obediência do conceito da localidade, ou seja, o programa faz referência a comandos/dados localizados em páginas fora do working set do processo e a solução para isso é reescrever a aplicação. o A nível de sistema: o trashing ocorre quando existem mais processos competindo por memória que espaço disponível. O primeiro passo é a redução do tamanho dos working set dos processos, mas isso pode levar o thrashing a nível de processo. Na segmentação: o Em nível de processo, quando a trasferência de segmentos é excessiva devido a modularização extrema do programa não seguindo o conceito da modularidade. o Em nível de sistema é semelhante ao caso da paginação. Em qualquer caso, se existem mais processos para serem executados que a memória real disponível, a única solução é expandir a memória principal. Este problema ocorre emtodos os sistemas que possuem um mecanismo de gerência de memória.
Compartilhar