Fundamentos de Sistemas Operacionais Aula 11: Escalonadores: Estudos de Caso Diego Passos
Últimas Aulas
Escalonadores Escalonadores não-preemptivos: FIFO. SJF (com e sem previsão). Escalonadores preemptivos: Prioridades. Round-robin. Round-robin com prioridades. Múltiplas filas.
Escalonadores de Tempo Real
Problema e Objetivo Em um sistema de tempo real, processos têm prazos. Prazos devem ser cumpridos, ou há penalidades envolvidas. O problema de escalonamento, neste caso, envolve distribuir o processador pelos processos de forma a atender a todos os prazos. Objetivos como tempo de resposta médio não são considerados. Escalonadores de tempo real precisam dar garantias. Sistema precisa ser escalonável. Novos processos são aceitos apenas se o sistema se mantém escalonável.
Dados Esperados pelo Escalonador Supõe-se que os processos (também chamados de Tarefas) sejam periódicos. De tempos em tempos, tarefas são re-submetidas ao sistema. Supõe-se que o escalonador tem conhecimento das seguintes informações: C_i: duração da tarefa (no pior caso). P_i: prazo de conclusão da tarefa (uma vez que ela chegue ao sistema). T_i: período da tarefa. n: número total de tarefas no sistema. Como as tarefas são conhecidas, as durações são previamente medidas. Em geral, assume-se que o prazo de uma tarefa é igual ao seu período.
Escalonador Taxa Monotônica Escalonador mais simples. Atua de forma preemptiva. Atribui prioridades estáticas à cada tarefa. Prioridade de uma tarefa é inversamente proporcional ao seu prazo/período. Quanto maior o prazo, menor a prioridade. A cada momento de escalonamento, é escolhida a tarefa com a maior prioridade. Uma tarefa escalonada executa até que: ela termine sua execução; ou uma nova tarefa de maior prioridade chegue.
Exemplo
Teste de Escalonabilidade do Escalonador Taxa Monotônica Quando uma nova tarefa deve ser criada no sistema, o escalonador de longo prazo executa o seguinte teste: Se a utilização do processador estiver abaixo do valor do lado direito da expressão, garante-se que o sistema é escalonável. Caso contrário, não há garantias. O sistema pode ser escalonável. A condição é suficiente, mas não necessária.
Teste de Escalonabilidade do Escalonador Taxa Monotônica (mais)
Teste de Escalonabilidade Baseado em Simulação Pode-se testar a escalonabilidade de um sistema através de simulação. Basta construir o gráfico de escalonamento, utilizando o algoritmo selecionado. Deve-se iniciar a simulação no Instante Crítico. Momento no qual todas as tarefas chegam simultaneamente. Pior cenário possível. Basta realizar a simulação até o final do prazo da tarefa de maior prazo. Se neste intervalo, o sistema for escalonável, o algoritmo sempre irá garantir a escalonabilidade. Se neste intervalo, algum prazo for perdido, o sistema não é escalonável.
Escalonador EDF (Earliest Deadline First) Escalonador preemptivo. A cada momento de decisão, o escalonador seleciona o processo que tem, atualmente, o prazo mais próximo. Note que não é o prazo mais curto, em geral, mas sim o prazo que está mais próximo no momento. Processo selecionado executa até que: ele termine; ou chegue um novo processo no sistema, com prazo mais curto.
Exemplo
Teste de Escalabilidade do EDF Um conjunto de tarefas é escalonável pelo algoritmo EDF se e somente se a utilização do processador é no máximo 100%. Esta condição é necessária e suficiente. Embora o EDF seja capaz de escalonar um conjunto maior de tarefas, em geral, o algoritmo da Taxa Monotônica é mais comumente implementado. Principalmente em sistemas mais sensíveis. O algoritmo de taxa monotônica é mais simples. Menos propenso a erros.
Escalonador no Linux
Histórico Primeiro escalonador era muito simples. Round-robin com processos ordenados em uma fila. Sem prioridades. A partir da versão 2.2, Linux passou a utilizar uma política com múltiplas filas. Escalonador de tempo real. Escalonador de processos não-preemptivos. Escalonador de processos "normais". Na versão 2.4, o round-robin dos processos normais foi substituído por um escalonador chamado O(n). Lista de processos é varrida,com uma função utilidade calculada para cada processo. Muito complexo. Na versão 2.6, o O(n) foi substituído pelo O(1).
Escalonador Atual: CFS Completely Fair Scheduler. Procura dividir da maneira mais justa possível o uso do processador. Processos aptos são ordenados em uma estrutura de dados chamada árvore vermelho e preto. Critério de ordenação é o tempo de espera pelo processador. Cada processo tem uma variável guardando este valor. Enquanto o processo está aguardando pelo processador, variável é incrementada. Enquanto o processo usa o processador, variável é decrementada. Situação ideal: todos os processos têm suas variáveis zeradas.
CFS: Exemplo Fonte: http://www.ibm.com/developerworks/linux/library/l-completely-fair-scheduler/
CFS: Prioridades O CFS permite que processos tenham prioridades diferentes. Todo processo tem uma prioridade, variando de -20 a 19. -20 são os processos mais prioritários. O CFS ajusta o incremento e o decremento da variável do tempo de espera pelo processador de acordo com a prioridade. Quanto maior a prioridade, maior o incremento e menor o decremento.
Benefícios do CFS Escalonamento provê uma divisão razoavelmente justa dos recursos aos vários processos. Existem algoritmos melhores neste ponto de vista. O escalonador tem overhead relativamente baixo. Pois usa uma estrura de dados eficiente.
Escalonador no Windows
Histórico As primeiras versões do Windows não eram multiprogramadas. Na verdade, o Windows sequer era um SO. Ele rodava sobre o MS-DOS. Não havia necessidade de escalonador. A partir do Windows 95, surgiu um escalonador muito simples, baseado em round-robin. As versões baseadas no Windows NT (incluindo XP, Vista e 7) passaram a ter um escalonador do tipo Multilevel Feedback Queue. 32 prioridades diferentes.
Multilevel Feedback Queue É similar ao round-robin com prioridades. Cada processo tem uma prioridade numérica. No caso do Windows, variando de 0 a 31. Escalonador organiza os processos em várias filas, uma para cada prioridade. Quando uma decisão de escalonamento é necessária, a fila não vazia de maior prioridade é escolhida. Primeiro processo é selecionado para o próximo slice do processador. Diferença para o round-robin com prioridades: SO pode realizar pequenas mudanças nas prioridades dos processos (para cima ou para baixo). Mudanças tem a ver com as características dos processos (I/O Bound, foreground, etc).
Mais Detalhes Valor da fatia de tempo é fixa para todos os processos. Mas pode variar de máquina para máquina. Sempre algo em torno de 10 ms a 20 ms. As prioridades são divididas em grupos, de acordo com os tipos de processo. Processos do SO: prioridade 0. Processos de tempo real: prioridades de 1 a 15. Processos normais: prioridade de 16 a 31.
Mudanças no Windows Vista Mudança principal tem relação à fatia de tempo. Ela continua sendo fixa para todos os processos. Porém agora é calculada em ciclos de processador e não em tempo de parede. Tempo de parede nem sempre é justo, por causa das interrupções. Tratador de interrupção do SO gasta o tempo da fatia do processo. O SO agora usa um registrador especial para contar os ciclos de CPU. Por ser um registrador, faz parte do contexto do processo. Não é afetado por tratadores de interrupção.
Revisão
Para Lembrar Objetivo de um escalonador de tempo real. Exemplos de escalonadores para tempo real: EDF. Taxa monotônica. Testes de escalonabilidade. Momento crítico. Ideia de como os escalonadores do Linux e Windows funcionam. Usam fatias de tempo. Combinam com prioridades. Tem objetivos distintos.