A preempção é implementada usando um número (grande) de pontos de preempção explícitos (procure might_sleep
no kernel), muitos dos quais estão em caminhos um pouco quentes. A preempção total ( CONFIG_PREEMPT
) tem um impacto ainda maior; por exemplo, os spinlocks verificam a contagem de preempção (pelo menos, em kernels não-SMP), assim como os IRQs.
Atualmente, o modelo de preempção escolhido é aplicado em tempo de compilação; Como resultado, sem preempção forçada, nenhum código de preempção sobrevive no kernel e você obtém o máximo rendimento. Da mesma forma, um kernel de preempção voluntária não tem nenhuma verificação de preempção no IRQ e nos pontos de entrada do kernel. Alterar isso para que a preempção possa ser alterada em tempo de execução significaria que todas as configurações teriam que verificar a configuração de preempção, pelo menos na inicialização, e sofrer algum custo, mesmo no melhor caso (por exemplo, mesmo se a preempção era uma configuração de tempo de inicialização, e a configuração de “sem preempção” poderia remendar os sites de chamadas relevantes, você ainda terminaria com código de nada ocupando espaço precioso em caches de código).