Baixe o app para aproveitar ainda mais
Prévia do material em texto
CAPÍTULO 6: Scheduling de CPU. Mas o que danado é Scheduling? É a função de selecionar entre os muitos processos na memória e que possuem o status de prontos, qual deles será despachado para CPU. E em que momentos isso acontece? Bem, o Scheduling pode acontecer quando um processo: 1. Muda de executando para o estado de espera. 2. Muda de executando para o estado de pronto. 3. Muda do estado de espera para pronto. 4. Termina. OBS.1: Scheduling ocorrido em 1 e 4 é Não-Preemptivo ou cooperativo. OBS.2: Os demais Scheduling são Preemptivos. Não entendeu as observações? Sem estresse! Por enquanto saiba que ser Preemptivo é sofrer interrupção. E o outro é o oposto disso. Mais adiante entraremos em detalhes. Mas para que serve tudo isso? Para o seguinte: 1. Manter a CPU ocupada o máximo possível pelos processos de usuários (Utilização da CPU) 2. Executar um certo número de processos numa certa unidade de tempo (Throughput) 3. Garantir a execução numa certa faixa de tempo para processos particulares - Batch (Turnaround time) 4. Minimizar o total de tempo que um processo pode ficar a espera na fila de prontos ( Tempo de espera). 5. Garantir que o tempo decorrido entre uma requisição e a resposta desta requisição seja o mais breve possível ( Tempo de resposta). E de forma geral, como isso acontece? Da seguinte forma: 1. O Módulo Dispatcher dá o controle da CPU para o processo selecionado pelo Scheduler; 2. Isto envolve: a) Chaveamento de contexto; b) Chaveamento para o modo usuário; c) Reinicio do processo; É interessante saber que o termo Dispatch Latency é designado para se referir ao tempo utilizado pelo Dispatcher para realizar o chaveamento entre o processo velho e o novo processo. E como o SO participa dessa estória? Através da utilização de políticas e mecanismos que determinam a ordem de execução dos processos, onde: POLÍTICA: método através do qual decisões são tomadas. MECANISMO: meios através dos quais uma política pode ser atingida. ESTRATÉGIAS: Preemptiva: significa que um processo poder ser suspenso temporariamente (vai para a fila de prontos) e um outro processo ocupa o seu lugar na CPU. Não-Preemptiva: É justamente o oposto: chegou na CPU, ele não arreda o pé de lá!!! Que tal então conhecermos essas políticas? Vamos lá! 1. Política First-Come, First-Served (FCFS) Em bom português: o primeiro que chega, é o primeiro a ser servido. Ex.: Atenção: Para demonstrar a ordem de execução dos processos na CPU, utiliza-se um diagrama chamado Diagrama de Gantt. PROCESSO TEMPO DE EXECUÇÃO P1 24 P2 3 P3 3 Suponha que os processos cheguem na seguinte ordem: P1 , P2 , P3 . O diagrama de Gantt para este caso é: - Tempo de espera: P1 = 0; P2 = 24; P3 = 27 - Tempo médio de espera: (0 + 24 + 27)/3 = 17 - Não se preocupe agora com esses tempos. Mais adiante entraremos em detalhes. Ex.2: Suponha que os processos cheguem na seguinte ordem P2 , P3 , P1 . O diagrama de Gantt é: - Tempo de espera para P1 = 6; P2 = 0; P3 = 3 - Tempo médio de espera: (6 + 0 + 3)/3 = 3 - Neste caso a política é mais adequada do que para o caso anterior. - Observa-se o efeito Comboio, quando processos curtos ficam atrás de um processo longo 2. Shortest-Job-First (SJF): Esta política baseia-se na seleção do processo que possui o menor tempo previsto para o seu próximo surto de utlização de CPU. Possui duas estratégias: Não-Preemptiva – Uma vez dada a CPU para o processo ele não pode ser interrompido até completar seu surto de utilização da CPU. Preemptiva – se um novo processo chegar com um tempo menor que o tempo restante do processo corrente em execução, este processo é interrompido. Esta política é conhecida como o Shortest-Remaining-Time-First (SRTF). SJF é ótimo – pois dá um tempo médio de espera mínimo para um dado conjunto de processos. Ex.: PROCESSO TEMPO DE CHEGADA TEMPO DE SURTO P1 0 7 P2 2 4 P3 4 1 P4 5 4 a) SJF (Não-Preemptivo): Tempo médio de espera = (0 + 6 + 3 + 7) / 4 = 4 b) SJF (Preemptivo): Tempo de espera médio = (9 + 1 + 0 + 2) / 4 = 3 3. Round Robin (RR - Revezamento): Cada processo recebe uma pequena unidade de tempo para usar a CPU (quantum), usualmente entre 10 e 100 milissegundos. Decorrido este tempo, o processo é interrompido e retorna para o final da fila de prontos. Se existem n processos na fila de prontos e o tempo do quantum é q, então cada processo tem 1/n de tempo da CPU em pedaços de q unidade a cada vez que precisar de CPU. Nenhum processo espera mais do que (n-1)q unidades de tempo. Quanto ao desempenho: - q grande Þ FCFS (FIFO) - q pequeno Þ q deve ser grande o suficiente em relação ao tempo gasto pelo Dispatcher na troca de contexto dos processos, caso contrário overhead será alto. Ex.: RR com Tempo de Quantum = 20 PROCESSO TEMPO DE SURTO P1 53 P2 17 P3 68 P4 24 O diagrama de Gantt é: Normalmente, o tempo de retorno médio é maior que na política SJF, mas o de resposta é melhor. 4. Scheduling por Prioridade: A prioridade é um número inteiro associado a cada processo. A CPU é alocada para o processo de maior prioridade (menor inteiro =maior prioridade). Pode ser Preemptivo ou Não-Preemptivo. SJF pode ser vista como uma política de prioridade, onde a prioridade é baseada no valor previsto para o próximo surto de CPU. Problema: Starvation – processos de baixa prioridade podem nunca executar. Solução: Aging – Com o tempo, aumentar progressivamente a prioridade do processo. SE LIGA NISSO: É interessante aprofundarmos nossos conhecimentos em três conceitos de tempo, muito importantes para o Scheduling: 1) Tempo de Espera: É TODO o tempo em que o processo permanece na fila de prontos. 2) Tempo de Resposta: Trata-se do instante em que o processo COMEÇOU a executar, sem contar o tempo que ele passou na fila de prontos. 3) Tempo de Retorno (ou Execução*): É o tempo em que o processo TERMINA a execução menos o tempo em que ele chegou na fila de prontos. *Confirmar se o tempo de execução é realmente sinônimo de tempo de retorno com o seu instrutor, pois não conseguimos esclarecer essa dúvida! Bom, vamos começar entendendo o tempo de espera através de um exemplo: Considere o quadro abaixo: PROCESSO TEMPO DE SURTO TEMPO DE CHEGADA P1 10 0 P2 1 3 P3 3 4 P4 1 5 P5 5 8 Vamos calcular esse tempo, utilizando a política SJF, primeiro sem preempção e depois com preempção: a) SEM-PREEMPÇÃO: Primeiro vamos desenhar o diagrama de Grant. Lembre-se que nesse caso, uma vez que o processo começa a executar, ninguém pode tirá-lo de lá. Assim: Ora, se eu quero o tempo que P1 passou na fila de prontos, este logicamente será 0, já que ele não esperou nada para ser executado. Já com P2 a estória é outra: note que a chegada dele na fila foi no instante 3 mas ele só será servido no instante 10 que é o tempo que P1 acaba. Logo ele ficou esperando 7 unidades de tempo na fila (10 – 3). E assim vai: P3 espera 8 (12 – 8), P4 é 6 (11 – 5) e P5 é 7 (15 – 8). b) COM-PREEMPÇÃO: Lembrando novamente: nesse caso, se no momento em que um processo estiver executando chegar um outro, o processo em execução é suspenso(volta para fila de prontos) para ser retomado posteriormente. Para sabermos o tempo de espera aqui é só observamos o tempo que ele executou antes de ser suspenso e subtraí-lo do tempo emque o processo retoma a sua execução. Compreendeu? Mais uma vez o diagrama de Grant: Vamos lá: P1 executou até 3 antes de ser suspenso e depois retornou no instante 13, logo sua espera foi de 10 (13 -3). Já P2 é 0, pois foi atendido de imediato e não precisou esperar nada. O P3 espera 1 (6 -5) e os dois últimos são 0, a exemplo de P2. Muito simples, não? Da mesma forma, vejamos agora o tempo de resposta: Considere o quadro abaixo: PROCESSO TEMPO DE SURTO TEMPO DE CHEGADA P1 9 0 P2 1 1 P3 4 4 P4 2 5 P5 6 7 P1 P2 P4 P3 P5 0 10 11 12 15 20 P1 P2 P3 P4 P3 P3 P5 P1 0 3 4 5 6 7 8 13 20 Deixando a teoria já mencionada ainda mais explícita, diríamos que para conhecermos o tempo de resposta basta nos perguntarmos qual o instante de chegada do processo e o instante em que ele é REALMENTE servido. Tendo assim feito, pegamos esse último e subtraímos do primeiro encontrando a reposta (gostou do trocadilho? Hehehe...). Vamos observar como ficaria então, no SJF com preempção (não analisaremos aqui o sem- preempção, já que os valores serão idênticos aos do tempo de espera também sem- preempção): a) COM-PREEMPÇÃO: Diagrama de Gantt: O Cálculo dos tempos fica assim: P1 = 0 – 0 = 0 P2 = 1 – 1 = 0 P3 = 4 – 4 = 0 P4 = 5 – 5 = 0 P5 = 16 – 7 = 9 Ilustremos em nosso último exemplo, o tempo de retorno: Considere o quadro abaixo: PROCESSO TEMPO DE SURTO TEMPO DE CHEGADA P1 9 - P2 1 - P3 4 - P4 2 - P5 6 - Agora utilizaremos as políticas SJF com preempção e Round Robin com quantum igual a 2. a) SJF COM-PREEMPÇÃO: Bem, nesse caso, como todos os processos chegaram ao mesmo tempo para serem executados, o tempo de retorno será o tempo em que eles acabam de serem executados. P1 P2 P1 P3 P4 P3 P1 P5 0 3 4 5 6 7 8 13 20 Diagrama de Gantt: Logo, como P1 acaba a execução em 22, este é o seu tempo de retorno. Para os demais se dará da mesma forma: P2 = 1 ; P3 = 7 ; P4 = 3 ; P5 = 13. b) RR com Q = 2: Organizando os processos no diagrama: P1 = 9 7 5 3 P3 = 4 2 P5 = 6 4 2 Mas e se fossem dados os tempos de chegada para cada processo? Vejamos então como ficaria: PROCESSO TEMPO DE SURTO TEMPO DE CHEGADA P1 9 0 P2 1 1 P3 4 4 P4 2 5 P5 6 7 a) SJF COM-PREEMPÇÃO: Bem, como falamos antes, o tempo de retorno é o tempo em que o processo ACABOU de executar menos o instante de chegada. P2 P4 P3 P5 0 1 3 7 13 P1 22 P1 P2 P3 P4 P5 P1 P3 P5 0 2 3 5 7 9 11 13 15 P1 P5 P1 P1 17 19 21 22 Da mesma forma que no SJF, é simples ver os tempos de retorno: P1 = 22 P2 = 3 P3 =13 P4 = 7 P5 = 19 Diagrama de Grant: Organizando os processos no diagrama: P1 = 9 8 6 P3 = 4 3 P5 = 6 E os tempos de retorno são: P1 = 16 P2 = 2 -1 =1 P3 = 10 -4 = 6 P4 = 7 – 5 = 2 P5 = 22 – 7 = 15 b) RR com Q = 2: Organizando os processos no diagrama: Para entendermos como os processos se comportam é preciso sabermos que uma fila de prontos é do tipo FIFO(o primeiro a entrar é o primeiro a sair). Logo, P1 chega na fila, sai dela (só tem ele) e executa 2 (restam 7). P2 já tinha chegado em 1 e ido para a fila. Ele sai e executa até 3 enquanto P1 retorna. P2 já era! P3 chega em 4, como estamos em 3, P1 volta, executa mai 2 (Restam 5) e P3 fica na fila. Em 5 chega P4, como P3 está na frente ele sai excuta 2 (Restam 2) e em seguida P4 e retirado da fila e executa 2. P4 já era! Note que quando P3 sai, é justamente o instante de chegada de P5. Logo, primeiro vai P5 para fila e depois P3, ambos atrás de P1. P1 P2 P1 P3 P4 P3 P1 P5 0 1 2 4 5 7 10 16 22 P1 P2 P1 P3 P4 P1 P5 P3 0 2 3 5 7 9 11 13 15 P1 P5 P1 P5 17 19 20 22 Seguindo a fila agora, P1 sai e executa mais 2 (Restam 3). Volta para fila e P5 sai e excuta 2 (Restam 4) e volta. P3 entra e executa 2. P3 já era! P1 sai e executa mais 2 (Restam 1) e volta. P5 sai e executa mais 2 (Restam 2) e volta. Por fim, P1 sai e executa 1. P1 já era! Agora sai P5 e excuta seus 2 restantes. P5 já era! E ai cansou? Seja como for, navegar é preciso! ;) Fechamos agora exibindo os tempos de retorno: P1 = 20 P2 = 3 -1 = 2 P3 = 15 – 4 = 11 P4 =9 – 5 = 4 P5 = 22 -7 = 15 DICA: que tal você implementar esses algoritmos? Não tem paciência? Bom... Deixa para S.O.II !!! hum..quer saber? Esquece, tô brincando. Você é quem sabe! P3 P5 P1 P1 P3 P5 P5 P1 P3 P5 P1 Abordemos agora, alguns tópicos complementares ao assunto: 1. Escalonamento por Múltiplas Filas: - A fila de prontos é particionada em filas separadas: Ex.: foreground (interativo) background (batch) - Cada fila tem seu próprio algoritmo de Scheduling: Ex.: foreground – RR background – FCFS - Deve ser realizado Scheduling entre as filas: - Scheduling de prioridade fixa; isto é, servido todos os processos de foreground então serve- se os de background. Possibilidade de Starvation. - Time slice: cada fila recebe um certo tempo de CPU para distribuir entre os seus processos; Por exemplo: 80% para foreground em RR. 20% para background em FCFS. 2. Escalonamento por Múltiplas Filas com Realimentação: - Um processo pode ser movido entre as várias filas; - Aging pode ser implementado para evitar a estagnação (pesquise!). - A política Escalonamento por Múltiplas Filas com Realimentação para ser implementada necessita da definição dos seguintes parâmetros: a) Número de filas; b) Algoritmos de escalonamento para cada fila; c) Métodos usados para determinar quando atualizar os atributos de escalonamento do processo; d) Métodos usados para determinar qual fila um processo entrará quando aquele processo necessitar de serviços; Ex.: Três filas: Q0 – tempo do quantum 8 millisegundos Q1 – tempo do quantum 16 millisegundos Q2 – FCFS - Scheduling: Um novo processo sempre entra em Q0 a qual é administrada no modelo RR. Quandoele ganha a CPU, recebe 8 ms. Se não liberar a CPU nestes 8 ms, o processo é movido para a fila Q1. Em Q1 o processo é outra vez servido e recebe 16 ms adicionais. Se ele mais uma vez não liberar a CPU, ele é preemptado e movido para a fila Q2. 3. Schedule de Múltiplos-Processadores: - O Scheduling de CPU é mais complexo quando múltiplas CPUs estão disponíveis; - Ambientes multiprocessadores com processadores homogêneos; - Compartilhamento de carga; - Multiprocessamento Simétrico (SMP) – cada processador encarrega-se de realizar suas próprias decisões de Scheduling; - Multiprocessamento Assimétrico – apenas um processador (Mestre) acessa a fila de processos prontos, aliviando a necessidade de compartilhamento de dados; 4. Schedule de Tempo Real: Sistemas de tempo real crítico – requerido quando tarefas devem ser processadas dentro de um período de tempo adequado as suas características - Reserva de recursos: Exige conhecimento destes por parte do SO. Sistemas de tempo real não crítico – requer que processos críticos recebam prioridades maiores que os não críticos (estude isso melhor no livro!).; - Pode causar alocação injusta, causando Starvation; - Os processos de tempo real não podem ter suas prioridades degradadas; - Tempo de latência do Dispatch deve ser o mínimo possível; 5. Schedule de Thread: Scheduling Local (usuário) – Como os threads de usuário são criados e geridos pelas próprias aplicações e como não há ciência por parte do SO das características desses threads ficam por parte da aplicação proprietárias dos threads a tarefa de schedulá-los. Scheduling Global (kernel) – Como os threads são criados pelo próprio kernel nada mais natural que utilizar o Schedule do próprio kernel que é o global para decidir qual o próximo thread associado ao kernel que será selecionado.
Compartilhar