> For the complete documentation index, see [llms.txt](https://concorrencia101.leandronsp.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://concorrencia101.leandronsp.com/parte-i-concorrencia-no-sistema-operacional/uma-nota-sobre-escalonamento-cooperativo.md).

# Uma nota sobre escalonamento cooperativo

Até agora falamos de um modelo escalonamento que é o *preemptivo*, e que atende de forma eficiente muitos sistemas operacionais modernos.

Mas antes mesmo do modelo preemptivo se tornar predominante, muitos sistemas utilizavam o **escalonamento cooperativo**. Nesse modelo, cada processo controlava explicitamente quando liberar a CPU para outros processos. Isso era feito ao atingir certos pontos no código em que o processo voluntariamente "cedia" o controle ao sistema operacional.

> Daí o nome escalonamento *cooperativo*

Entretanto, o modelo cooperativo traz algumas limitações, pois um erro de programação como loop infinito por exemplo, pode fazer um processo *monopolizar* a CPU, caindo num cenário de **CPU starvation** para os outros processos.

Há também o fato de que o modelo cooperativo depende muito de uma **boa implementação** de cada programa, o que dificulta garantir tempos de resposta rápidos para tarefas críticas na CPU.

Mas calma, o modelo cooperativo tem suas vantagens...

O escalonamento cooperativo é usado em contextos específicos, como em sistemas embarcados simples ou em algumas linguagens de programação ou frameworks/bibliotecas que implementam **concorrência cooperativa** com o modelo de *corrotinas* - que vamos abordar mais a frente no guia.

***

> Bom, se você prestou bem atenção até aqui, eu não fiz uma menção sequer a *threads*. É proposital, acho que devemos dissociar este conceito de concorrência às threads (em um primeiro contato)
