- Aprender
- Computação e TI
- Ciência da computação
- Sistemas operacionais
- Escalonamento de CPU
Escalonamento de CPU
IntermediárioAula 2 de 9 do curso Curso de Sistemas operacionais
O que você vai aprender
- Explique em que momentos da vida de um processo ocorrem decisões de escalonamento, diferencie o escalonamento preemptivo do não preemptivo e calcule as métricas usadas para comparar políticas de escalonamento.
- Explique quando e como o escalonador escolhe a próxima tarefaSitue o escalonador de CPU no ciclo de vida de um processo, diferencie o escalonamento preemptivo do não preemptivo e nomeie os tipos de escalonador que um sistema operacional pode ter.
- Calcule os tempos de retorno, de resposta e de esperaDesenhe a linha do tempo de um escalonamento, calcule os tempos de retorno, de resposta e de espera, a vazão e a utilização da CPU e explique a que objetivo cada métrica atende.
- Explique quando e como o escalonador escolhe a próxima tarefa
- Escalone um conjunto de tarefas segundo as políticas clássicas, calcule o desempenho de cada uma e explique por que cada política atende a algumas cargas de trabalho e falha em outras.
- Escalone tarefas com FIFO e tarefa mais curta primeiroAplique o escalonamento FIFO e o escalonamento não preemptivo por tarefa mais curta primeiro, explique o efeito comboio e estime tempos de execução que não são conhecidos de antemão.
- Use preempção para atender tarefas mais curtas e sobreponha entrada e saídaAplique o escalonamento por menor tempo restante primeiro, explique quando a preempção melhora o tempo de retorno e mantenha a CPU ocupada executando outras tarefas enquanto uma espera por entrada e saída.
- Use escalonamento circular para obter respostas rápidasAplique o escalonamento circular, explique seu efeito sobre os tempos de resposta e de retorno e escolha uma fatia de tempo adequada.
- Use prioridades sem causar inanição de tarefasAplique o escalonamento por prioridade, interprete as diferentes escalas de prioridade usadas na prática e previna a inanição e a inversão de prioridade.
- Escalone tarefas com FIFO e tarefa mais curta primeiro
- Explique como as filas multinível com realimentação aprendem com o comportamento de uma tarefa para aproximar o escalonamento por tarefa mais curta primeiro e manter respostas rápidas para tarefas interativas, e como suas regras são ajustadas contra a inanição e a manipulação do escalonador.
- Acompanhe tarefas nas filas multinível com realimentaçãoApresente as regras básicas das filas multinível com realimentação e acompanhe como tarefas limitadas por processamento, curtas e interativas se movem entre suas filas.
- Ajuste as MLFQ para combater a inanição e a manipulação do escalonadorExplique os problemas das regras básicas de MLFQ, corrija-os com elevações de prioridade e melhor contabilização e escolha seus parâmetros.
- Acompanhe tarefas nas filas multinível com realimentação
- Explique o escalonamento por parcela proporcional, calcule as parcelas dadas pelo escalonamento por loteria, por passos e pelos escalonadores justos do Linux e compare seus pontos fortes.
- Compartilhe a CPU por loteriaRepresente parcelas com bilhetes, realize um sorteio, preveja quanto o escalonamento por loteria se aproxima das parcelas desejadas e use moeda, transferência e inflação de bilhetes.
- Obtenha parcelas exatas com escalonamento por passosCalcule passos e valores de passagem, acompanhe um escalonamento por passos e compare-o com o escalonamento por loteria.
- Explique os escalonadores justos do Linux: CFS e EEVDFCalcule fatias de tempo e tempo de execução virtual no escalonador completamente justo, relacione valores de nice a pesos e descreva como o EEVDF escolhe a próxima tarefa.
- Compartilhe a CPU por loteria
- Explique como caches, coerência e afinidade alteram o escalonamento em um multiprocessador e compare projetos com fila única e com múltiplas filas que equilibram a carga entre CPUs.
- Explique o que muda com várias CPUsDescreva o hardware multiprocessador da perspectiva do escalonador: caches privados, coerência de cache, necessidade de travas, afinidade de cache e diferentes tipos de núcleos de processamento.
- Compare o escalonamento multiprocessador com fila única e com múltiplas filasCompare escalonadores multiprocessadores com fila única e com múltiplas filas, reconheça desequilíbrios de carga e corrija-os com migração e roubo de trabalho.
- Explique o que muda com várias CPUs
- Analise como Linux, Windows e outros sistemas combinam prioridades, realimentação e compartilhamento proporcional, controle-os com ferramentas padrão e escolha e avalie uma política para uma determinada carga de trabalho.
- Controle o escalonador do LinuxDescreva as políticas de escalonamento do Linux e sua história e use valores de nice, políticas de tempo real, afinidade de CPU e grupos de controle.
- Analise o Windows e outros sistemas como escalonadores do tipo MLFQCalcule prioridades base do Windows, explique elevações dinâmicas de prioridade e seu decaimento e reconheça as mesmas ideias de realimentação em outros sistemas.
- Escolha e avalie uma política de escalonamento para uma carga de trabalhoAssocie políticas de escalonamento a cargas de trabalho, compare-as em um exemplo e escolha um método para avaliar um escalonador.
- Controle o escalonador do Linux
Guia de estudo de Escalonamento de CPU
1Decida quem executa e avalie o resultado
Uma CPU pode executar uma thread por vez, mas um sistema ocupado pode ter muitas threads prontas para usá-la. O escalonador decide qual trabalho avança a cada oportunidade. Para avaliar essa escolha, acompanhe tanto os estados dos processos quanto o tempo: uma primeira vez rápida, uma conclusão antecipada e uma alta taxa de trabalho concluído descrevem sucessos diferentes. Uma linha do tempo torna essas diferenças visíveis e fornece as evidências para comparar políticas.
1.1 De tarefa pronta a tarefa em execução
Um escalonador de CPU escolhe o processo ou a thread no estado de pronto que executará em seguida em uma CPU. A regra que ele segue é sua política. O despachante realiza a escolha ao transferir a execução para a tarefa selecionada. Uma política diferente pode usar o mesmo mecanismo de troca.
Acompanhe as mudanças de estado
Uma tarefa em execução ocupa uma CPU. Uma tarefa pronta poderia executar, mas está esperando sua vez. Uma tarefa bloqueada espera por um evento, como a conclusão de uma leitura de disco. Apenas tarefas prontas são candidatas à seleção.
Suponha que um editor inicie uma leitura de disco enquanto um compilador está pronto. O editor passa de execução para bloqueado, então o compilador pode executar. Quando a leitura termina, uma interrupção deixa o editor pronto novamente. Ele não necessariamente executa imediatamente: a política precisa escolher entre ele e outras tarefas prontas.
Decisões de escalonamento ocorrem quando uma tarefa bloqueia, termina, fica pronta ou é interrompida e devolvida ao estado de pronto. Ceder a CPU voluntariamente também a libera. Preempção significa retirar a CPU de uma tarefa que poderia continuar executando; a tarefa mantém seu estado salvo e pode ser retomada depois.
| Tipo de política | Quando uma tarefa em execução libera a CPU | Efeito de uma nova tarefa pronta |
|---|---|---|
| Não preemptiva | Ela bloqueia, cede a CPU ou termina | A nova tarefa espera uma oportunidade de decisão |
| Preemptiva | Ela também pode perder a CPU enquanto ainda está apta a executar | A nova tarefa pode substituir a tarefa atual |
Uma interrupção do temporizador permite que o núcleo imponha uma fatia de tempo, mesmo que um programa execute um laço sem ceder a CPU. Uma operação de entrada e saída concluída também pode provocar preempção ao deixar pronta uma tarefa mais favorecida. Linux, Windows e macOS usam escalonamento preemptivo.
O trabalho vem em rajadas
Os programas alternam entre rajadas de CPU, quando fazem cálculos, e períodos de espera por entrada e saída. Um programa limitado por processamento, como um codificador, tem longas rajadas de CPU. Um programa limitado por entrada e saída, como um editor, frequentemente processa por pouco tempo e depois espera. Atender rapidamente a um editor após o pressionamento de uma tecla pode melhorar a resposta sem dar a ele muito tempo total de CPU.
O despachante salva o estado da tarefa anterior, restaura os registradores da tarefa escolhida e retoma sua sequência de instruções em modo usuário. Latência de despacho é o tempo necessário para transferir a execução. A troca também afeta os caches e o buffer de tradução de endereços, ou TLB, que armazena traduções de endereços. A próxima tarefa pode precisar preenchê-los novamente, então o tempo para salvar registradores é apenas parte do custo.
Três escalas de tempo do escalonamento
O escalonador de longo prazo admite tarefas enviadas e controla quantas estão no sistema. O escalonador de médio prazo pode suspender processos inteiros, retirando-os da memória e restaurando-os depois. O escalonador de curto prazo seleciona a próxima tarefa pronta e atua frequentemente. Sistemas de uso geral dependem principalmente dessa última função; sistemas em lote e clusters também podem controlar a admissão explicitamente.
Comece uma comparação de políticas com tarefas simples que usam apenas a CPU e têm durações conhecidas. Depois varie uma característica: durações diferentes expõem os atrasos do FIFO, chegadas posteriores expõem os limites da ausência de preempção, operações de entrada e saída criam oportunidades para sobrepor trabalho e durações desconhecidas exigem previsão ou realimentação.
Principais conclusões
- Apenas tarefas prontas podem ser selecionadas para executar.
- Uma política de escalonamento escolhe; o despachante realiza a troca.
- A preempção preserva uma tarefa para que ela possa ser retomada.
- Interrupções do temporizador e de dispositivos podem criar oportunidades de escalonamento.
- Trocas frequentes custam tempo de despacho e prejudicam a localidade de cache.
- Admissão, retirada da memória e seleção para a CPU atuam em escalas de tempo diferentes.
1.2 Leia os tempos em um escalonamento
Um escalonamento mostra quando as tarefas executam. Uma métrica indica qual parte desse escalonamento é relevante. Registre a chegada, a primeira execução e a conclusão de cada tarefa antes de calcular qualquer média.
Separe os três tempos
O tempo de retorno mede todo o intervalo entre a chegada e a conclusão. O tempo de resposta mede a demora até a primeira execução. O tempo de espera soma todos os intervalos em que a tarefa está pronta, mas não executa.
Para uma tarefa que usa apenas a CPU, o tempo de retorno é igual à espera mais o tempo de execução na CPU. Com entrada e saída, o tempo bloqueado também faz parte do retorno, então subtrair apenas o tempo de CPU superestimaria a espera. Aqui, a resposta usa a definição baseada na primeira execução; um serviço voltado ao usuário pode medir separadamente o tempo até sua primeira saída.
Analise uma linha do tempo FIFO
A chega em 0 ms e precisa de 8 ms de tempo de CPU. B chega em 1 ms e precisa de 4 ms. C chega em 2 ms e precisa de 2 ms. Sem custo de troca, FIFO resulta em:
- A: 0–8 ms.
- B: 8–12 ms.
- C: 12–14 ms.
| Tarefa | Retorno | Resposta | Espera |
|---|---|---|---|
| A | ms | ms | 0 ms |
| B | ms | ms | 7 ms |
| C | ms | ms | 10 ms |
O tempo médio de retorno é ms. Os tempos médios de resposta e de espera são ambos ms. Eles coincidem porque cada tarefa executa uma vez sem interrupção. Com preempção, uma tarefa pode voltar a esperar após sua primeira vez, então a espera pode superar a resposta.
Avalie toda a carga de trabalho
A vazão conta as tarefas concluídas por unidade de tempo decorrido. O escalonamento conclui três tarefas em 14 ms, aproximadamente 214,29 tarefas/s. A utilização da CPU é o tempo em que a CPU está ocupada dividido pelo tempo decorrido; aqui é 100% porque a CPU nunca fica ociosa. Especifique o intervalo de medição: acrescentar um período ocioso após a conclusão alteraria ambos os valores.
Uma alta utilização ainda pode vir acompanhada de longas esperas. Ela também não significa necessariamente que todo o tempo ocupado seja trabalho útil das aplicações: medições reais podem contar trocas e outros trabalhos do núcleo como tempo ocupado. Indique se um cálculo de sobrecarga mede tempo ocupado ou trabalho útil.
Escolha o que otimizar
Trabalho em lote frequentemente valoriza o tempo médio de retorno. Trabalho interativo valoriza uma resposta rápida. Serviços compartilhados precisam de acesso justo e também de vazão. Inanição significa que uma tarefa elegível espera indefinidamente, então uma boa média, por si só, não demonstra tratamento justo.
Examine os atrasos individuais e a cauda da distribuição. Um tempo de resposta no percentil 99 descreve o atraso no qual ou abaixo do qual ficam aproximadamente 99% das observações; alguns atrasos graves podem desaparecer dentro de uma média baixa. Sempre subtraia o instante de chegada da própria tarefa e conte seus intervalos de execução como atendimento, nunca como espera.
Principais conclusões
- O tempo de retorno termina na conclusão; o de resposta termina na primeira execução.
- A espera conta os intervalos no estado de pronto e exclui os intervalos de bloqueio.
- Subtraia o instante de chegada de cada tarefa antes de calcular a média.
- Vazão e utilização dependem do intervalo de observação.
- Examine atrasos na cauda e inanição junto com as médias.
2Acompanhe as políticas clássicas de escalonamento
As mesmas tarefas prontas podem terminar em ordens muito diferentes conforme a política. FIFO segue a chegada, políticas de tarefa mais curta favorecem pequenas demandas de CPU, o escalonamento circular alterna as vezes e o escalonamento por prioridade segue uma classificação. Construa a linha do tempo a partir da regra em cada momento de decisão e depois calcule o resultado. Chegadas posteriores, tarefas bloqueadas e custos de troca revelam escolhas de compromisso que uma única ordenação de tarefas não consegue mostrar. Os acompanhamentos manuais ignoram o custo de troca, salvo indicação em contrário.
2.1 FIFO e a rajada pronta mais curta
FIFO, também chamado de primeiro a chegar, primeiro a ser atendido ou FCFS, executa tarefas prontas em ordem de chegada. É não preemptivo: uma chegada posterior não pode interromper uma rajada de CPU em execução. Em exemplos que usam apenas a CPU, cada tarefa selecionada executa até a conclusão.
Observe o efeito comboio
A, B e C chegam juntas. A precisa de 60 ms; B e C precisam de 6 ms cada uma. Com A primeiro, FIFO executa A 0–60, B 60–66 e C 66–72. Os tempos de retorno são 60, 66 e 72 ms, com média de 66 ms. As tarefas pequenas passam a maior parte de seu tempo esperando atrás de A. Esse é o efeito comboio.
Tarefa mais curta primeiro (SJF) seleciona a próxima rajada de CPU mais curta entre as tarefas prontas e não a preempta. Com as mesmas chegadas, executa B 0–6, C 6–12 e depois A 12–72. O tempo médio de retorno passa a ser ms. O trabalho total de CPU continua sendo 72 ms; a melhora vem da conclusão mais cedo das tarefas curtas.
Por que isso ajuda? Se uma rajada longa executa imediatamente antes de uma curta, ambas as tarefas esperam por todo o trabalho anterior. Trocar apenas essas duas reduz o atraso da tarefa curta pela duração da rajada longa, enquanto aumenta o atraso da tarefa longa apenas pela duração da rajada curta. Repetir essas trocas coloca as rajadas em ordem crescente. Quando todas as tarefas chegam juntas e suas durações são conhecidas, SJF minimiza os tempos médios de retorno e de espera; a resposta até a primeira execução também é igual à espera nesse caso não preemptivo com tarefas que usam apenas a CPU.
Restrinja a escolha às tarefas prontas
Agora A chega em 0 ms, enquanto B e C chegam em 10 ms. Em 0 ms, A é a única opção. O SJF não preemptivo executa A 0–60, B 60–66, C 66–72. Os tempos de retorno são 60, 56 e 62 ms, com média de aproximadamente 59,33 ms. SJF não pode agir sobre uma tarefa futura nem interromper uma rajada que já iniciou.
| Política | Informação usada | Principal fraqueza |
|---|---|---|
| FIFO | Ordem de chegada | Trabalho curto pode esperar atrás de trabalho longo |
| SJF | Duração prevista da próxima rajada | Trabalho longo pode ser adiado por chegadas repetidas de tarefas curtas |
FIFO evita a inanição quando as tarefas à frente acabam liberando a CPU. SJF pode causar inanição de uma tarefa longa em espera se tarefas curtas continuarem chegando.
Preveja uma rajada
A próxima rajada de CPU geralmente é desconhecida. Uma média exponencial combina a última rajada medida com a previsão anterior:
Aqui, é a rajada medida, a previsão anterior e um peso entre 0 e 1. Começando com 10 ms e usando , uma medição de 6 ms gera uma previsão de 8 ms. Uma medição seguinte de 4 ms gera 6 ms; outra de 6 ms mantém a previsão em 6 ms. Com peso zero, as medições não têm efeito; com peso um, apenas a medição mais recente importa. A grandeza prevista é a duração da rajada de CPU, não o tamanho do arquivo do programa ou o número de linhas.
Principais conclusões
- FIFO usa a ordem de chegada e pode criar um comboio.
- SJF escolhe a rajada mais curta que já está pronta.
- O tempo médio ótimo do SJF exige as hipóteses adequadas sobre a carga de trabalho.
- Chegadas posteriores não podem interromper o SJF não preemptivo.
- A média exponencial equilibra medições recentes com previsões anteriores.
- Um fluxo de tarefas curtas pode causar inanição de uma tarefa longa no SJF.
2.2 Interrompa uma tarefa longa e sobreponha entrada e saída
Menor tempo restante primeiro (STCF, também SRTF) é o SJF preemptivo. Em uma chegada ou conclusão, compare o tempo de CPU de que cada tarefa pronta ainda precisa. Uma recém-chegada interrompe a tarefa atual quando precisa de menos tempo do que resta à atual.
Compare o tempo restante
A precisa de 60 ms e chega em 0 ms. B e C precisam de 6 ms cada uma e chegam em 10 ms. A executa por 10 ms, restando 50 ms. Em 10 ms, B vence porque 6 ms é menos que 50 ms; C tem a mesma duração, então a ordem de chegada e depois o nome resolvem o empate.
A linha do tempo é A 0–10, B 10–16, C 16–22, A 22–72. Os tempos de retorno são A 72 ms, B 6 ms e C 12 ms, com média de 30 ms. Os tempos de resposta são 0, 0 e 6 ms, com média de 2 ms. O SJF não preemptivo com essas chegadas tem médias de aproximadamente 59,33 ms de retorno e 35,33 ms de resposta.
Sempre subtraia o atendimento já recebido. Comparar uma nova rajada de 12 ms com os 60 ms originais de A estaria errado se restassem apenas 5 ms a A. STCF concluiria A primeiro. Com durações conhecidas de tarefas que usam apenas a CPU e custo de troca zero, STCF minimiza o tempo médio de retorno para chegadas arbitrárias. Tarefas longas ainda podem sofrer inanição sob um fluxo contínuo de trabalho mais curto.
Quando todas as tarefas que usam apenas a CPU chegam juntas, SJF e STCF produzem a mesma ordem. A tarefa mais curta em execução só fica mais curta, então nenhuma tarefa em espera se torna motivo para preemptá-la.
Use o tempo de bloqueio de outra tarefa
Uma tarefa bloqueada não pode usar a CPU. Sua espera por entrada e saída é uma oportunidade para executar outras tarefas prontas, mesmo com uma política não preemptiva. A preempção volta a ser relevante quando a conclusão de uma operação de entrada e saída deixa uma rajada curta pronta enquanto outra tarefa executa.
Considere A com cinco rajadas de CPU de 10 ms e uma leitura de disco de 10 ms após cada uma de suas quatro primeiras rajadas. B precisa de uma rajada de CPU de 50 ms. Ambas chegam em 0 ms. Se a CPU ficar ociosa durante as leituras de A e adiar B até A terminar, A conclui em 90 ms e B em 140 ms.
Trate cada rajada de A que retorna como uma tarefa curta pronta:
- A executa 0–10; sua leitura ocupa 10–20 enquanto B executa.
- A retorna para 20–30; restam 40 ms a B, então os 10 ms de A vencem.
- B executa 30–40 durante a próxima leitura. A alternância se repete.
- A última rajada de A executa 80–90; B conclui seus últimos 10 ms durante 90–100.
A ainda termina em 90 ms, mas B termina em 100 ms. A CPU realiza 100 ms de trabalho em 100 ms de tempo decorrido. A atividade de disco e a atividade de CPU se sobrepõem; a CPU não executa A enquanto A está bloqueada. Uma interrupção de dispositivo marca A como pronta quando cada leitura termina, após o que STCF compara sua nova rajada com o trabalho restante de B.
Principais conclusões
- STCF compara a demanda restante de CPU nos momentos de decisão.
- A preempção pode permitir que tarefas curtas que chegam depois terminem muito mais cedo.
- Com chegadas simultâneas de tarefas que usam apenas a CPU, SJF e STCF coincidem.
- Uma tarefa bloqueada libera a CPU para que outro trabalho possa se sobrepor à sua entrada e saída.
2.3 Alterne as vezes com escalonamento circular
O escalonamento circular (RR) mantém uma fila FIFO de tarefas prontas e dá à tarefa da frente no máximo um quantum, ou fatia de tempo. Uma tarefa que termina ou bloqueia deixa a CPU antes. Uma tarefa que ainda está pronta quando sua fatia termina vai para o fim da fila.
Acompanhe as vezes antes de calcular os tempos
A, B e C chegam em 0 ms e precisam de 9 ms cada uma. Com um quantum de 3 ms, RR executa:
- Primeira rodada: A 0–3, B 3–6, C 6–9.
- Segunda rodada: A 9–12, B 12–15, C 15–18.
- Última rodada: A 18–21, B 21–24, C 24–27.
As primeiras execuções ocorrem em 0, 3 e 6 ms, então o tempo médio de resposta é 3 ms. As conclusões ocorrem em 21, 24 e 27 ms, então o tempo médio de retorno é 24 ms. FIFO resulta em tempo médio de resposta de 9 ms e tempo médio de retorno de 18 ms. Aqui RR inicia todas rapidamente, mas adia a primeira conclusão até 21 ms.
RR divide o acesso à CPU enquanto as tarefas competem; ele não iguala os tempos de conclusão. Uma tarefa curta pode terminar em sua primeira vez. Com um conjunto fixo de tarefas prontas e quantum , a espera entre as vezes é de no máximo sem custos de troca. Chegadas contínuas, outras classes de prioridade e restrições às CPUs em que uma tarefa pode executar alteram as condições desse limite.
Trate chegadas no limite de uma fatia
Use a ordem de chegada e depois a ordem alfabética para desempates. Uma tarefa que chega exatamente quando uma fatia termina entra antes da tarefa preemptada. Com A chegando em 0 ms e precisando de 8 ms, B em 1 ms precisando de 4 ms e C em 2 ms precisando de 2 ms, um quantum de 2 ms resulta em A 0–2, B 2–4, C 4–6, A 6–8, B 8–10, A 10–14.
O intervalo final de A contém duas vezes consecutivas sem concorrente. Os tempos de resposta são 0, 1 e 2 ms; os tempos de retorno são 14, 9 e 4 ms. Suas médias são 1 ms e 9 ms. Quando uma tarefa bloqueada retorna no RR básico, ela entra para uma nova vez; não reserva tempo de CPU não usado enquanto está bloqueada.
Faça o quantum valer seu custo
Um quantum muito grande faz RR se comportar como FIFO para rajadas mais curtas que esse quantum. Um quantum minúsculo cria muitos despachos e perturbações repetidas nos caches. Em uma implementação simples baseada em temporizador, o quantum é um número inteiro de períodos do temporizador.
Para um custo de troca após cada fatia útil de duração , a fração aproximada de sobrecarga é . Uma troca de 0,1 ms custa cerca de 9,1% com uma fatia de 1 ms, mas cerca de 0,99% com uma fatia de 10 ms. Fatias mais longas amortizam o custo de troca ao distribuí-lo por mais trabalho útil.
Uma regra prática comum de dimensionamento é permitir que a maioria das rajadas, por exemplo, cerca de 80%, termine em uma fatia. A escolha adequada depende das durações medidas das rajadas e dos atrasos de resposta que a carga de trabalho tolera. Conte as trocas entre tarefas separadamente dos eventos do temporizador que apenas permitem que a mesma única tarefa pronta continue.
Principais conclusões
- RR coloca novamente na fila uma tarefa pronta que não terminou após seu quantum.
- A resposta pode melhorar enquanto o tempo médio de retorno cresce.
- As regras para chegadas no limite da fatia determinam a ordem da fila.
- Um quantum curto aumenta a sobrecarga de troca.
- Fatias mais longas amortizam os custos de despacho e de cache.
2.4 Prioridades, envelhecimento e dependências de travas
Um escalonador por prioridade executa a tarefa pronta de maior prioridade. Tarefas de mesma prioridade podem seguir FIFO ou escalonamento circular. Em uma versão preemptiva, uma tarefa recém-pronta de prioridade mais alta recebe a CPU imediatamente; em uma versão não preemptiva, ela espera até que a tarefa atual a libere.
Identifique a direção da escala
Os números de prioridade não seguem uma direção universal. Nos exemplos dos livros apresentados aqui, use números menores para prioridades mais altas. Os valores de nice do Linux seguem essa direção, mas os níveis de prioridade do Windows e as prioridades de tempo real do Linux usam números maiores para prioridades mais altas.
A, B e C chegam em 0 ms com rajadas de 4, 3 e 5 ms e prioridades 2, 1 e 3. O escalonamento não preemptivo por prioridade executa B 0–3, A 3–7 e C 7–12. Seus tempos de espera são 0, 3 e 7 ms, com média de aproximadamente 3,33 ms; os tempos de retorno são 3, 7 e 12 ms, com média de aproximadamente 7,33 ms.
Uma prioridade interna vem de comportamento medido, como uso da CPU ou esperas por entrada e saída. SJF determina a classificação a partir da duração prevista da rajada. Uma prioridade externa vem de uma pessoa, como um administrador que marca um backup como menos urgente. Nenhuma das escolhas garante que trabalho de baixa prioridade receba tempo de CPU quando há uma chegada contínua de trabalho de prioridade mais alta.
Aumente a prioridade com a espera
O envelhecimento aumenta gradualmente a prioridade de uma tarefa em espera. Se a classificação melhora uma posição a cada 100 ms, uma tarefa que começa na prioridade 20 chega à prioridade máxima 0 após 2 s de espera no estado de pronto. Uma classificação mais alta a coloca em competição com o trabalho favorecido; as regras de desempate determinam a vez de cada tarefa com a mesma classificação.
A inanição é a falta de progresso causada pela seleção repetida de outro trabalho. O envelhecimento a combate mudando a classificação ao longo do tempo. Ele tem uma finalidade diferente da previsão da duração de rajadas: uma tarefa longa que espera há muito tempo pode merecer uma vez, embora sua rajada continue longa.
Acompanhe a dependência na inversão de prioridade
Uma tarefa H de alta prioridade pode estar bloqueada por uma trava mantida pela tarefa L de baixa prioridade. Uma tarefa M de prioridade média pode preemptar L. Agora H não pode prosseguir, embora M tenha prioridade menor que H: L precisa executar primeiro para liberar a trava. Essa é a inversão de prioridade.
Com a herança de prioridade, L herda temporariamente a prioridade de H enquanto mantém a trava de que H precisa. M não consegue mais impedir que L use a CPU. L executa, libera a trava e perde a prioridade herdada; H fica pronta e pode executar.
| Problema | Causa | Resposta do escalonamento |
|---|---|---|
| Inanição | Outro trabalho pronto continua tendo prioridade sobre uma tarefa | O envelhecimento aumenta sua classificação com a espera |
| Inversão de prioridade | Trabalho favorecido espera por quem mantém uma trava e tem classificação mais baixa | A herança eleva a prioridade de quem mantém a trava enquanto dura a dependência |
Aumentar a própria prioridade de H não libera a trava: H continua bloqueada. O essencial é permitir que a thread capaz de satisfazer a dependência execute. Em 1997, a Mars Pathfinder enfrentou um problema de inversão de prioridade que foi resolvido com a ativação da herança de prioridade.
Principais conclusões
- Verifique qual direção indica prioridade mais alta.
- O envelhecimento eleva a prioridade de tarefas em espera para combater a inanição.
- Uma tarefa bloqueada de alta prioridade não pode executar até que sua dependência seja satisfeita.
- A herança de prioridade eleva temporariamente a prioridade de quem mantém a trava.
3Aprenda o comportamento de uma tarefa com filas de realimentação
A próxima rajada de CPU raramente é conhecida de antemão. As filas multinível com realimentação aprendem com o uso da CPU: novas tarefas recebem uma oportunidade inicial, enquanto o processamento contínuo desce para filas com atendimento menos urgente. Acompanhar tanto a fila de cada tarefa quanto a cota consumida explica esse comportamento. Elevações periódicas e contabilização cuidadosa tratam então das duas principais falhas: tarefas que esperam demais e tarefas que cedem a CPU estrategicamente para manter sua classificação.
3.1 Mova tarefas pelas filas de realimentação
As filas multinível com realimentação (MLFQ) combinam prioridades com escalonamento circular. Seu objetivo é aproximar o atendimento de tarefas curtas e manter respostas rápidas para o trabalho interativo sem receber o tempo futuro de execução de cada tarefa. O uso recente da CPU fornece a realimentação.
Aplique as regras das filas
Cada tarefa pronta pertence a uma fila de prioridade. A versão básica com contabilização segue quatro regras:
- Escolha a fila de maior prioridade que contenha trabalho pronto.
- Nessa fila, alterne as tarefas de mesma prioridade com escalonamento circular.
- Coloque uma nova tarefa na fila mais alta.
- Rebaixe uma tarefa quando ela consumir sua cota de tempo de CPU no nível atual, contando o uso ao longo de todas as vezes em que executou e das interrupções por entrada e saída.
Um quantum limita uma vez de execução. Uma cota limita o atendimento total em um nível de prioridade. Um nível pode permitir vários quanta antes do rebaixamento. No nível mais baixo, um rebaixamento mantém a tarefa na fila inferior.
Isso dá a uma nova tarefa a chance de terminar rapidamente. Uma tarefa que consome tempo de CPU repetidamente revela uma demanda maior e desce. Uma rajada curta que bloqueia consome pouca cota, então tarefas interativas tendem a permanecer nos níveis superiores por mais tempo.
Acompanhe uma tarefa longa e uma recém-chegada
Use as filas Q2, Q1 e Q0, com Q2 como a mais alta, quanta de 10 ms e cotas de 10 ms em cada nível, sem elevação de prioridade durante este acompanhamento. A precisa de 200 ms e chega em 0 ms. Ela executa em Q2 de 0–10, em Q1 de 10–20 e depois em Q0.
Em 100 ms, A recebeu 100 ms de tempo de CPU. B chega precisando de 20 ms. B entra em Q2 e preempta A, depois executa 100–110 em Q2. Ela consumiu a cota desse nível e desce para Q1. Q1 tem prioridade maior que Q0, onde está A, então B executa 110–120 e termina. A retoma em 120 e conclui seus 100 ms restantes em 220 ms. O tempo de retorno de B é 20 ms, apesar de chegar depois de uma tarefa muito mais longa.
Acompanhe o trabalho restante de A enquanto B executa: ele permanece em 100 ms. O tempo decorrido avança durante o atendimento de B, mas A não recebe atendimento da CPU nesse período.
Separe espera de consumo de CPU
Um editor que executa por 1 ms e espera por entrada usa uma cota de 10 ms ao longo de dez dessas rajadas. O tempo bloqueado não conta na cota de CPU. Com contabilização rigorosa, essas rajadas curtas ainda se somam, então o editor acaba descendo, a menos que uma elevação de prioridade o reinicie primeiro.
Uma regra inicial da MLFQ rebaixava apenas tarefas que usavam um quantum inteiro sem interrupção. Uma tarefa que cedia a CPU pouco antes do fim mantinha sua prioridade. Essa regra tornava o trabalho interativo responsivo, mas também permitia manipulação deliberada. Contar o uso cumulativo de CPU fecha essa brecha.
As filas inferiores executam sempre que nenhuma fila superior tem trabalho pronto. Uma tarefa de prioridade mais alta que está bloqueada não impede que tarefas de prioridade mais baixa usem a CPU. Sob demanda contínua de alta prioridade, o trabalho de prioridade mais baixa precisa de um mecanismo adicional contra a inanição, fornecido por elevações periódicas.
Principais conclusões
- A MLFQ aprende com o uso observado da CPU, sem conhecer as durações de rajadas futuras.
- A fila pronta de maior prioridade vence; tarefas de mesma prioridade se alternam.
- Novas tarefas entram no topo.
- Quantum e cota controlam partes diferentes do escalonamento.
- A contabilização cumulativa de CPU inclui o atendimento anterior ao bloqueio de uma tarefa.
3.2 Previna a inanição e a cessão estratégica da CPU
A realimentação cria uma separação útil, mas o comportamento passado de uma tarefa pode deixar de representar suas necessidades atuais. Um cálculo longo pode se tornar interativo mais tarde. Enquanto isso, uma tarefa na fila inferior pode esperar indefinidamente se as filas superiores permanecerem ocupadas.
Reavalie cada tarefa periodicamente
Uma elevação de prioridade move todas as tarefas de volta para a fila mais alta após um período . Ela permite que tarefas em espera compartilhem a fila superior e que o escalonador aprenda novamente o comportamento alterado. Uma tarefa promovida e limitada por processamento depois consome sua cota e volta a descer.
Considere as primeiras regras da MLFQ: duas tarefas interativas sempre cedem a CPU antes de uma fatia completa de 10 ms e juntas mantêm Q2 ocupada. Uma tarefa limitada por processamento espera em Q0. Sem elevações, ela não recebe atendimento. Em um escalonamento repetitivo no qual uma elevação a cada 100 ms lhe dá uma vez de 10 ms no nível superior antes de ser rebaixada e o trabalho de maior prioridade ocupa o restante, ela recebe 10% da CPU. Essa porcentagem vem deste acompanhamento; uma elevação não atribui uma parcela fixa geral.
Um período de elevação longo deixa esperas longas entre oportunidades. Um período muito curto reinicia repetidamente o trabalho limitado por processamento e enfraquece a vantagem do trabalho interativo. Alguns projetos usaram períodos em torno de um segundo, mas o período é uma escolha de ajuste baseada no comportamento da carga de trabalho e nos objetivos de resposta.
Contabilize o uso entre cessões da CPU
Um problema separado é a manipulação do escalonador. Pela regra inicial da fatia completa, um programa pode executar por 9 ms, solicitar uma operação de entrada e saída de 1 ms e repetir. Ele nunca usa uma fatia inteira de 10 ms de uma vez, então mantém a prioridade máxima enquanto consome quase todo o tempo de CPU disponível.
Com uma cota cumulativa de 10 ms, a primeira rajada consome 9 ms e deixa 1 ms. Após a operação de entrada e saída, mais um milissegundo esgota a cota, e a tarefa é rebaixada durante sua segunda rajada. Uma requisição de entrada e saída muda o estado; ela não apaga o atendimento já recebido. A regra de contabilização impede essa tática mesmo sem uma elevação.
| Mecanismo | O que muda | Problema tratado |
|---|---|---|
| Contabilização da cota | Soma o uso de CPU ao longo das vezes de execução | Cessão estratégica antes do fim da fatia |
| Elevação periódica | Reinicia o aprendizado da prioridade | Inanição e mudança de comportamento |
Ajuste os níveis
Escolha o número de filas, o quantum de cada fila, a cota de cada nível e o período de elevação. As filas superiores geralmente usam quanta curtos, por exemplo, 10 ms, para alternar rapidamente entre tarefas interativas. Filas inferiores podem usar quanta muito mais longos, às vezes centenas de milissegundos, para reduzir as trocas durante processamento contínuo.
A cota pode crescer independentemente do quantum. Um nível com quantum de 5 ms e cota de 15 ms pode permitir três vezes completas antes do rebaixamento. Aumentar a cota adia a classificação como tarefa de longa duração; aumentar o quantum prolonga uma vez individual.
O projeto de compartilhamento de tempo do Solaris ilustra a realimentação baseada em tabela: sua tabela clássica configurável tem 60 níveis de prioridade, com quanta que vão de aproximadamente 20 ms em alta prioridade até algumas centenas de milissegundos em baixa prioridade. Projetos clássicos do BSD, por sua vez, calculavam a prioridade a partir do uso recente da CPU, que decai ao longo do tempo. Ambos fazem o uso antigo da CPU perder influência, de modo que o histórico distante de uma thread não determina permanentemente seu tratamento.
Principais conclusões
- Elevações reabrem oportunidades de atendimento e permitem reaprender comportamentos alterados.
- Uma elevação não concede prioridade alta permanente nem parcela fixa de CPU.
- A contabilização cumulativa impede a tática de ceder a CPU antes do fim da fatia.
- Quanta curtos nos níveis superiores favorecem a resposta; quanta mais longos nos inferiores reduzem a sobrecarga.
- Uma cota pode abranger várias vezes de execução em um nível.
- A realimentação pode usar tabelas de prioridade ou fórmulas de uso de CPU que decai.
4Divida o tempo de CPU por parcelas
Um escalonador de parcela justa começa com um direito: quanto da CPU disputada cada tarefa apta a executar deve receber. Bilhetes expressam esse direito no escalonamento por loteria e por passos; pesos o expressam na classe justa do Linux. As regras de seleção diferem em quanto a divisão em intervalos curtos acompanha a divisão pretendida e em como favorecem atendimento rápido. Acompanhe a contabilização para entender por que um peso maior proporciona mais tempo real de CPU enquanto seu progresso virtual cresce mais lentamente.
4.1 Sorteie vezes ponderadas com escalonamento por loteria
O escalonamento por parcela proporcional busca dividir o atendimento da CPU de acordo com parcelas atribuídas. No escalonamento por loteria, cada tarefa apta a executar possui bilhetes. Um bilhete vencedor aleatório escolhe a tarefa para a próxima fatia de igual duração. A chance de uma tarefa vencer é seu número de bilhetes dividido pelo total de bilhetes das tarefas aptas a executar.
Localize um bilhete vencedor
A possui 100 bilhetes, B 50 e C 250. Numere os 400 bilhetes de 0 a 399. A possui 0–99, B possui 100–149 e C possui 150–399. Um sorteio de 300 seleciona C.
Uma implementação baseada em lista sorteia um número e acumula as quantidades de bilhetes. Os totais acumulados são 100 após A, 150 após B e 400 após C. Pare no primeiro total estritamente maior que o número sorteado. Usar “maior ou igual” atribuiria incorretamente os bilhetes nos limites: o número sorteado 100 pertence a B. Colocar primeiro quem possui mais bilhetes reduz o tamanho médio dessa busca na lista.
Diferencie expectativa de garantia
Com A possuindo 75 bilhetes e B 25, a parcela esperada de A é 75%. Em 100 sorteios independentes de fatias iguais com ambas aptas a executar, espera-se que A vença 75 vezes. O desvio padrão é:
fatias.
Um resultado de aproximadamente 71–79 vitórias está a cerca de um desvio padrão da média; não é um intervalo garantido. Execuções curtas podem se afastar bastante da proporção pretendida de 3:1. À medida que o intervalo de observação cresce, a variação aleatória relativa diminui. A loteria proporciona justiça probabilística, não uma divisão exata em um intervalo finito nem uma espera limitada até a próxima vez.
Para duas tarefas com quantidades iguais de bilhetes e demandas iguais de CPU, a métrica de injustiça U divide o instante de conclusão da primeira pelo da última. A razão chega a 1 quando terminam juntas e é menor quando uma termina muito antes. Essa razão entre conclusões é especialmente variável para tarefas curtas escalonadas por loteria.
Distribua bilhetes entre usuários e dependências
A moeda de bilhetes permite que um usuário divida localmente um direito global atribuído. O usuário X tem 200 bilhetes globais e atribui 300 bilhetes locais a X1 e 100 a X2. Dos 400 bilhetes locais, X1 tem três quartos, o que lhe dá 150 bilhetes globais; X2 recebe 50. O usuário Y tem 100 bilhetes globais para Y1. O total é 300, então X1 recebe uma parcela esperada de 50%, X2 cerca de 16,67% e Y1 cerca de 33,33% da CPU disputada.
A transferência de bilhetes empresta temporariamente os bilhetes de um cliente a um servidor que trabalha para ele e depois os devolve quando a requisição termina. Isso acompanha a dependência de trabalho. A inflação de bilhetes permite que tarefas cooperantes aumentem suas próprias quantidades de bilhetes para solicitar mais atendimento. Ela exige confiança ou limites: a inflação sem restrições permite que uma tarefa gananciosa reduza as parcelas de todas as outras.
A loteria precisa dos totais de bilhetes, mas não de um registro de quanto cada tarefa está adiantada em atendimento. Uma nova tarefa simplesmente acrescenta seus bilhetes ao conjunto das tarefas aptas a executar. A atribuição dos bilhetes continua sendo uma escolha de política; o sorteio aleatório implementa essa escolha em termos de expectativa. Os bilhetes de uma tarefa bloqueada não competem por uma fatia que ela não pode usar.
Principais conclusões
- A fração de bilhetes fornece a chance de uma tarefa vencer cada sorteio.
- A busca cumulativa para quando o total ultrapassa o número vencedor.
- As parcelas da loteria são proporções esperadas, com variação no curto prazo.
- A moeda de bilhetes preserva o direito global de um usuário enquanto o divide localmente.
- A transferência acompanha uma dependência; a inflação sem restrições pode reduzir as parcelas dos demais.
4.2 Mantenha o atendimento proporcional com valores de passo
O escalonamento por passos transforma parcelas de bilhetes em uma sequência determinística. Cada tarefa apta a executar tem um passo, calculado como uma constante grande dividida por seus bilhetes, e um valor de passagem que registra seu progresso ponderado. Escolha o menor valor de passagem, execute essa tarefa por uma fatia de igual duração e depois some seu passo ao seu valor de passagem.
Calcule os passos
A tem 50 bilhetes, B 25 e C 100. Com a constante 1.000, seus passos são 20, 40 e 10. Mais bilhetes produzem um passo menor. O valor de passagem de uma tarefa favorecida cresce lentamente, então se torna o mínimo com mais frequência.
Comece todos os valores de passagem em zero e resolva empates alfabeticamente. Mantenha a tupla na ordem fixa A, B, C:
| Valores de passagem antes da seleção | Tarefa selecionada | Valores de passagem após sua fatia |
|---|---|---|
| (0, 0, 0) | A | (20, 0, 0) |
| (20, 0, 0) | B | (20, 40, 0) |
| (20, 40, 0) | C | (20, 40, 10) |
| (20, 40, 10) | C | (20, 40, 20) |
| (20, 40, 20) | A | (40, 40, 20) |
| (40, 40, 20) | C | (40, 40, 30) |
| (40, 40, 30) | C | (40, 40, 40) |
Somente o valor de passagem da tarefa selecionada muda. Em sete fatias, A recebe duas vezes, B uma e C quatro: a proporção exata de 50:25:100. No valor de passagem comum de 40, cada uma avançou pela mesma quantidade de atendimento ponderado. Entre esses alinhamentos, as parcelas em intervalos curtos não precisam ser exatas.
Separe atendimento real e progresso virtual
O valor de passagem é um valor de ordenação, não o tempo decorrido nem uma contagem de bilhetes. O passo grande de B faz com que ela espere enquanto A e C alcançam seu valor de passagem. Ela ainda recebe sua parcela pretendida de um sétimo nesse ciclo repetitivo. Somar a quantidade de bilhetes ao valor de passagem inverteria o projeto: a tarefa com mais bilhetes daria o maior salto e seria selecionada com menos frequência.
A constante controla a escala dos passos, não as proporções pretendidas dos bilhetes. Implementações com números inteiros precisam de precisão suficiente para evitar distorcer essas proporções pelo arredondamento. Comparações e atualizações precisam usar uma escala consistente.
Posicione uma recém-chegada de modo adequado
Suponha que tarefas já presentes tenham valores de passagem em torno de 4.000. Uma nova tarefa começando em zero venceria repetidamente enquanto alcançasse as demais, mesmo que tivesse poucos bilhetes. Inicialize seu valor de passagem em relação ao progresso atual do sistema, por exemplo, com o valor mínimo atual, para que ela não acumule atendimento referente ao tempo anterior à sua chegada.
| Loteria | Passos |
|---|---|
| Sorteios aleatórios implementam as parcelas esperadas | A seleção pelo menor valor de passagem acompanha o atendimento deterministicamente |
| Quantidades de bilhetes bastam para a seleção | Cada tarefa precisa de um valor de passagem e de um passo |
| Uma recém-chegada simplesmente acrescenta bilhetes | Uma recém-chegada precisa de um valor de passagem inicial adequado |
O tempo de execução virtual do Linux usa a ideia relacionada de contabilizar progresso ponderado pelo atendimento real da CPU. Em ambos os projetos, um direito maior faz esse progresso crescer mais lentamente, mantendo a tarefa competitiva para atendimento posterior.
Principais conclusões
- O passo é a constante comum dividida pelos bilhetes.
- Selecione o menor valor de passagem e some apenas o passo dessa tarefa.
- Quantidades maiores de bilhetes fazem os valores de passagem crescerem mais lentamente.
- Novas tarefas precisam de valores de passagem vinculados ao progresso atual.
4.3 Pesos, tempo de execução virtual e prazos elegíveis
Os escalonadores justos do Linux acompanham o atendimento ponderado de CPU. O escalonador completamente justo (CFS), introduzido no Linux 2.6.23 em 2007, escolhia a tarefa apta a executar com o menor tempo de execução virtual. O Linux começou a substituir essa regra de seleção pelo EEVDF na versão 6.6 em 2023.
Divida o atendimento por peso
Um valor de nice vai de −20, o mais favorecido, a +19, o menos favorecido. Nice 0 tem peso 1024. Cada passo em direção a um valor de nice maior reduz o peso por um fator de aproximadamente 1,25. Exemplos de pesos são 3121 para nice −5, 820 para nice 1, 335 para nice 5, 110 para nice 10 e 15 para nice 19.
Nice 0 contra nice 1 resulta em , aproximadamente 55,5% contra 44,5%. As parcelas dependem aproximadamente da diferença entre os valores de nice: e são ambos aproximadamente 3,05. Nice +19 competindo com nice 0 ainda recebe cerca de 1,4% nesse modelo simples de duas tarefas.
O CFS clássico distribui uma latência de escalonamento alvo por peso:
Para pesos 1024, 1024 e 335, o total é 2383. Um período alvo de 48 ms dá aproximadamente 20,63 ms a cada tarefa de peso maior e 6,75 ms à de peso menor. Esses parâmetros são ilustrativos, não padrões universais do núcleo. Com quatro tarefas iguais, 48 ms dão 12 ms a cada uma. Com dez, 4,8 ms para cada uma ficaria abaixo de uma granularidade mínima ilustrativa de 6 ms, então o período precisa crescer.
Contabilize o progresso virtual
O CFS aumenta o tempo de execução virtual de uma tarefa em execução em:
Uma tarefa de peso 1024 ganha um milissegundo virtual por milissegundo real. Uma tarefa de peso 335 ganha aproximadamente 3,06. Contabilizar mais rapidamente as tarefas de menor peso faz com que esperem mais cedo, enquanto tarefas de maior peso recebem mais atendimento real.
O CFS clássico ordena as tarefas aptas a executar que estão na fila em uma árvore rubro-negra pelo tempo de execução virtual. Inserção e remoção têm custo de tempo logarítmico; um ponteiro armazenado para o nó mais à esquerda permite encontrar o mínimo em tempo constante. Tarefas bloqueadas saem dessa árvore de tarefas aptas a executar. O posicionamento ao despertar impede que uma longa suspensão anterior se transforme em uma reivindicação ilimitada de atendimento para recuperar o tempo.
Escolha entre tarefas elegíveis com EEVDF
O primeiro prazo virtual elegível mantém pesos e a contabilização do atendimento virtual. Uma tarefa tem defasagem de serviço positiva quando ainda lhe é devido atendimento e negativa quando recebeu mais que seu direito. Tarefas com defasagem não negativa são elegíveis. O EEVDF seleciona a tarefa elegível com o prazo virtual mais próximo.
O prazo combina o início virtual de uma requisição com sua duração de atendimento solicitada, ajustada ao tempo virtual. É um valor de ordenação do atendimento, não uma promessa de horário real de conclusão. Uma fatia solicitada mais curta pode dar a uma tarefa elegível um prazo mais próximo e melhorar a latência sem aumentar sua parcela de longo prazo determinada pelo peso. O Linux atual oferece suporte a solicitações de fatia por meio de sched_setattr().
| Seleção do CFS clássico | Seleção do EEVDF |
|---|---|
| Menor tempo de execução virtual | Prazo virtual mais próximo entre as tarefas elegíveis |
Principais conclusões
- Valores de nice determinam pesos relativos para atendimento normal na classe justa.
- O tempo de execução virtual cresce inversamente ao peso.
- O CFS clássico usa o menor tempo de execução virtual e um ponteiro armazenado para o mínimo da árvore.
- A granularidade mínima pode estender o período do CFS clássico.
- O EEVDF primeiro verifica a elegibilidade e depois compara os prazos virtuais.
- Requisições mais curtas no EEVDF alteram a latência, enquanto os pesos determinam as parcelas.
5Distribua o trabalho entre várias CPUs
Várias CPUs criam mais oportunidades para executar trabalho, mas agora a distribuição afeta o custo de cada escolha. Uma thread pode encontrar dados já carregados nos caches de um núcleo e memória distante em outro. As filas de tarefas prontas também precisam permitir decisões simultâneas sem corromper o estado compartilhado. Compare uma fila compartilhada com filas separadas por CPU e depois pondere o benefício de equilibrar o trabalho em relação ao custo de movê-lo.
5.1 Considere os caches e a topologia das CPUs
Várias CPUs só ajudam quando há trabalho paralelo. Uma única thread executa em uma CPU lógica por vez; várias threads ou programas independentes podem usar várias CPUs juntos. Um escalonador precisa escolher tanto qual tarefa executa quanto onde ela executa.
Compartilhe a responsabilidade pelo escalonamento
No multiprocessamento simétrico (SMP), as CPUs executam código do núcleo e tomam suas próprias decisões de escalonamento. No multiprocessamento assimétrico, um processador principal coordena o escalonamento enquanto os demais executam o trabalho atribuído. O controle central é mais simples, mas o processador principal pode se tornar um gargalo. Sistemas de uso geral usam SMP.
Decisões simultâneas exigem coordenação. Se duas CPUs removem tarefas de uma fila compartilhada de prontos, suas atualizações precisam ser sincronizadas para que nenhuma entrada seja perdida nem a mesma tarefa da fila seja selecionada duas vezes. Mais CPUs podem aumentar a contenção por essa estrutura compartilhada.
Preserve o conteúdo útil dos caches
Os núcleos têm caches pequenos e rápidos, normalmente caches L1 e L2 privados e um L3 maior compartilhado por vários núcleos. Localidade temporal significa reutilizar dados acessados recentemente. Localidade espacial significa acessar dados próximos, como elementos consecutivos de um vetor.
Uma thread de ordenação no núcleo 0 preenche seus caches e sua TLB. Se ela retomar nesse núcleo após uma breve preempção, muitas entradas necessárias ainda podem estar presentes. No núcleo 3, ela pode precisar buscar os mesmos dados novamente em um cache compartilhado ou na memória. Afinidade de cache é a tendência do escalonador de manter uma thread próxima da CPU que ela usou recentemente. O benefício exato depende do que permanece em cache e da topologia de compartilhamento dos caches.
Separe coerência de sincronização
A coerência de cache impede que núcleos usem indefinidamente cópias conflitantes armazenadas em cache de uma única posição de memória. O monitoramento do barramento é uma ideia de implementação: caches observam o tráfego e invalidam ou atualizam cópias quando outro núcleo escreve. Sistemas maiores podem usar outros mecanismos de coerência.
A coerência não transforma várias instruções em uma operação atômica. Se duas CPUs leem o tamanho de uma fila, alteram entradas e escrevem o tamanho de volta, leituras e escritas individuais coerentes ainda permitem intercalações prejudiciais. O escalonador precisa de travas ou outro método de sincronização para toda a atualização. A própria linha de cache compartilhada de uma trava pode se mover entre núcleos à medida que competem por ela.
Interprete a organização do hardware
| Característica do hardware | O que o escalonador precisa considerar |
|---|---|
| Multithreading simultâneo (SMT) | CPUs lógicas em um núcleo compartilham unidades de execução e caches |
| Acesso não uniforme à memória (NUMA) | A memória próxima a um soquete pode ser acessada mais rapidamente que a memória remota |
| Núcleos heterogêneos | Núcleos de desempenho e de eficiência oferecem diferentes relações entre velocidade e energia |
A Intel chama sua implementação de SMT de Hyper-Threading. Duas threads ocupadas em CPUs lógicas do mesmo núcleo competem pelos recursos desse núcleo; duas CPUs lógicas não equivalem a dois núcleos físicos independentes. Uma migração em NUMA também pode afastar o processamento da memória que ele usa, mesmo quando o preenchimento do cache é rápido.
Mover uma thread para uma CPU ociosa pode eliminar um longo atraso na fila. Mantê-la no lugar pode preservar a localidade. Compare esses custos usando a carga de trabalho real: afinidade é uma preferência de desempenho, enquanto uma máscara de afinidade explícita restringe quais CPUs são permitidas.
Principais conclusões
- A aceleração paralela exige várias threads ou programas aptos a executar.
- SMP permite que várias CPUs tomem decisões de escalonamento.
- A afinidade de cache preserva dados e traduções usados recentemente.
- A coerência não torna atômica uma atualização com várias etapas.
- SMT, NUMA e tipos de núcleo diferentes afetam os custos de distribuição.
5.2 Equilibre o trabalho sem movê-lo constantemente
Um escalonador multiprocessador precisa de um lugar para manter o trabalho pronto. Uma fila compartilhada facilita encontrar trabalho. Filas separadas por CPU reduzem a contenção compartilhada e preservam a distribuição, mas podem deixar uma CPU sobrecarregada enquanto outra está ociosa.
Compare projetos de filas
| Projeto | Principal vantagem | Principal custo |
|---|---|---|
| Fila única (SQMS) | Qualquer CPU ociosa elegível pode pegar trabalho em espera | Contenção na fila e menor afinidade de cache |
| Múltiplas filas (MQMS) | Decisões locais escalam e mantêm a afinidade | O desequilíbrio de carga exige correção ativa |
No escalonamento multiprocessador com fila única, todas as CPUs retiram trabalho de uma fila compartilhada. Se as tarefas podem executar em todas as CPUs, o trabalho em espera naturalmente ocupa uma CPU ociosa. Uma trava compartilhada protege a fila, então aumentar o número de CPUs pode transformar essa trava em um gargalo.
Com cinco tarefas A–E em escalonamento circular em quatro CPUs, uma sequência atribui A, B, C, D na primeira rodada; E, A, B, C na segunda; e D, E, A, B na terceira. A executa na CPU 0, depois na 1 e depois na 2. A máquina permanece ocupada, mas A troca repetidamente de caches privados. Regras de afinidade podem manter a maior parte da distribuição enquanto movem tarefas selecionadas para equilibrar o trabalho.
Observe parcelas desiguais
No escalonamento multiprocessador com múltiplas filas, cada CPU escalona sua própria fila. Suponha que a CPU 0 tenha A e C e a CPU 1 tenha B e D, todas limitadas por processamento e compartilhando localmente em escalonamento circular. Inicialmente cada tarefa recebe metade de uma CPU. Quando C termina, A recebe toda a CPU 0 enquanto B e D ainda recebem metade da CPU 1 cada uma.
A máquina continua plenamente utilizada, mas as tarefas deixam de receber parcelas iguais. Se A também terminar, a CPU 0 fica ociosa embora B e D estejam prontas. Mover uma delas para a CPU 0 dá uma CPU inteira a ambas e usa capacidade antes ociosa.
Com três tarefas iguais limitadas por processamento e duas CPUs, o atendimento igual no longo prazo é de dois terços de uma CPU por tarefa. Uma distribuição fixa deixa uma tarefa sozinha e duas compartilhando. Alternar periodicamente qual tarefa fica sozinha pode aproximar a divisão igual. Nenhuma thread executa nas duas CPUs ao mesmo tempo.
Decida quando migrar
A migração move uma tarefa para a fila de outra CPU. O roubo de trabalho é uma estratégia de busca: uma CPU com pouco trabalho examina a fila de uma CPU mais ocupada e retira trabalho dela. Verificações frequentes criam tráfego de sincronização; verificações raras deixam o desequilíbrio sem solução. O roubo também precisa respeitar a elegibilidade das CPUs e a localidade da memória.
Compare o tempo de espera que se espera economizar com o custo da migração. Uma fila longa em uma CPU e uma CPU compatível ociosa criam um forte motivo para mover uma tarefa. Uma pequena diferença temporária entre filas pode desaparecer antes que os custos de preencher os caches sejam recuperados.
Os projetos O(1) e CFS do Linux usavam filas de tarefas prontas por CPU; o Linux equilibra a carga entre domínios de escalonamento do hardware, considerando núcleos compartilhados e soquetes. O BF Scheduler, uma alternativa, usava uma fila única. Usuários podem restringir a distribuição com taskset ou sched_setaffinity() no Linux e SetThreadAffinityMask() no Windows. Uma máscara de afinidade restrita pode explicar por que uma tarefa pronta não usa uma CPU que parece ociosa.
Principais conclusões
- Uma fila compartilhada facilita encontrar trabalho em espera, mas precisa de sincronização compartilhada.
- Filas por CPU preservam a localidade e reduzem a contenção.
- A utilização total da CPU pode coexistir com parcelas desiguais por tarefa.
- A migração corrige desequilíbrios com custos de cache e coordenação.
- O roubo de trabalho puxa tarefas para CPUs com capacidade disponível.
- Restrições de afinidade limitam quais CPUs ociosas podem receber uma tarefa.
6Interprete configurações do sistema e avalie uma política
Escalonadores reais combinam várias ideias: classes de prioridade, parcelas ponderadas, realimentação após esperas e distribuição entre CPUs. Uma configuração pode mudar a precedência, a parcela ou a distribuição permitida, então identifique qual controle você está analisando antes de prever seu efeito. Linux e Windows fornecem exemplos concretos. Para escolher uma política, relacione esses mecanismos a uma carga de trabalho e teste tanto os resultados médios quanto os atrasos enfrentados pelas tarefas menos favorecidas.
6.1 Use os controles de escalonamento do Linux
O Linux escalona threads, chamadas de tarefas no núcleo. A política de escalonamento, o valor de nice, os controles de grupo e a afinidade de CPU de uma tarefa respondem a perguntas diferentes sobre quando e onde ela executa.
Examine primeiro a política
| Política | Comportamento de seleção |
|---|---|
SCHED_OTHER e SCHED_BATCH | Atendimento normal da classe justa, ponderado por nice |
SCHED_IDLE | Trabalho normal de prioridade extremamente baixa; nice não o afeta |
SCHED_FIFO | Prioridade de tempo real, sem quantum entre tarefas de mesma prioridade |
SCHED_RR | Prioridade de tempo real, alternando tarefas de mesma prioridade por quantum |
SCHED_DEADLINE | Atendimento da classe de prazo, acima das outras classes |
As políticas normais têm prioridade estática 0. FIFO e RR de tempo real usam 1–99, em que 99 é a mais alta. Uma tarefa FIFO continua até bloquear, ceder a CPU ou ser preemptada por trabalho de prioridade mais alta. RR acrescenta alternância entre tarefas de mesma prioridade; sched_rr_get_interval() informa seu quantum. Esses nomes descrevem políticas do Linux: o escalonamento justo normal não é o algoritmo RR de fatias iguais dos livros.
Altere parcelas e distribuição
Nice vai de −20 a +19, com padrão 0. Valores maiores reduzem o peso na classe justa, por um fator de aproximadamente 1,25 por passo. Em uma inicialização típica com nice 0, nice -n 10 make inicia uma compilação com nice 10; -n é um ajuste ao valor de nice herdado. renice -n 5 -p 4321 define o processo indicado com nice 5. Um usuário pode tornar seu próprio trabalho menos favorecido; aumentar a prioridade exige privilégio adequado ou um limite de recursos que o permita.
taskset -c 0,1 ./app permite que um programa execute nas CPUs 0 e 1. Ele não cria uma segunda thread nem promete qualquer uma das CPUs exclusivamente. ps -o pid,cls,ni,rtprio,comm mostra campos relacionados à política, enquanto top ajuda a observar prioridade, nice e consumo de CPU.
chrt -f 50 ./app seleciona a prioridade de tempo real FIFO 50. Use configurações de tempo real apenas em um ambiente controlado: uma thread ocupada de alta prioridade pode atrasar o interpretador de comandos e o trabalho essencial do sistema. Os limites padrão de tempo de CPU para tarefas de tempo real reservam algum tempo para trabalho normal, mas não garantem que toda carga desse tipo responda rapidamente. A precedência altera o acesso ao atendimento da CPU, não a velocidade de uma instrução.
Diferencie peso de grupo de cota
No cgroup v2, cpu.weight vai de 1 a 10000, com padrão 100, e divide a capacidade disputada da CPU na classe justa entre grupos ativos do mesmo nível. Pesos 200 e 100 dão aproximadamente dois terços e um terço de uma CPU quando ambos os grupos estão ocupados. Se o segundo ficar ocioso, o primeiro poderá usar toda a capacidade disponível.
cpu.max define um limite de tempo de CPU. O valor “50000 100000” permite 50 ms de tempo agregado de CPU por período de 100 ms, equivalente a metade de uma CPU em média. Várias threads podem consumir esse orçamento em paralelo e esgotá-lo mais cedo no tempo decorrido. Um grupo sujeito a limite pode ter seu uso restringido mesmo quando há capacidade de CPU disponível.
Situe os nomes na história
O escalonador O(1) do Linux 2.6.0 usava vetores de prioridade e realimentação de interatividade. O CFS chegou na versão 2.6.23 em 2007. O Linux 6.6 em 2023 começou a transição para a seleção EEVDF na classe justa. Desde o Linux 6.12 em 2024, sched_ext oferece suporte a políticas de escalonamento BPF carregadas dinamicamente em núcleos configurados para isso. Se esse escalonador falhar ou impedir o progresso de tarefas aptas a executar, o núcleo restaura o escalonamento interno.
Principais conclusões
- A classe de política determina a precedência antes da interpretação de nice.
- Nice ajusta a parcela relativa na classe justa; a afinidade restringe as CPUs permitidas.
- SCHED_IDLE ignora nice.
- Um peso de cgroup divide a capacidade disputada; uma cota limita o atendimento agregado de CPU.
- O EEVDF altera a seleção na classe justa, enquanto sched_ext oferece suporte a políticas substituíveis.
6.2 Acompanhe as prioridades e a realimentação do Windows
O Windows escalona threads prontas por prioridade de 0 a 31, com números maiores indicando prioridades mais altas. Threads prontas de mesma prioridade se alternam em escalonamento circular. Uma thread recém-pronta de prioridade mais alta preempta uma de prioridade mais baixa sem esperar o fim de seu quantum. A prioridade 0 pertence à thread de zeragem de páginas, que preenche com zeros as páginas livres.
Encontre a prioridade base a partir de duas configurações
A prioridade base de uma thread depende da classe de prioridade de seu processo e de seu próprio nível relativo de thread. As classes de processo são Idle, Below normal, Normal, Above normal, High e Realtime. Os níveis de thread incluem Idle, Lowest, Below normal, Normal, Above normal, Highest e Time critical.
| Classe do processo | Nível da thread | Prioridade base |
|---|---|---|
| Normal | Normal | 8 |
| Normal | Highest | 10 |
| High | Normal | 13 |
| Realtime | Normal | 24 |
Time critical resulta em 15 fora da classe Realtime e em 31 dentro dela. O nível de thread Idle resulta em 1 fora de Realtime e em 16 dentro dela. Esses níveis extremos são entradas especiais da tabela, então somar um deslocamento fixo a cada classe produziria resultados errados.
Acompanhe uma elevação temporária
As prioridades 1–15 são a faixa variável; 16–31 são a faixa de tempo real. Uma thread começa com prioridade dinâmica igual à prioridade base. Para threads na faixa variável, eventos como entrada ou conclusão de uma espera podem elevar temporariamente a prioridade dinâmica. Threads com prioridades base de tempo real não recebem essas elevações.
Suponha que uma thread com prioridade base 8 seja elevada a 14. Se ela continuar processando, sua prioridade dinâmica cai um nível após cada quantum completo: 13 após o primeiro, 12 após o segundo e 8 após o sexto. A elevação não muda permanentemente a prioridade base e não decai abaixo dela.
Isso é realimentação: trabalho recém-desbloqueado recebe atendimento rápido, enquanto o uso contínuo de CPU perde a vantagem temporária. O Windows também usa elevações temporárias para threads prontas que esperam há muito tempo, a fim de combater a inanição. Essa elevação pode ajudar quem mantém uma trava e tem classificação baixa a progredir, mas é um mecanismo diferente da herança de prioridade específica de uma trava.
Reconheça projetos relacionados
A classe de compartilhamento de tempo do Solaris é um projeto de MLFQ orientado por tabela. O ULE do FreeBSD usa filas de tarefas prontas por CPU e compara o comportamento de suspensão com o de execução para identificar threads interativas. Esses sistemas compartilham a ideia de adaptar o atendimento ao comportamento observado sem usar regras de filas idênticas.
O macOS oferece classes de qualidade de serviço (QoS), incluindo interativa para o usuário, iniciada pelo usuário, padrão, utilitária e em segundo plano. Elas descrevem a urgência do trabalho. Em Apple silicon, a QoS ajuda o sistema a distribuir o trabalho entre núcleos de desempenho e de eficiência. Os programas comunicam a importância do trabalho; o sistema operacional escolhe a distribuição de acordo com a política e o hardware disponível.
Escalonadores reais combinam realimentação, prioridades, justiça e afinidade. Uma classe Realtime do Windows tem precedência maior, mas não garante cálculos mais rápidos nem correção completa de tempo real.
Principais conclusões
- Os números de prioridade do Windows aumentam com a precedência.
- A prioridade base combina a classe do processo com o nível relativo da thread.
- Elevações na faixa variável decaem um nível por quantum completo até a base.
- Prioridades base de tempo real não recebem elevações dinâmicas.
- Solaris, ULE e macOS usam ideias relacionadas com mecanismos diferentes.
- A QoS comunica a urgência do trabalho e ajuda a orientar sua distribuição.
6.3 Escolha uma política e teste suas consequências
Escolha o objetivo da carga de trabalho antes de escolher um escalonador. Uma fila de tarefas em lote pode valorizar a conclusão rápida de muitas tarefas pequenas. Um editor precisa de atendimento rápido após uma entrada. Um servidor compartilhado precisa de uma distribuição justificável entre usuários ou grupos.
Associe o mecanismo ao objetivo
| Necessidade da carga de trabalho | Mecanismo adequado | Escolha de compromisso a examinar |
|---|---|---|
| Baixo tempo médio de retorno em lote | SJF ou STCF com rajadas conhecidas ou previstas | Erro de previsão e inanição |
| Atendimento interativo rápido | Preempção com realimentação ou seleção justa sensível à latência | Custo de troca e atrasos na cauda |
| Acesso proporcional entre usuários | Bilhetes, passos ou pesos de grupo | Justiça em intervalos curtos e distribuição entre grupos |
| Cálculo longo limitado por processamento | Atendimento suficiente por vez para amortizar as trocas | Rapidez de resposta do trabalho concorrente |
| Trabalho com dispositivos e prazo crítico | Políticas de tempo real adequadas | Interferência em outras tarefas |
Compare políticas com entradas idênticas
A chega em 0 ms precisando de 8 ms, B em 1 ms precisando de 4 ms e C em 2 ms precisando de 2 ms. Ignore o custo de troca. FIFO executa A, B, C. SJF também começa por A, mas depois executa C antes de B. STCF executa A 0–1, B 1–2, C 2–4, B 4–7, A 7–14. RR usa um quantum de 2 ms, com chegadas no limite da fatia entrando na fila antes da tarefa cuja fatia terminou.
| Política | Tempo médio de retorno | Tempo médio de resposta até a primeira execução |
|---|---|---|
| FIFO | 10,33 ms | 5,67 ms |
| SJF | 9,67 ms | 5 ms |
| STCF | 7,33 ms | 0 ms |
| RR | 9 ms | 1 ms |
STCF vence nas duas métricas nessa carga porque cada tarefa mais curta recém-chegada executa imediatamente. RR proporciona um início rápido sem conhecer as durações das rajadas. Com tarefas de mesma duração que chegam simultaneamente, FIFO pode ter menor tempo médio de retorno que RR. Uma classificação em uma carga de trabalho é uma evidência sobre essa carga.
Escolha um método de avaliação
A modelagem determinística calcula manualmente uma sequência fixa. Ela fornece resultados exatos para suas entradas e facilita a análise das decisões, mas frequentemente deixa de fora os custos de despacho e de cache. Modelos de filas descrevem padrões de chegada e atendimento usando distribuições e preveem o comportamento médio.
Para um sistema estável em regime permanente, a lei de Little relaciona a população média , a taxa de chegada e o tempo médio de permanência :
Com 14 tarefas/s e tempo médio de 0,5 s no sistema, a população média é de 7 tarefas. Mantenha o limite de observação consistente: a população da fila de prontos exige o tempo de espera nessa fila, enquanto a população de todo o sistema exige o tempo em todo o sistema. Converta as unidades antes de multiplicar.
A simulação executa um modelo de escalonador, frequentemente com um registro de carga de trabalho. Ela pode testar padrões complexos de chegada e bloqueio, mas suas conclusões dependem do modelo e dos registros escolhidos. A implementação avalia o escalonador em um sistema operacional real e inclui a sobrecarga efetiva; exige mais esforço e ainda precisa de cargas representativas e medições reproduzíveis.
Examine vazão, utilização, atrasos individuais e na cauda, justiça e consumo de energia junto com as médias. Em um multiprocessador, uma máquina ocupada ainda pode dividir o atendimento de forma desigual ou desperdiçar tempo preenchendo caches novamente. Compare políticas usando o mesmo intervalo de observação e a mesma carga de trabalho e depois varie as características da carga que importam para os usuários pretendidos.
Principais conclusões
- Escolha métricas que correspondam às necessidades reais da carga de trabalho.
- Compare políticas com chegadas e demandas de CPU idênticas.
- Uma classificação específica de uma carga de trabalho não estabelece um vencedor universal.
- A lei de Little exige um sistema estável e limites correspondentes para população e tempo.
- A simulação depende do modelo; a implementação inclui a sobrecarga real.
- Avalie atrasos na cauda, justiça, vazão e energia junto com as médias.
Exercícios resolvidos de Escalonamento de CPU
1Dos estados de pronto aos atrasos medidos
11 passos
- 1IntroduçãoAcompanhe a transferência da CPU
Uma tarefa em execução inicia uma leitura de disco enquanto outra tarefa está pronta. O sistema operacional pode usar esse período de espera para avançar outro trabalho. Vamos acompanhar primeiro as mudanças de estado (uma tarefa está pronta, em execução ou bloqueada) e depois interpretar uma curta linha do tempo da CPU para medir o que cada tarefa experimentou: resposta, espera e tempo de retorno.
Mantenha duas perguntas separadas enquanto trabalha: quem pode executar agora e qual atraso uma métrica deve contar? Uma tarefa pode ter uma primeira vez rápida, mas ainda terminar muito mais tarde.
- 2ExplicaçãoEscolha entre tarefas que podem executar
O escalonador seleciona trabalho pronto. Uma tarefa em execução já tem uma CPU; uma tarefa bloqueada precisa esperar por seu evento. Quando a leitura começa, quem a solicitou fica bloqueado e libera a CPU. Quando a leitura termina, volta a ficar pronto.
A leitura concluída cria uma oportunidade de seleção. Se a tarefa que retorna executa imediatamente depende da política e de outro trabalho pronto.
- 3ConexãoSepare a escolha da troca
A política escolhe a próxima tarefa pronta. O despachante salva o estado anterior, restaura o estado escolhido e retoma a execução. Sua latência e o preenchimento dos caches pela próxima tarefa custam tempo.
Um temporizador pode devolver o controle ao núcleo mesmo quando um programa nunca cede a CPU. Uma interrupção de dispositivo também pode deixar pronto trabalho favorecido. A preempção preserva a tarefa interrompida para uma vez posterior.
- 4DesafioO editor em espera pode preemptar?
Um editor está bloqueado à espera de entrada enquanto uma tarefa limitada por processamento executa. O editor tem prioridade mais alta. Ele pode tomar a CPU antes de a entrada chegar? Explique qual estado importa.
---reveal---
Não. O editor está bloqueado e não pode executar até que seu evento de entrada ocorra. Depois que a entrada o deixar pronto, um escalonador preemptivo por prioridade poderá escolhê-lo. A prioridade classifica o trabalho pronto; ela não elimina a dependência do evento.
- 5ExemploDesenhe os intervalos de atendimento
A chega em 0 ms precisando de 5 ms, B em 2 ms precisando de 3 ms e C em 4 ms precisando de 1 ms. São tarefas que usam apenas a CPU. FIFO sem custo de troca executa A 0–5, B 5–8 e depois C 8–9.
Registre os instantes de primeira execução 0, 5 e 8 ms e os instantes de conclusão 5, 8 e 9 ms. Esses são instantes. Em seguida, subtraímos a chegada de cada tarefa para transformá-los em atrasos.
- 6ExemploMeça o atraso até a conclusão
O tempo de retorno vai da chegada até a conclusão. Na linha do tempo, o retorno de A é 5 ms, o de B é 6 ms e o de C é 5 ms.
A média é:
ms.
O instante de conclusão de B é 8 ms, mas ela esteve no sistema por apenas 6 ms porque chegou em 2 ms. Medir todas as tarefas desde o começo do gráfico superestimaria os atrasos das chegadas posteriores.
- 7ExemploMeça a primeira vez e a espera total
O tempo de resposta termina quando a tarefa executa pela primeira vez. A espera 0 ms por essa primeira vez, B espera 3 ms e C espera 4 ms. O tempo médio de resposta é aproximadamente 2,33 ms.
Aqui a resposta é igual à espera total porque cada tarefa que usa apenas a CPU executa sem interrupção depois de selecionada. Com preempção, intervalos posteriores no estado de pronto também contam como espera. Um intervalo bloqueado por entrada e saída conta para o retorno, mas não para a espera na fila de prontos.
- 8DesafioCalcule os atrasos de uma tarefa preemptada
A tarefa R chega em 1 ms, executa pela primeira vez em 4 ms e termina em 15 ms. Ela usa 6 ms de CPU sem entrada e saída. Encontre os tempos de resposta, de retorno e de espera.
---reveal---
O tempo de resposta é 3 ms e o de retorno é 14 ms. Subtrair 6 ms de atendimento do retorno resulta em 8 ms de espera total. Os 3 ms iniciais são apenas parte dessa espera; outros 5 ms ocorrem após a primeira vez de execução.
- 9Ideia-chaveAvalie a máquina e o indivíduo
Nossa sequência FIFO conclui três tarefas em 9 ms sem tempo ocioso. Sua vazão é aproximadamente 333,33 tarefas/s e sua utilização da CPU é 100% nesse intervalo. Esses valores para toda a máquina não descrevem a experiência de cada tarefa.
Examine atrasos individuais e um percentil alto quando os usuários se importam com esperas longas e raras. A justiça também considera se o trabalho pronto recebe atendimento, incluindo tarefas escondidas por uma média favorável.
- 10DesafioUse corretamente um intervalo bloqueado
Uma tarefa chega em 0 ms, executa 0–2, espera por um dispositivo 2–7, espera no estado de pronto 7–10 e executa 10–12 até terminar. Quais são seus tempos de resposta e de espera?
---reveal---
O tempo de resposta é 0 ms porque a tarefa executa imediatamente. O tempo de espera é 3 ms, o intervalo de pronto 7–10. Seu tempo de retorno de 12 ms também contém 4 ms de CPU e 5 ms bloqueada. Chamar todos os 8 ms fora da execução na CPU de “espera” misturaria dois estados do processo.
- 11RecapitulaçãoVerifique o estado antes de contar o tempo
Para uma nova sequência, identifique o trabalho pronto em cada evento, registre os intervalos de atendimento e depois extraia os instantes de primeira execução e de conclusão. Subtraia as chegadas antes de calcular as médias. Mantenha o tempo bloqueado separado ao medir a espera na fila de prontos.
2Construa escalonamentos a partir da regra da política
17 passos
Salve esta aula para seguir cada Lição Interativa passo a passo.
- 1IntroduçãoUma carga de trabalho, várias escolhas
- 2ExemploComece pela ordem de chegada
- 3ExemploDeixe o trabalho curto terminar primeiro
- 4DesafioPreveja a próxima rajada
- 5ExemploInterrompa a tarefa longa para uma chegada mais curta
- 6ExemploConclua o trabalho restante
- 7DesafioCompare com o que resta
- 8ConexãoUse o bloqueio para liberar capacidade
- 9ExemploAlterne duas tarefas iguais
- 10ExemploCalcule a conclusão com alternância
- 11DesafioPosicione uma chegada no limite da fatia
- 12Ideia-chaveConsidere o custo de cada transferência
- 13ExemploInterprete a classificação antes da execução
- 14ExemploAcompanhe quem mantém a trava
- 15DesafioEscolha a mudança útil de prioridade
- 16DesafioEscolha entre resposta e conclusão
- 17RecapitulaçãoTransforme uma regra em uma linha do tempo
3Acompanhe a realimentação e identifique a manipulação
12 passos
Salve esta aula para seguir cada Lição Interativa passo a passo.
- 1IntroduçãoAprenda sem conhecer a duração futura da rajada
- 2ExplicaçãoUse uma fila e dois limites de atendimento
- 3ExemploDeixe o uso contínuo da CPU levar a tarefa para baixo
- 4ExemploDê à recém-chegada sua oportunidade inicial
- 5DesafioPreserve uma cota interrompida
- 6ExemploRevele a brecha da cessão antecipada
- 7ExemploMantenha o histórico de atendimento
- 8DesafioConte apenas o consumo de CPU
- 9ExplicaçãoDê uma nova oportunidade ao trabalho antigo
- 10DesafioSepare as duas correções
- 11ConexãoAjuste as vezes de execução separadamente da classificação
- 12RecapitulaçãoAcompanhe as evidências que mudam a prioridade
4Contabilize o atendimento proporcional de CPU
16 passos
Salve esta aula para seguir cada Lição Interativa passo a passo.
- 1IntroduçãoComece com um direito
- 2ExemploInterprete os intervalos de bilhetes
- 3Ideia-chaveEspere variação em intervalos curtos
- 4DesafioConverta uma distribuição local
- 5ConexãoDeixe um serviço herdar o direito do cliente
- 6ExemploCalcule passos inversos à quantidade de bilhetes
- 7ExemploReúna novamente os progressos ponderados
- 8DesafioPosicione uma nova tarefa no escalonamento por passos
- 9ExplicaçãoContabilize o atendimento real em unidades virtuais
- 10ExemploDivida um período alvo
- 11DicaInterprete nice como entrada para o peso
- 12ConexãoEncontre o mínimo com eficiência
- 13ExplicaçãoFiltre a elegibilidade antes dos prazos
- 14DesafioAplique as duas comparações do EEVDF
- 15DesafioPreserve a parcela ao mudar o tamanho da requisição
- 16RecapitulaçãoSepare a distribuição da seleção
5Equilibre a carga da CPU mantendo a localidade útil
11 passos
Salve esta aula para seguir cada Lição Interativa passo a passo.
- 1IntroduçãoUma segunda CPU acrescenta uma escolha de distribuição
- 2ExplicaçãoReconheça o paralelismo disponível
- 3ExemploMantenha um conjunto de trabalho usado recentemente
- 4DesafioA coerência protege toda a atualização?
- 5ExplicaçãoEscolha uma organização de filas
- 6ExemploIdentifique atendimento desigual em CPUs ocupadas
- 7ExemploAlterne a distribuição para igualar o atendimento
- 8DesafioUse uma CPU ociosa quando permitido
- 9Ideia-chavePondere o custo de recuperação em relação ao atraso economizado
- 10DesafioDecida se a mudança economiza tempo
- 11RecapitulaçãoVerifique capacidade, elegibilidade e localidade
6Interprete os controles do sistema e avalie um escalonador
15 passos
Salve esta aula para seguir cada Lição Interativa passo a passo.
- 1IntroduçãoInterprete cada controle em sua própria camada
- 2ExplicaçãoVerifique a classe de política do Linux
- 3ExemploDiferencie parcela de distribuição
- 4ExemploAplique pesos de grupo sob competição
- 5DesafioInterprete uma cota agregada
- 6ConexãoReconheça a geração do escalonador
- 7ExplicaçãoRelacione configurações do Windows à classificação base
- 8ExemploDeixe uma elevação temporária decair
- 9DesafioVerifique a faixa de elevação
- 10ConexãoReconheça ideias relacionadas de realimentação
- 11ExplicaçãoEscolha a medição que importa
- 12ExemploMantenha a lei de Little dentro de um mesmo limite
- 13DesafioObtenha a espera a partir da população
- 14DesafioExplique uma aparente melhora de desempenho
- 15RecapitulaçãoRelacione uma configuração a um efeito medido
Questões de Escalonamento de CPU
Conjunto 1: Interprete decisões e acompanhe o atendimento de CPU10 Questões de Prática
Questão 1 de 10
Mostrar respostaOcultar resposta
Questão 2 de 10
Mostrar respostaOcultar resposta
Questão 3 de 10
Mostrar respostaOcultar resposta
Questão 4 de 10
Mostrar respostaOcultar resposta
Questão 5 de 10
Mostrar respostaOcultar resposta
Questão 6 de 10
Mostrar respostaOcultar resposta
Questão 7 de 10
Mostrar respostaOcultar resposta
Questão 8 de 10
Mostrar respostaOcultar resposta
Questão 9 de 10
Mostrar respostaOcultar resposta
Questão 10 de 10
Mostrar respostaOcultar resposta
Conjunto 2: Acompanhe prioridades, cotas e realimentação10 Questões de Prática
Salve esta aula para ver todas as respostas e praticar cada conjunto.
Questão 1 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 2 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 3 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 4 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 5 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 6 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 7 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 8 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 9 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 10 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Conjunto 3: Acompanhe a contabilização de bilhetes e tempo virtual10 Questões de Prática
Salve esta aula para ver todas as respostas e praticar cada conjunto.
Questão 1 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 2 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 3 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 4 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 5 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 6 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 7 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 8 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 9 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 10 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Conjunto 4: Distribua o trabalho e interprete os controles do Linux10 Questões de Prática
Salve esta aula para ver todas as respostas e praticar cada conjunto.
Questão 1 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 2 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 3 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 4 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 5 de 10
nice -n 8 ./worker. No escalonamento justo normal com tarefas concorrentes ocupadas, o que o comando altera?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 6 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 7 de 10
cpu.max definido como “60000 100000”. No início de um novo período, duas threads desse grupo executam simultaneamente em duas CPUs. Após quanto tempo decorrido de execução elas esgotam o orçamento?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 8 de 10
SCHED_FIFO na prioridade 35, a outra usa SCHED_RR na prioridade 45. Qual tem maior precedência?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 9 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 10 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Conjunto 5: Compare o comportamento do sistema e avalie as evidências10 Questões de Prática
Salve esta aula para ver todas as respostas e praticar cada conjunto.
Questão 1 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 2 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 3 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 4 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 5 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 6 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 7 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 8 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 9 de 10
sched_ext ativo impede o progresso de uma tarefa apta a executar, e o núcleo detecta a falha. Qual recuperação a interface oferece?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 10 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Travou em uma questão sua? Ajuda com Tarefas
Termos-Chave
A
Acesso não uniforme à memória (NUMA)
Afinidade de cache
Afinidade de CPU
Amortização
Á
Árvore rubro-negra
C
Classe de prioridade
Coerência de cache
Contabilização cumulativa
Cota de tempo de CPU
cpu.max
cpu.weight
D
Defasagem de serviço
Desequilíbrio de carga
Despachante
E
Efeito comboio
Elevação de prioridade
Envelhecimento
Escalonador completamente justo (CFS)
Escalonador de CPU
Escalonador de longo prazo
Escalonador de médio prazo
Escalonamento circular
Escalonamento multiprocessador com fila única (SQMS)
Escalonamento multiprocessador com múltiplas filas (MQMS)
Escalonamento por loteria
Escalonamento por passos
Escalonamento por prioridade
Estado de bloqueado
Estado de pronto
F
Filas multinível com realimentação (MLFQ)
G
Granularidade mínima
Grupo de controle (cgroup)
H
Herança de prioridade
I
Inanição
Inflação de bilhetes
Interrupção de dispositivo
Inversão de prioridade
L
Latência de cauda
Latência de despacho
Lei de Little
Localidade espacial
Localidade temporal
M
Manipulação do escalonador
Média exponencial
Menor tempo restante primeiro (STCF, também SRTF)
Migração
Modelagem determinística
Modelo de filas
Moeda de bilhetes
Multiprocessamento simétrico (SMP)
Multithreading simultâneo (SMT)
P
Parcela proporcional
Passo
Período de elevação de prioridade
Prazo virtual
Preempção
Primeiro a entrar, primeiro a sair (FIFO)
Primeiro prazo virtual elegível (EEVDF)
Prioridade base
Prioridade dinâmica
Q
Qualidade de serviço (QoS)
Quantum de tempo
R
Rajada de CPU
Rebaixamento de prioridade
Registro de carga de trabalho
Roubo de trabalho
S
sched_ext
SCHED_FIFO
SCHED_RR
Simulação
Sobrecarga de troca de contexto
Sobreposição de entrada e saída
T
Tarefa interativa
Tarefa limitada por entrada e saída
Tarefa limitada por processamento
Tarefa mais curta primeiro (SJF)
Tempo de espera
Tempo de execução virtual
Tempo de resposta
Tempo de retorno
Tempo restante
Transferência de bilhetes
U
ULE
Utilização da CPU
V
Valor de nice
Valor de passagem
Vazão
Sobre esta aula
Crie seus próprios Materiais de Estudo
Transforme suas anotações, slides e documentos em Guias de Estudo, Questões de Prática, Flashcards e mais 6 ferramentas.