Todos Os Robins Em Ordem - Conheça todos os Robins do universo da DC - YouTube
Conheça todos os Robins do universo da DC - YouTube

Round Robin: o que você realmente precisa saber antes de implementar

O algoritmo de escalonamento Round Robin é mais simples do que a maioria dos tutoriais sugere. Você define um quantum de tempo, coloca processos numa fila circular e gira entre eles. Quando o temporizador dispara, o processo atual é preempido e vai para o final da fila. Isso se repete até que todos terminem. A ideia é boa no papel. Na prática, há detalhes que fazem tudo dar errado.

todos os robins em ordem

Se você está procurando uma lista organizada das variantes e versões relacionadas do Round Robin, aqui vai. O Round Robin clássico é a base. A partir dele surgem variações que resolvem problemas específicos, mas cada uma introduz suas próprias compensações. Round Robin simples - Quantum fixo. Sem nenhuma adaptação. É o que você encontra em qualquer livro de sistemas operacionais. Funciona para fins didáticos, mas colapsa em ambientes com alta variabilidade de carga porque processos curtos e longos recebem o mesmo tratamento cego.

Round Robin com quantum adaptativo - O tempo de processamento é ajustado dinamicamente com base no histórico do processo. Processos que usam todo o quantum recebido tendem a receber menos tempo na próxima iteração, enquanto processos que são frequentemente preempidos recebem mais. Isso melhora a responsividade em sistemas interativos, mas adiciona complexidade na manutenção das estatísticas por processo. Round Robin multinível com filas - Diferentes classes de processos operam em filas separadas com quantums distintos. Filas de maior prioridade recebem quanta maiores. Processos que excedem seu quantum descendem para uma fila de prioridade inferior. Esse é o modelo que o Windows NT e variantes do Linux usaram em diferentes épocas. O problema é que você precisa decidir quantas filas criar e como fazer a migração entre elas. Escolhas erradas geram starvation em filas inferiores.

Round Robin com weight (WRR) - Cada processo recebe um peso e o quantum é proporcional a esse peso. Um processo com peso 3 recebe três vezes mais CPU do que um com peso 1. Usado em roteadores e balanceadores de carga. A implementação exige cuidado com a soma dos pesos para evitar drift temporal quando os pesos não são uniformes. Revised Quantum Round Robin - O quantum começa pequeno e aumenta exponencialmente para processos que continuam sendo preempidos. Processos de I/O bound sofrem menos porque não perdem tempo em quantums grandes demais. A desvantagem é que processos CPU-bound que chegam tarde podem demorar para estabilizar e começar a ter desempenho aceitável.

👉 Clique no botão abaixo para saber mais sobre o assunto!

Double Queue Round Robin - Dois ciclos de Round Robin encadeados. O primeiro seleciona uma fila de trabalho válida; o segundo escolhe um processo dentro dela. Usado em alguns algoritmos de scheduling de rede. Adiciona uma camada extra de indireção que pode ser desnecessária em sistemas com poucos processos ativos simultaneamente. A escolha do quantum é onde a maioria das pessoas erra. Um quantum muito pequeno gera overhead excessivo de contexto. Um muito grande transforma o escalonador num simple First Come First Served disfarçado. Em sistemas reais com troca de contexto típica de 10 a 100 microssegundos, um quantum entre 10 e 100 milissegundos costuma ser o ponto de equilíbrio. Depende da sua máquina. Você precisa testar.

Aqui vai um problema que encontrei na prática e que raros artigos mencionam. Se você implementa Round Robin em um sistema com múltiplos núcleos e não considera a localidade de cache, o desempenho pode piorar significativamente. O algoritmo puro não leva em conta em qual CPU um processo estava rodando anteriormente. Quando ele é escalonado em outro núcleo, o cache L1 e L2 estão praticamente vazios. Num servidor com carga variável, isso pode adicionar dezenas de milissegundos de latência por troca de núcleo. A solução que encontrei foi manter uma tabela de mapeamento processo-CPU e dar preferência ao núcleo anterior antes de redistribuir, mesmo que isso signifique violar levemente a pureza do algoritmo Round Robin original. Outro detalhe importante que muitos ignoram: a preempção por temporizador não é atômica. Em implementações ingênuas, um processo pode receber duas interrupções de timer antes de ter chance de ser reagendado, especialmente em sistemas com tick rate alto. O resultado é um processo que consome mais do que seu quantum designado sem ser preempido de fato. A correção é verificar se o processo já foi sinalizado para preempção antes de permitir nova contagem do temporizador.

Se você precisa de algo prático, a biblioteca librrs em Rust ou as implementações em C disponíveis no repositório do kernel Linux dão uma base sólida. Para aprendizado, o simulador do OSDev Wiki é funcional e o código é razoavelmente legível. Não espere que copiar e colar de exemplos da internet funcione em produção sem ajustes. Cada sistema tem características de hardware e carga que exigem recalibração. Round Robin também tem limitações claras. Ele não considera a prioridadedos processos de forma nativa. Processos críticos e processos em background recebem o mesmo tratamento básico. Em sistemas onde isso importa, você precisa adicionar uma camada de prioridade sobre o Round Robin, o que complica a implementação e introduz novos pontos de falha. Se o seu cenário exige garantia de tempo real, procure por algoritmos como EDF ou Rate-Monotonic Scheduling em vez de insistir com Round Robin.

A outra fraqueza é a suposiçāo de que todos os processos chegam no momento errado. Se processos chegam em rajadas, a fila pode crescer descontroladamente e a latência média dispara. Implementar um mecanismo de abandono ou reavaliação periódica da fila ajuda, mas novamente adiciona complexidade. O que sobra é que Round Robin continua sendo uma escolha razoável para sistemas de propósito geral onde a simplicidade importa mais que a otimização extrema. Se o seu objetivo é aprendizado ou um sistema embarcado com carga previsível, ele funciona. Se você está construindo algo para produção com requisitos apertados de latência, considere começar com uma variante adaptativa ou migrar diretamente para um escalonador já testado em ambiente real.