{"id":32158,"date":"2019-10-31T21:45:27","date_gmt":"2019-10-31T18:45:27","guid":{"rendered":"https:\/\/prohoster.info\/blog\/operating-systems-three-easy-pieces-part-4-vvedenie-v-planirovshhik-perevod\/"},"modified":"2019-10-31T21:45:27","modified_gmt":"2019-10-31T18:45:27","slug":"operating-systems-three-easy-pieces-part-4-vvedenie-v-planirovshhik-perevod","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/operating-systems-three-easy-pieces-part-4-vvedenie-v-planirovshhik-perevod","title":{"rendered":"Sistemas Operacionais: Tr\u00eas Pe\u00e7as F\u00e1ceis. Parte 4: Introdu\u00e7\u00e3o ao planejador (tradu\u00e7\u00e3o)","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<h1>Introdu\u00e7\u00e3o aos sistemas operacionais<\/h1>\n<p>\nOl\u00e1, Habr! Quero apresentar a voc\u00eas uma s\u00e9rie de artigos traduzidos de uma literatura que considero interessante \u2014 OSTEP. Este material explora a fundo o funcionamento dos sistemas operacionais semelhantes ao Unix, particularmente \u2014 o trabalho com processos, v\u00e1rios escalonadores, mem\u00f3ria e outros componentes que comp\u00f5em um sistema operacional moderno. Voc\u00ea pode olhar o original de todo o material aqui <noindex><a rel=\"nofollow\" href=\"http:\/\/pages.cs.wisc.edu\/~remzi\/OSTEP\/\">aqui<\/a><\/noindex>. Pe\u00e7o que considerem que a tradu\u00e7\u00e3o foi feita de forma n\u00e3o profissional (de maneira bastante livre), mas espero ter mantido o sentido geral.<\/p>\n<p>Os trabalhos de laborat\u00f3rio sobre este assunto podem ser encontrados aqui:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/pages.cs.wisc.edu\/~remzi\/OSTEP\/Homework\/homework.html\">original<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/remzi-arpacidusseau\/ostep-code\">original<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/bykvaadm\/OS\/tree\/master\/ostep\">minha adapta\u00e7\u00e3o pessoal<\/a><\/noindex><\/li>\n<\/ul>\n<p>\nPartes adicionais:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/post\/446340\/\">Parte 1: Introdu\u00e7\u00e3o<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/post\/446866\/\">Parte 2: Abstra\u00e7\u00e3o: processo<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/post\/447182\/\">Parte 3: Introdu\u00e7\u00e3o \u00e0 API de processos<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/post\/449026\/\">Parte 4: Introdu\u00e7\u00e3o ao escalonador<\/a><\/noindex><\/li>\n<\/ul>\n<p>\nE voc\u00ea tamb\u00e9m pode acessar meu canal em <noindex><a rel=\"nofollow\" href=\"https:\/\/t.me\/bykvaadm\">telegram<\/a><\/noindex> =)<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Introdu\u00e7\u00e3o ao planejador<\/h2>\n<p>\n<u>A ess\u00eancia do problema: Como desenvolver uma pol\u00edtica de planejador<br \/>\nComo devem ser desenvolvidos os frameworks b\u00e1sicos de pol\u00edticas do planejador? Quais devem ser as suposi\u00e7\u00f5es-chave? Quais m\u00e9tricas s\u00e3o importantes? Quais t\u00e9cnicas b\u00e1sicas foram usadas em sistemas computacionais anteriores?<\/u><\/p>\n<h3>Suposi\u00e7\u00f5es sobre a carga de trabalho<\/h3>\n<p>\n Antes de discutir poss\u00edveis pol\u00edticas, vamos fazer algumas simplifica\u00e7\u00f5es sobre os processos executados no sistema, que juntos s\u00e3o chamados de <b>carga de trabalho<\/b>. Definir a carga de trabalho como uma parte cr\u00edtica na constru\u00e7\u00e3o de pol\u00edticas e quanto mais voc\u00ea souber sobre a carga, melhor ser\u00e1 a pol\u00edtica que voc\u00ea pode escrever.<\/p>\n<p>Vamos fazer as seguintes suposi\u00e7\u00f5es sobre os processos executados no sistema, que \u00e0s vezes tamb\u00e9m s\u00e3o chamados de <b>jobs<\/b> (tarefas). Praticamente todas essas suposi\u00e7\u00f5es n\u00e3o s\u00e3o realistas, mas s\u00e3o necess\u00e1rias para desenvolver o racioc\u00ednio.<\/p>\n<ol>\n<li> Cada tarefa \u00e9 executada pelo mesmo per\u00edodo de tempo,<\/li>\n<li> Todas as tarefas s\u00e3o iniciadas simultaneamente,<\/li>\n<li> A tarefa iniciada executa at\u00e9 sua conclus\u00e3o,<\/li>\n<li> Todas as tarefas utilizam apenas a CPU,<\/li>\n<li> O tempo de execu\u00e7\u00e3o de cada tarefa \u00e9 conhecido.<\/li>\n<\/ol>\n<h3>M\u00e9tricas do Planejador<\/h3>\n<p>\n Al\u00e9m de algumas suposi\u00e7\u00f5es sobre a carga, tamb\u00e9m \u00e9 necess\u00e1rio um certo instrumento de compara\u00e7\u00e3o de v\u00e1rias pol\u00edticas de planejamento: as m\u00e9tricas do planejador. M\u00e9tricas s\u00e3o apenas alguma medida de algo. Existe uma quantidade de m\u00e9tricas que podem ser usadas para comparar planejadores.<\/p>\n<p>Por exemplo, vamos usar uma m\u00e9trica chamada <b>tempo de retorno<\/b> (turnaround time). O tempo de retorno de uma tarefa \u00e9 definido como a diferen\u00e7a entre o tempo de conclus\u00e3o da tarefa e o tempo de chegada da tarefa ao sistema.<\/p>\n<p><u>Tturnaround=Tcompletion\u2212Tarrival<\/u><\/p>\n<p>Como supomos que todas as tarefas chegaram ao mesmo tempo, ent\u00e3o Ta=0 e assim Tt=Tc. Este valor naturalmente mudar\u00e1 quando alterarmos as suposi\u00e7\u00f5es listadas acima.<\/p>\n<p>Outra m\u00e9trica \u00e9 a <b>justi\u00e7a<\/b> (fairness). Desempenho e justi\u00e7a muitas vezes s\u00e3o caracter\u00edsticas opostas no planejamento. Por exemplo, o planejador pode otimizar o desempenho, mas \u00e0 custa da espera para que outras tarefas sejam iniciadas, diminuindo assim a justi\u00e7a.<\/p>\n<h3>FIRST IN FIRST OUT (FIFO)<\/h3>\n<p>\n O algoritmo mais b\u00e1sico que podemos implementar chama-se FIFO ou <b>primeiro a chegar, primeiro a ser atendido<\/b>. Este algoritmo possui v\u00e1rias vantagens: \u00e9 muito simples de implementar e atende a todas as nossas suposi\u00e7\u00f5es, realizando o trabalho de forma bastante eficaz.<\/p>\n<p>Vamos considerar um exemplo simples. Suponha que 3 tarefas foram designadas ao mesmo tempo. Mas imagine que a tarefa A chegou um pouco antes das demais, portanto ela estar\u00e1 no in\u00edcio da lista de execu\u00e7\u00e3o, assim como a tarefa B em rela\u00e7\u00e3o \u00e0 tarefa C. Suponha que cada uma delas ser\u00e1 executada por 10 segundos. Qual seria, nesse caso, o tempo m\u00e9dio de execu\u00e7\u00e3o dessas tarefas?<\/p>\n<p><img decoding=\"async\" alt=\"Sistemas Operacionais: Tr\u00eas Pe\u00e7as F\u00e1ceis. Parte 4: Introdu\u00e7\u00e3o ao planejador (tradu\u00e7\u00e3o)\" src=\"\/wp-content\/uploads\/2019\/04\/8c17c29e10ac8c2e15f5f9d865922e49.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nCalculando os valores \u2014 10+20+30 e dividindo por 3, obtemos o tempo m\u00e9dio de execu\u00e7\u00e3o do programa igual a 20 segundos.<br \/>\n Agora vamos tentar mudar nossas suposi\u00e7\u00f5es. Em particular, a suposi\u00e7\u00e3o 1, e assim n\u00e3o vamos mais considerar que cada tarefa leva o mesmo tempo para ser executada. Como se comportar\u00e1 o FIFO desta vez?<\/p>\n<p>Como se v\u00ea, diferentes tempos de execu\u00e7\u00e3o das tarefas afetam negativamente a produtividade do algoritmo FIFO. Suponha que a tarefa A ser\u00e1 executada por 100 segundos, enquanto B e C ainda levar\u00e3o 10 segundos cada.<\/p>\n<p><img decoding=\"async\" alt=\"Sistemas Operacionais: Tr\u00eas Pe\u00e7as F\u00e1ceis. Parte 4: Introdu\u00e7\u00e3o ao planejador (tradu\u00e7\u00e3o)\" src=\"\/wp-content\/uploads\/2019\/04\/a375f3d1571f24df30f446b9bc7a9a9e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\n Como pode ser observado na figura, o tempo m\u00e9dio para o sistema ser\u00e1 (100+110+120)\/3=110. Esse efeito \u00e9 chamado <b>de efeito de comboio<\/b>, quando alguns consumidores de curto prazo de um recurso ficam na fila atr\u00e1s de um consumidor pesado. Isso \u00e9 semelhante a uma fila no supermercado, onde um cliente \u00e0 sua frente possui um carrinho cheio. A melhor solu\u00e7\u00e3o para o problema \u00e9 tentar mudar de caixa ou relaxar e respirar fundo.<\/p>\n<h3>Shortest Job First<\/h3>\n<p>\n \u00c9 poss\u00edvel resolver essa situa\u00e7\u00e3o com processos pesados? Claro. Outro tipo de escalonamento \u00e9 chamado<b>Shortest Job First<\/b> (SJF). Seu algoritmo tamb\u00e9m \u00e9 bastante primitivo \u2014 como o nome indica, as tarefas mais curtas ser\u00e3o executadas primeiro, uma ap\u00f3s a outra.<\/p>\n<p><img decoding=\"async\" alt=\"Sistemas Operacionais: Tr\u00eas Pe\u00e7as F\u00e1ceis. Parte 4: Introdu\u00e7\u00e3o ao planejador (tradu\u00e7\u00e3o)\" src=\"\/wp-content\/uploads\/2019\/04\/d0723e313adc9ce7367da611216bf3ee.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNeste exemplo, o resultado da execu\u00e7\u00e3o dos mesmos processos ser\u00e1 a melhora do tempo m\u00e9dio de retorno dos programas, que ser\u00e1 igual a <b>50 em vez de 110<\/b>, que \u00e9 praticamente 2 vezes melhor.<\/p>\n<p>Assim, de acordo com a suposi\u00e7\u00e3o de que todas as tarefas chegam ao mesmo tempo, o algoritmo SJF parece ser o mais otimizado. No entanto, nossas suposi\u00e7\u00f5es ainda n\u00e3o parecem realistas. Desta vez, mudaremos a suposi\u00e7\u00e3o 2 e consideraremos que as tarefas podem chegar a qualquer momento, e n\u00e3o todas ao mesmo tempo. Quais problemas isso pode causar?<\/p>\n<p><img decoding=\"async\" alt=\"Sistemas Operacionais: Tr\u00eas Pe\u00e7as F\u00e1ceis. Parte 4: Introdu\u00e7\u00e3o ao planejador (tradu\u00e7\u00e3o)\" src=\"\/wp-content\/uploads\/2019\/04\/2f0145551779f2733281d12bffad3a45.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVamos supor que a tarefa A (100s) chega primeiro e come\u00e7a a ser executada. No momento t=10, as tarefas B e C chegam, cada uma delas consumindo 10 segundos. Assim, o tempo m\u00e9dio de execu\u00e7\u00e3o \u00e9 (100+(110-10)+(120-10))\/3 = 103. O que o escalonador poderia fazer para melhorar a situa\u00e7\u00e3o?<\/p>\n<h3>Shortest Time-to-Completion First (STCF)<\/h3>\n<p>\n Para melhorar a situa\u00e7\u00e3o, vamos ignorar a suposi\u00e7\u00e3o 3 de que o programa \u00e9 iniciado e executado at\u00e9 a conclus\u00e3o. Al\u00e9m disso, precisamos de suporte de hardware e, como voc\u00ea pode imaginar, usaremos <b>um temporizador<\/b> para interromper a tarefa em execu\u00e7\u00e3o e <b>mudar contextos<\/b>. Assim, o escalonador pode agir no momento em que as tarefas B e C chegam \u2014 interromper a execu\u00e7\u00e3o da tarefa A e come\u00e7ar a processar as tarefas B e C e, ap\u00f3s sua conclus\u00e3o, retomar a execu\u00e7\u00e3o do processo A. Esse tipo de escalonador \u00e9 chamado de <b>STCF<\/b>ou <b>Preemptive Job First<\/b>.<\/p>\n<p><img decoding=\"async\" alt=\"Sistemas Operacionais: Tr\u00eas Pe\u00e7as F\u00e1ceis. Parte 4: Introdu\u00e7\u00e3o ao planejador (tradu\u00e7\u00e3o)\" src=\"\/wp-content\/uploads\/2019\/04\/81644f82b7b1489f239ebbdc5d78000b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nO resultado do trabalho desse escalonador ser\u00e1: ((120-0)+(20-10)+(30-10))\/3=50. Portanto, esse escalonador se torna ainda mais otimizado para nossas tarefas.<\/p>\n<h3>M\u00e9trica do Tempo de Resposta (Response Time)<\/h3>\n<p>\n Portanto, se soubermos o tempo de execu\u00e7\u00e3o das tarefas e que essas tarefas usam apenas CPU, o STCF ser\u00e1 a melhor solu\u00e7\u00e3o. Em tempos antigos, esses algoritmos funcionavam e at\u00e9 que muito bem. No entanto, agora o usu\u00e1rio passa a maior parte do tempo no terminal e espera dela uma intera\u00e7\u00e3o produtiva e interativa. Assim surgiu uma nova m\u00e9trica \u2014 <b>o tempo de resposta<\/b> (response).<\/p>\n<p>O tempo de resposta \u00e9 calculado da seguinte forma:<\/p>\n<p><u>Tresponse=Tfirstrun\u2212Tarrival<\/u><\/p>\n<p>Assim, para o exemplo anterior, o tempo de resposta ser\u00e1: A=0, B=0, C=10 (abg=3,33).<\/p>\n<p>E o algoritmo STCF n\u00e3o \u00e9 t\u00e3o eficiente em situa\u00e7\u00f5es em que 3 tarefas chegam ao mesmo tempo \u2014 ele ter\u00e1 que esperar at\u00e9 que as pequenas tarefas sejam conclu\u00eddas. Assim, o algoritmo \u00e9 bom para a m\u00e9trica de tempo de resposta, mas ruim para a m\u00e9trica de interatividade. Imagine que, ao usar um terminal na tentativa de digitar caracteres em um editor, voc\u00ea precisasse esperar mais de 10 segundos porque uma outra tarefa estava ocupando o processador. Isso n\u00e3o \u00e9 nada agrad\u00e1vel.<\/p>\n<p><img decoding=\"async\" alt=\"Sistemas Operacionais: Tr\u00eas Pe\u00e7as F\u00e1ceis. Parte 4: Introdu\u00e7\u00e3o ao planejador (tradu\u00e7\u00e3o)\" src=\"\/wp-content\/uploads\/2019\/04\/f1412665826f845fdc685ec3c1a5bdad.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPortanto, enfrentamos outro problema \u2014 como podemos construir um escalonador que seja sens\u00edvel ao tempo de resposta?<\/p>\n<h3>Round Robin<\/h3>\n<p>\n Para resolver esse problema, foi desenvolvido o algoritmo <b>Round Robin<\/b> (RR). A ideia principal \u00e9 bastante simples: em vez de executar as tarefas at\u00e9 sua conclus\u00e3o, vamos executar uma tarefa por um determinado intervalo de tempo (chamado de qu\u00e2ntico de tempo) e, em seguida, trocar para outra tarefa na fila. O algoritmo repete esse processo at\u00e9 que todas as tarefas sejam conclu\u00eddas. Nesse caso, o tempo de execu\u00e7\u00e3o do programa deve ser um m\u00faltiplo do tempo em que o timer interrompe o processo. Por exemplo, se o timer interrompe o processo a cada x=10ms, o tamanho da janela de execu\u00e7\u00e3o do processo deve ser um m\u00faltiplo de 10 e ser 10, 20 ou x*10.<\/p>\n<p>Vamos considerar um exemplo: as tarefas ABC chegam simultaneamente ao sistema e cada uma delas deseja executar por 5 segundos. O algoritmo SJF executar\u00e1 cada tarefa at\u00e9 o fim antes de iniciar outra. Em contraste, o algoritmo RR com janela de execu\u00e7\u00e3o = 1s passar\u00e1 pelas tarefas da seguinte maneira (fig. 4.3):<\/p>\n<p><img decoding=\"async\" alt=\"Sistemas Operacionais: Tr\u00eas Pe\u00e7as F\u00e1ceis. Parte 4: Introdu\u00e7\u00e3o ao planejador (tradu\u00e7\u00e3o)\" src=\"\/wp-content\/uploads\/2019\/04\/a7790cb63c880b286db2a2e3782d59b2.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n(SJF novamente (ruim para o tempo de resposta)<\/p>\n<p><img decoding=\"async\" alt=\"Sistemas Operacionais: Tr\u00eas Pe\u00e7as F\u00e1ceis. Parte 4: Introdu\u00e7\u00e3o ao planejador (tradu\u00e7\u00e3o)\" src=\"\/wp-content\/uploads\/2019\/04\/f7e82d68a6118828ea4561a4911744e2.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n(Round Robin (bom para o tempo de resposta)<\/p>\n<p>O tempo m\u00e9dio de resposta para o algoritmo RR (0+1+2)\/3=1, enquanto para SJF (0+5+10)\/3=5.<\/p>\n<p>\u00c9 l\u00f3gico supor que a janela de tempo \u00e9 um par\u00e2metro muito importante para o RR, quanto menor ela for, maior ser\u00e1 o tempo de resposta. No entanto, n\u00e3o se deve torn\u00e1-la excessivamente pequena, pois o tempo de troca de contexto tamb\u00e9m desempenha um papel na performance geral. Assim, a escolha do tempo de janela de execu\u00e7\u00e3o \u00e9 definida pelo arquiteto do sistema operacional e depende das tarefas que est\u00e3o previstas para serem executadas. A troca de contexto n\u00e3o \u00e9 a \u00fanica opera\u00e7\u00e3o de servi\u00e7o que consome tempo \u2014 o programa em execu\u00e7\u00e3o opera com muitos outros aspectos, como diferentes caches, e a cada troca \u00e9 necess\u00e1rio salvar e restaurar esse ambiente, o que tamb\u00e9m pode demandar bastante tempo.<\/p>\n<p>O RR \u00e9 um excelente planejador, se estivermos falando apenas sobre a m\u00e9trica do tempo de resposta. Mas como se comportar\u00e1 a m\u00e9trica do tempo de retorno da tarefa com esse algoritmo? Vamos considerar o exemplo acima, quando os tempos de execu\u00e7\u00e3o A, B, C = 5s e chegam ao mesmo tempo. A tarefa A ser\u00e1 conclu\u00edda em 13s, B em 14s, C em 15s, resultando em um tempo m\u00e9dio de retorno de 14s. Assim, o RR \u00e9 o pior algoritmo para a m\u00e9trica de retorno.<\/p>\n<p>De maneira mais geral, qualquer algoritmo do tipo RR \u00e9 justo, pois divide o tempo de processamento no CPU igualmente entre todos os processos. E, assim, essas m\u00e9tricas est\u00e3o em constante conflito entre si.<\/p>\n<p>Portanto, temos v\u00e1rios algoritmos opostos e ainda restam algumas suposi\u00e7\u00f5es \u2014 de que o tempo da tarefa \u00e9 conhecido e que a tarefa utiliza apenas o CPU.<\/p>\n<h3>Mistura com I\/O<\/h3>\n<p>\n Em primeiro lugar, vamos remover a suposi\u00e7\u00e3o 4, de que o processo apenas utiliza o CPU, o que, naturalmente, n\u00e3o \u00e9 verdade, pois os processos podem interagir com outros equipamentos.<\/p>\n<p>No momento em que um processo solicita uma opera\u00e7\u00e3o de entrada e sa\u00edda, ele passa para o estado bloqueado, aguardando a conclus\u00e3o do I\/O. Se o I\/O \u00e9 enviado para o disco r\u00edgido, essa opera\u00e7\u00e3o pode levar v\u00e1rios milissegundos ou mais, e o processador ficar\u00e1 ocioso nesse momento. Nesse tempo, o planejador pode alocar o processador para qualquer outro processo. A pr\u00f3xima decis\u00e3o que o planejador ter\u00e1 que tomar \u00e9 quando o processo concluir seu I\/O. Quando isso ocorrer, haver\u00e1 uma interrup\u00e7\u00e3o e o sistema operacional mudar\u00e1 o processo que solicitou o I\/O para o estado pronto.<\/p>\n<p>Vamos considerar um exemplo de v\u00e1rias tarefas. Cada uma delas precisa de 50 ms de tempo de processador. No entanto, a primeira ir\u00e1 acessar I\/O a cada 10 ms (que tamb\u00e9m ser\u00e1 executado a cada 10 ms). E o processo B simplesmente utiliza 50 ms de processador sem I\/O.<\/p>\n<p><img decoding=\"async\" alt=\"Sistemas Operacionais: Tr\u00eas Pe\u00e7as F\u00e1ceis. Parte 4: Introdu\u00e7\u00e3o ao planejador (tradu\u00e7\u00e3o)\" src=\"\/wp-content\/uploads\/2019\/04\/a32f5346eda86042c18d6424c19ad6b9.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNeste exemplo, usaremos o planejador STCF. Como o planejador se comportar\u00e1 se iniciarmos um processo como A? Ele far\u00e1 o seguinte \u2014 primeiro completar\u00e1 totalmente o processo A, e depois o processo B.<\/p>\n<p><img decoding=\"async\" alt=\"Sistemas Operacionais: Tr\u00eas Pe\u00e7as F\u00e1ceis. Parte 4: Introdu\u00e7\u00e3o ao planejador (tradu\u00e7\u00e3o)\" src=\"\/wp-content\/uploads\/2019\/04\/9fb709a822b9fc35871b8a342ac38c7e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nA abordagem tradicional para resolver esse problema \u00e9 interpretar cada subtarefa de 10 ms do processo A como uma tarefa separada. Assim, ao iniciar com o algoritmo STJF, a escolha entre a tarefa de 50 ms e a de 10 ms \u00e9 \u00f3bvia. Ent\u00e3o, quando a subtarefa A terminar, o processo B e I\/O ser\u00e3o iniciados. Ap\u00f3s a conclus\u00e3o do I\/O, ser\u00e1 decidido reiniciar o processo de 10 ms A em vez do processo B. Dessa forma, \u00e9 poss\u00edvel implementar sobreposi\u00e7\u00e3o, onde a CPU \u00e9 utilizada por outro processo enquanto o primeiro aguarda I\/O. Como resultado, o sistema \u00e9 melhor utilizado \u2014 no momento em que processos interativos aguardam I\/O, outros processos podem ser executados na CPU.<\/p>\n<h3>O Or\u00e1culo n\u00e3o existe mais.<\/h3>\n<p>\n Agora tentaremos nos livrar da suposi\u00e7\u00e3o de que o tempo de execu\u00e7\u00e3o da tarefa \u00e9 conhecido. Essa suposi\u00e7\u00e3o \u00e9, em geral, a mais errada e irrealista de toda a lista. Na verdade, em sistemas operacionais comuns, o pr\u00f3prio SO geralmente sabe muito pouco sobre o tempo de execu\u00e7\u00e3o das tarefas, como podemos ent\u00e3o construir um planejador sem saber quanto tempo a tarefa levar\u00e1? Talvez pud\u00e9ssemos usar alguns princ\u00edpios de RR para resolver esse problema?<\/p>\n<h3>Resultado<\/h3>\n<p>\n Examinamos as ideias b\u00e1sicas de escalonamento de tarefas e revisamos dois grupos de planejadores. O primeiro inicia a tarefa mais curta primeiro, melhorando assim o tempo de retorno, enquanto o segundo se divide igualmente entre todas as tarefas, melhorando o tempo de resposta. Ambos os algoritmos s\u00e3o ruins onde os algoritmos do outro grupo s\u00e3o bons. Tamb\u00e9m examinamos como o uso paralelo de CPU e I\/O pode melhorar o desempenho, mas ainda n\u00e3o resolvemos o problema da previs\u00e3o do SO. E na pr\u00f3xima aula, veremos um planejador que observa o passado recente e tenta prever o futuro. Ele se chama fila de feedback multi-n\u00edvel.<br \/>\n<br \/>Fonte: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/449026\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u0425\u043e\u0447\u0443 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432\u0430\u0448\u0435\u043c\u0443 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044e \u0441\u0435\u0440\u0438\u044e \u0441\u0442\u0430\u0442\u0435\u0439-\u043f\u0435\u0440\u0435\u0432\u043e\u0434\u043e\u0432 \u043e\u0434\u043d\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0439 \u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u043b\u0438\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u044b \u2014 OSTEP. \u0412 \u044d\u0442\u043e\u043c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0435 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0433\u043b\u0443\u0431\u043e\u043a\u043e \u0440\u0430\u0431\u043e\u0442\u0430 unix-\u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u2014 \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430\u043c\u0438, \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0430\u043c\u0438, \u043f\u0430\u043c\u044f\u0442\u044c\u044e \u0438 \u043f\u0440\u043e\u0447\u0438\u0438\u043c\u0438 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u043c\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u041e\u0421. \u041e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0432\u0441\u0435\u0445 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u0432 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432\u043e\u0442 \u0442\u0443\u0442. [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":23990,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-32158","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u0425\u043e\u0447\u0443 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432\u0430\u0448\u0435\u043c\u0443 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044e \u0441\u0435\u0440\u0438\u044e \u0441\u0442\u0430\u0442\u0435\u0439-\u043f\u0435\u0440\u0435\u0432\u043e\u0434\u043e\u0432 \u043e\u0434\u043d\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0439 \u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u043b\u0438\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u044b \u2014 OSTEP.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/operating-systems-three-easy-pieces-part-4-vvedenie-v-planirovshhik-perevod\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"pt_PT\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47Operating Systems: Three Easy Pieces. Part 4: \u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a (\u043f\u0435\u0440\u0435\u0432\u043e\u0434) | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u0425\u043e\u0447\u0443 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432\u0430\u0448\u0435\u043c\u0443 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044e \u0441\u0435\u0440\u0438\u044e \u0441\u0442\u0430\u0442\u0435\u0439-\u043f\u0435\u0440\u0435\u0432\u043e\u0434\u043e\u0432 \u043e\u0434\u043d\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0439 \u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u043b\u0438\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u044b \u2014 OSTEP.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/operating-systems-three-easy-pieces-part-4-vvedenie-v-planirovshhik-perevod\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T18:45:27+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T18:45:27+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Sistemas Operacionais: Tr\u00eas Pe\u00e7as F\u00e1ceis. Parte 4: Introdu\u00e7\u00e3o ao Planejador (tradu\u00e7\u00e3o) | ProHoster","description":"Introdu\u00e7\u00e3o aos sistemas operacionais Ol\u00e1, Habr! Gostaria de apresentar a voc\u00eas uma s\u00e9rie de artigos-tradu\u00e7\u00f5es de uma literatura que considero interessante \u2014 OSTEP.","canonical_url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/operating-systems-three-easy-pieces-part-4-vvedenie-v-planirovshhik-perevod","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pt_PT","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47Operating Systems: Three Easy Pieces. Part 4: \u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a (\u043f\u0435\u0440\u0435\u0432\u043e\u0434) | ProHoster","og:description":"\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u0425\u043e\u0447\u0443 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432\u0430\u0448\u0435\u043c\u0443 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044e \u0441\u0435\u0440\u0438\u044e \u0441\u0442\u0430\u0442\u0435\u0439-\u043f\u0435\u0440\u0435\u0432\u043e\u0434\u043e\u0432 \u043e\u0434\u043d\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0439 \u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u043b\u0438\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u044b \u2014 OSTEP.","og:url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/operating-systems-three-easy-pieces-part-4-vvedenie-v-planirovshhik-perevod","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T18:45:27+00:00","article:modified_time":"2019-10-31T18:45:27+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"32158","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-21 09:34:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 03:03:25","updated":"2026-01-21 09:34:19","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/32158","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/comments?post=32158"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/32158\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media\/23990"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media?parent=32158"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/categories?post=32158"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/tags?post=32158"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}