# Escalonador preemptivo de tarefas

O *escalonador de tarefas* do sistema operacional é o componente responsável por gerenciar o uso da CPU entre os processos, estabelecendo assim a **concorrência**. Por alternar tão rápido entre processos, temos a impressão que são executados simultaneamente - mesmo que na realidade, a CPU execute apenas um processo por vez em sistemas single-core.

Em sistemas UNIX-like, o modelo de escalonamento é chamado de **preemptivo**. Isso significa que o escalonador pode interromper a execução de um processo a qualquer momento para dar lugar a outro processo.

Essa *interrupção* é feita de forma controlada, pelo que o controle pode ser feito de algumas formas:

* **fatia de tempo (time slice)**: sinais que notificam o escalonador para alternar entre processos após um intervalo de tempo definido
* **prioridade**: a cada processo é associada uma prioridade, e processos mais prioritários podem ser escalonados antes de outros
* **estado dos processos**: o escalonador analisa se um processo está aguardando I/O, bloqueado ou pronto para ser executado

<figure><img src="https://1347906346-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FADWkcUWoXJQdqxwxxE7z%2Fuploads%2FENhbgHo9GoDMHPsOhvNu%2FScreenshot%202024-11-28%20at%2022.42.02.png?alt=media&#x26;token=0ed98136-b5a8-46b6-b8fd-1cfef8936bd5" alt=""><figcaption></figcaption></figure>

O escalonamento *preemptivo* permite ao sistema operacional controlar a concorrência de processos **sem que determinado processo monopolize a CPU**, balanceando o uso da CPU de forma eficiente.

> TIL: enquanto preparava o conteúdo deste guia, descobri dois comandos que permitem rodar programas modificando a prioridade em sistemas UNIX-like: **nice** e **renice**.

*Nice, uh?*
