Scheduler (Escalonador)
Definição
Scheduler (Escalonador) é o componente do sistema operacional responsável por decidir qual processo ou thread deve ser executado a seguir, e por quanto tempo.
Ele gerencia a distribuição da CPU entre múltiplas unidades de execução, garantindo que todos os processos recebam tempo adequado e que o sistema permaneça responsivo.
O escalonamento pode ocorrer entre processos independentes ou threads dentro de um mesmo processo, dependendo do modelo de concorrência da linguagem ou do sistema operacional.
Objetivos do Scheduler
- Compartilhar a CPU de forma justa e eficiente entre tarefas ativas.
- Maximizar o uso dos recursos do sistema (como núcleos e cache).
- Manter a responsividade de tarefas interativas, como interfaces gráficas.
- Evitar inanição (starvation) e garantir que todos os processos tenham chance de execução.
- Suportar múltiplas estratégias de escalonamento, conforme o perfil da aplicação.
Estratégias comuns de escalonamento
- Round Robin: alterna entre processos em intervalos fixos (time slices).
- Prioridade: dá preferência a tarefas mais importantes.
- First Come, First Served (FCFS): executa processos na ordem de chegada.
- Shortest Job First (SJF): executa primeiro os processos mais curtos.
- Multilevel Queue: separa processos por tipo (ex: sistema vs. usuário).
Exemplo prático (simulação simples)
Neste exemplo, usamos asyncio
para simular tarefas com diferentes tempos e observar como o event loop alterna entre elas:
import asyncio
async def tarefa(nome, tempo):
for i in range(3):
print(f'{nome} - passo {i}')
await asyncio.sleep(tempo)
async def main():
await asyncio.gather(
tarefa("Tarefa Curta", 0.1),
tarefa("Tarefa Longa", 0.3)
)
asyncio.run(main())
Saída esperada (parcial)
Tarefa Curta - passo 0
Tarefa Longa - passo 0
Tarefa Curta - passo 1
Tarefa Longa - passo 1
...
asyncio
permita alternância entre tarefas, mas ele não implementa estratégias como prioridade ou preempção. É uma forma de escalonamento cooperativo, onde cada tarefa decide quando ceder o controle (comawait
).
Embora o escalonamento real seja feito pelo sistema operacional, o event loop
simula um agendador cooperativo em aplicações assíncronas.
O ciclo do Scheduler
[Processos prontos]
↓
[Escalonador decide quem executa]
↓
[Processo em execução] → [interrompido ou finalizado]
↓
[Volta para fila de prontos]
O escalonador controla quando e como cada tarefa recebe tempo de CPU.
Em sistemas com múltiplos núcleos, o escalonador também define em qual núcleo cada tarefa será executada.
Em linguagens como Python, o escalonamento entre threads é gerenciado pelo sistema operacional, mas o
asyncio
também inclui um mini-escalonador cooperativo, controlado peloevent loop
.
Exemplo: enquanto uma tarefa aguarda uma operação de disco, o escalonador pode colocar outra tarefa para usar a CPU nesse tempo.