# Preemptividade

Em computação, preemptividade (algumas vezes preempção) é o ato de interromper temporariamente uma tarefa sendo executada por um sistema computacional, sem exigir sua cooperação, e com a intenção de retomar à tarefa posteriormente. Tais mudanças da tarefa executada são conhecidas como trocas de contexto. Normalmente, é realizada por uma tarefa privilegiada ou parte do sistema conhecido como escalonador preemptivo, que tem o poder de antecipar, interromper e, posteriormente, retomar outras tarefas no sistema.
Em sistemas operacionais, preemptividade ou preempção é a capacidade de tirar de execução um processo em favor de outro. Esta é uma característica que não é importante apenas nos sistemas operacionais em tempo real. Este tipo de intervenção por parte dos escalonadores dos sistemas operacionais pode ocorrer - embora não seja limitada apenas a isso - a otimizar a entrada/saída de dados em tempo real, como é o caso da gravação de áudio. Um exemplo de uma tarefa não-preemptiva é o processamento de interrupções.
Algoritmos preemptivos são mais adequados para sistemas em que múltiplos processos requerem atenção do sistema, ou seja, no caso de sistemas multiusuário interativos (sistemas em tempo repartido) ou em sistema de tempo real. Nestes casos, a preemptividade representa a troca do processo em execução, assim sendo, para que o processador seja retirado de um processo, interrompendo seu trabalho, e designado a outro processo, anteriormente interrompido, é fundamental que ocorra a troca de contexto dos processos. Tal troca exige que todo o estado de execução de um processo seja adequadamente armazenado para sua posterior recuperação, representando uma sobrecarga computacional para realização desta troca e armazenagem de tais dados. Usualmente os algoritmos preemptivos são mais complexos dada a natureza imprevisível dos processos.
Por sua vez, os algoritmos não preemptivos são mais simples e adequados para o processamento não interativo, semelhante aos esquemas de processamento em lote dos sistemas batch. Embora não proporcionando interatividade, são geralmente mais eficientes e previsíveis quanto ao tempo de entrega de suas tarefas.
O mesmo conceito pode ser aplicado ainda quando avaliamos os processos de uma organização.

## Modo usuário e modo kernel

Em qualquer projeto de sistema, algumas operações realizadas pelo sistema podem não ser preemptivas. Isso geralmente se aplica a funções do kernel e interrupções de serviços que, se não forem permitidas a execução até a conclusão, tenderiam a produzir condições de corrida que resultariam em deadlock. Bloquear o escalonador de antecipar tarefas enquanto elas estão processando as funções do kernel simplifica o design do kernel às custas da capacidade de resposta do sistema. A distinção entre o modo usuário e o modo kernel, que determina o nível de privilégio no sistema, também pode ser usada para distinguir se uma tarefa é atualmente preemptiva.
A maioria dos sistemas modernos possuem kernels preemptivos, projetados para permitir que as tarefas sejam preteridas mesmo no modo kernel. Exemplos de tais sistemas são o Solaris 2.0/SunOS 5.0, Windows NT, kernel Linux (2.6.x e mais recentes), AIX e alguns sistemas BSD (NetBSD, desde a versão 5).