• Nenhum resultado encontrado

As durações desses surtos de CPU foram medidas exaustivamente Embora possam variar muito de pro cesso a processo e de computador a computador, tendem a ter uma curva de frequência semelhante àquela in-

No documento [PT] SILBERSCHATZ - Sistemas Operacionais (páginas 116-119)

dicada na Figura 6.2. A curva geralmente é caracterizada como exponencial ou hiperexponencial. Existe um

grande número de surtos de CPU curtos e um número pequeno de surtos de CPU longos. Um programa limi-

96 • Sistemas O p e r a c i o n a i s

fado pela entrada/saída geralmente terá muitos surtos de CPU curtos. Um programa limitado pela CPU pode- rá ter alguns surtos de CPU longos. Essa distribuição pode ser importante na Seleção de um algoritmo ade- quado de escalonamento de CPU.

carregar valor da memória adicionar valor ler do arquivo

espera por l/O

incrementar valor do índice gravar no arquivo

espera por l/O

carregar valor da memória adicionar valor ler do arquivo

espera por l/O

surto de CPU surto de 1/0 surto de CPU surto de l/O surto de CPU surto de l/O

Figura 6.1 Sequência de troca de surtos de CPU c I/O.

160 160 120 100 60 60 40 20

A

A

1

n -

\

3

' j — • i 1 0 8 16 24 32 Duração do surto (mrflssegunoos)

Figura 6.2 Histograma das durações de surto de CPU.

40

6.1.2 Escalonador de CPU

Sempre que a CPU ficar ociosa, o sistema operacional deverá escolher um dos processos para r \ < v uvu > da iil.i de processos prontos. O processo de Seleção é executado pelo escalonador de curto prazo (ou escalonador de CPU). O escalonador seleciona dentre os processos na memória aqueles que estão prontos para executar e aloca CPU a um deles.

Escalonamento de CPU • 97 Observe que a fila de processos prontos não é necessariamente uma fila FIFO (primeiro a entrar, primei- ro a sair). Como veremos mais adiante ao tratarmos dos vários algoritmos de escalonamento, uma fila de pro- cessos prontos pode ser implementada como uma fila FIFO, uma fila de prioridades, uma árvore ou simples- mente uma lista ligada desordenada. Conceitualmente, no entanto, rodos os processos na fila de processos prontos estão à espera de uma chance na CPU. Os registros nas filas geralmente são os PCBs dos processos.

6.1.3 Escalonamento preemptivo

As decisões de escalonamento de CPU podem ocorrer em quatro circunstâncias:

1. Quando um processo passa do estado em execução para o estado de espera (por exemplo, um pedido de l/O ou chamada de espera para término de um dos processos filhos)

2. Quando um processo passa do estado em execução para o estado de pronto (por exemplo, quando ocorre uma interrupção)

3. Quando um processo passa do estado de espera para o estado de pronto (por exemplo, conclusão de

l/O)

4. Quando um processo termina

Para os casos 1 e 4, não há opção em termos de escalonamento. Um novo processo (se houver na fila de processos prontos) deve ser selecionado para execução. Existe uma opção, no entanto, para os casos 2 e 3.

Quando o escalonamento ocorre apenas nos casos 1 e 4, dizemos que o esquema de escalonamento é não-preemptivo ou cooperativo; caso contrário, c preemptivo. No escalonamento não-preemptivo, depois que a CPU foi alocada a um processo, o processo mantém a CPU até liberá-la terminando ou passando para o estado de espera. Esse método de escalonamento foi usado pelo Microsoft Windows 3.x; o Windows 95 in- troduziu o escalonamento preemptivo. O sistema operacional Apple Macintosh introduziu o escalonamento preemptivo no MacOS 8 para a plataforma PowerPC. As versões anteriores do MacOS usavam escalonamen- to cooperativo. O escalonamento cooperativo é o único método que pode ser usado em determinadas plata- formas de hardware, porque não requer hardware especial (por exemplo, um timer) necessário para o escalo- namento preemptivo.

Infelizmente, o escalonamento preemptivo incorre em um custo associado com a coordenação de acesso aos dados compartilhados. Considere o caso de dois processos que compartilham dados. Enquanto um está atualizando os dados, ele é interrompido para que o segundo processo possa executar. O segundo processo tenta ler os dados, que estão em estado inconsistente. Assim, precisamos de novos mecanismos para coorde- nar o acesso a dados compartilhados; esse tema é tratado no Capítulo 7.

A preempção também tem um efeito no projeto do kernel do sistema operacional. Durante o processa- mento de uma chamada ao sistema, o kernel pode estar ocupado com uma atividade solicitada por um pro- cesso. Tais atívidades podem implicar na alteração dados importantes do kernel (por exemplo, filas de l/O). O que acontece se o processo for interrompido no meio dessas mudanças, c o kernel (ou o driver de dispositi- vo) precisar ler ou modificar a mesma estrutura? Seria o caos. Certos sistemas operacionais, incluindo a mai- or parte das versões do UNIX, lidam com esse problema esperando a conclusão de uma chamada ao sistema ou de um bloco de operações de I/O, antes de efetuar uma troca de contexto. Esse esquema garante que a es- trutura do kernel seja simples, já que o kernel não interromperá um processo enquanto estruturas de dados do kernel estiverem em estado inconsistente. Infelizmente, esse modelo de execução do kernel não é sólido o bastante para dar suporte ao multiprocessamento e à computação de tempo real. Esses problemas, e suas so- luções, estão descritos nas Seções 6.4 e 6.5.

No caso do UNIX, existem ainda seções do código em risco. Como as interrupções, por definição, po- dem ocorrer a qualquer momento, e como as interrupções nem sempre podem ser ignoradas pelo kernel, as seções de código afetadas pelas interrupções devem ser protegidas do uso simultâneo. O sistema operacional precisa aceitar interrupções praticamente o tempo todo; caso contrário, a entrada pode se perder ou a saída pode ser sobreposta. Para que essas seções de código não sejam acessadas de forma concorrente por vários processos, elas desabilitam as interrupções ao iniciar c as reabilitam ao terminar.

98 • Sistemas Operacionais

6.1.4 Dispatcher

Outro componente envolvido na função de escalonamento de CPU é o dispatcher (executor). O dispatcher c um módulo que dá controle da CPU ao processo selecionado pelo escalonador de curto prazo. Essa função envolve o seguinte:

• Troca de contexto

• Passar para o modo usuário

• Pular para a posição adequada no programa de usuário para reiniciar esse programa

O dispatcher deve ser o mais rápido possível, considerando que ele é chamado durante cada troca de pro- cesso. O tempo necessário para o dispatcher interromper um processo e iniciar a execução de outro é chama- do de latência de dispatch.

No documento [PT] SILBERSCHATZ - Sistemas Operacionais (páginas 116-119)

Outline

Documentos relacionados