Professor: Gabriel Soares Baptista
Escalonar significa decidir quem usa a CPU, quando e por quanto tempo.
Em um sistema multiprogramado, essa decisão afeta diretamente:
Imagine um único caixa atendendo uma fila inteira de clientes.
O problema principal não é como o caixa trabalha internamente, mas qual cliente ele atende primeiro.
No sistema operacional, a CPU é esse caixa. O escalonador precisa evitar dois extremos:
Se um processo curto ficar preso atrás de um processo muito longo, qual será o impacto na percepção de desempenho?
Uma decisão de escalonamento costuma ocorrer em quatro momentos:
Cada decisão tenta equilibrar responsividade, justiça e eficiência.
Os processos alternam entre surtos de CPU e espera por E/S.
| Tipo | Comportamento | Exemplo |
|---|---|---|
| CPU-bound | Longos surtos de CPU | renderização, simulação |
| I/O-bound | Surtos curtos, muitas esperas | banco de dados, shell |
Processos I/O-bound se beneficiam de receber a CPU rapidamente para disparar a próxima operação de disco ou rede.
O processo mantém a CPU até terminar ou bloquear.
O sistema pode retirar a CPU do processo atual, normalmente por interrupção de relógio.
Ideia-chave:
Para comparar algoritmos, observamos principalmente:
$$T_{ret} = T_{termino} - T_{chegada}$$
$$T_{resp} = T_{primeira\_execucao} - T_{chegada}$$
| Ambiente | Objetivo dominante |
|---|---|
| Lote | vazão e tempo de retorno |
| Interativo | tempo de resposta |
| Tempo real | cumprimento de prazos |
Não existe algoritmo ideal para todos os cenários.
Um algoritmo ótimo para lote pode ser péssimo para um desktop interativo.
Executa na ordem de chegada.
Vantagens:
Problema clássico:
Se um processo longo entra primeiro, os curtos ficam todos atrás dele.
Consequências:
| Processo | Burst |
|---|---|
| $P_1$ | 24 ms |
| $P_2$ | 3 ms |
| $P_3$ | 3 ms |
No FCFS, a média de espera sobe bastante só por causa da ordem de chegada.
Considere três processos chegando em $t=0$ na ordem $P_1, P_2, P_3$.
| Processo | Burst |
|---|---|
| $P_1$ | 24 ms |
| $P_2$ | 3 ms |
| $P_3$ | 3 ms |
Tempos de espera:
Média:
$$\frac{0+24+27}{3}=17\text{ ms}$$
Se invertermos a ordem para $P_2, P_3, P_1$, a média cai para:
$$\frac{0+3+6}{3}=3\text{ ms}$$
Escolhe primeiro a tarefa mais curta disponível.
Quando todas as tarefas chegam juntas, o SJF minimiza o tempo médio de espera e o tempo médio de retorno.
Intuição:
Limitação importante:
Quatro tarefas com tempos $8, 4, 4, 4$.
| Ordem | Retornos |
|---|---|
| FCFS: $A, B, C, D$ | $8, 12, 16, 20$ |
| SJF: $B, C, D, A$ | $4, 8, 12, 20$ |
Resultado:
O ganho aparece porque as tarefas curtas deixam de carregar o peso da longa logo no começo.
Todos chegam em $t=0$.
| Processo | Burst | Ordem no SJF |
|---|---|---|
| $P_1$ | 6 ms | 2 |
| $P_2$ | 8 ms | 4 |
| $P_3$ | 7 ms | 3 |
| $P_4$ | 3 ms | 1 |
Tempos de espera no SJF:
Logo,
$$T_{esp}^{medio}=\frac{0+3+9+16}{4}=7\text{ ms}$$
É a versão preemptiva do SJF.
Quando chega uma nova tarefa, comparamos seu tempo com o tempo restante do processo atual.
Se a nova for menor, ela interrompe a execução corrente.
Isso melhora o atendimento de tarefas curtas que chegaram tarde, mas aumenta o número de chaveamentos de contexto.
O benefício é claro para tarefas curtas.
O custo também é claro:
Considere:
| Processo | Chegada | Burst |
|---|---|---|
| $P_1$ | 0 | 8 |
| $P_2$ | 1 | 4 |
| $P_3$ | 2 | 9 |
| $P_4$ | 3 | 5 |
Retornos com SJF não preemptivo:
$$8, 11, 24, 14 \Rightarrow media=14{,}25\text{ ms}$$
Retornos com SRTN:
$$17, 4, 24, 7 \Rightarrow media=13\text{ ms}$$
O SRTN melhora a média porque interrompe o processo longo no momento certo.
Em que tipo de máquina um custo alto de chaveamento faria o SRTN perder parte da sua vantagem?
Cada processo recebe um quantum de CPU.
Se não terminar nesse intervalo, volta para o fim da fila.
É o algoritmo clássico de sistemas interativos porque:
Considere $P_1=24$, $P_2=3$ e $P_3=3$, todos chegando em $t=0$, com quantum de 4 ms.
Linha do tempo:
Tempos de resposta:
Logo,
$$T_{resp}^{medio}=\frac{0+4+7}{3}=3{,}66\text{ ms}$$
| Quantum curto | Quantum longo |
|---|---|
| mais responsividade | menos overhead |
| mais trocas de contexto | pior tempo de resposta |
| desperdício se o overhead for alto | comportamento parecido com FCFS |
Na prática, o quantum precisa ser grande o suficiente para não desperdiçar CPU e pequeno o suficiente para manter o sistema fluido.
Nem todos os processos têm a mesma urgência.
No escalonamento por prioridades, o processo mais prioritário executa primeiro.
Problema:
Solução clássica:
Muitos sistemas combinam prioridades + Round-Robin dentro de cada fila.
Tenta entregar a cada processo sua fração prometida de CPU.
Cada processo recebe bilhetes e disputa a CPU probabilisticamente.
Distribui CPU por usuário ou grupo, não apenas por processo.
Essas abordagens atacam o problema da justiça por ângulos diferentes.
Exemplo rápido de Fair-Share:
Então cada processo do Usuário 1 recebe, em média, $12{,}5\%$ da CPU, enquanto o processo do Usuário 2 recebe $50\%$.
Em sistemas de tempo real, o foco não é só terminar rápido.
O essencial é terminar antes do prazo. Condição de Escalonabilidade: Com $m$ eventos periódicos, onde o evento $i$ ocorre com período $P_i$ e precisa de $C_i$ segundos de CPU, o sistema é escalonável se:
$$\sum_{i=1}^{m} \frac{C_i}{P_i} \leq 1$$
Se a soma ultrapassa 1, a CPU exigida supera a capacidade disponível.
Exemplo:
$$\frac{50}{100}+\frac{30}{200}+\frac{100}{500}=0{,}85$$
Como $0{,}85 < 1$, o sistema ainda é escalonável.
O kernel escolhe o processo, e a biblioteca local decide qual thread roda.
O kernel enxerga cada thread individualmente e pode intercalá-las livremente.
Consequência:
Uma ideia central de projeto é separar:
Essa separação evita engessar o sistema e permite adaptar a estratégia ao contexto da aplicação.
| Algoritmo | Melhor uso | Risco principal |
|---|---|---|
| FCFS | lote simples | efeito comboio |
| SJF | lote com tempos conhecidos | starvation de longos |
| SRTN | cargas mistas com tarefas curtas | overhead de preempção |
| Round-Robin | sistemas interativos | quantum mal ajustado |
| Prioridades | cargas com urgências distintas | starvation sem aging |
| Fair-Share / Loteria | ambientes multiusuário | calibração da justiça |
| Tempo real | sistemas críticos | perda de prazo |
Escalonamento é o ponto onde o sistema operacional transforma uma CPU única em uma experiência aparentemente fluida para muitos processos ao mesmo tempo.
Escolher bem significa equilibrar:
Na próxima aula: 7 - deadlocks.
Veremos como processos podem ficar presos permanentemente ao disputar recursos e como o sistema tenta prevenir ou detectar esse colapso.