
O kernel do Linux possui um grande conjunto deparâmetrosque permitem aos usuários ajustar o comportamento do kernel sem recompilá-lo. Não parece haver um parâmetro para ajustar o modelo de preempção:
-*- Preemption Model
No Forced Preemption (Server) (PREEMPT_NONE)
--> Voluntary Kernel Preemption (Desktop) (PREEMPT_VOLUNTARY)
Preemptible Kernel (Low-Latency Desktop) (PREEMPT)
Por que os desenvolvedores do kernel não adicionaram uma opção para escolher entre eles?
Responder1
A preempção é implementada usando um (grande) número de pontos de preempção explícitos (procurados might_sleep
no kernel), muitos dos quais estão em caminhos um tanto 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 rendimento máximo. Da mesma forma, um kernel de preempção voluntária não possui nenhuma verificação de preempção no IRQ e nos pontos de entrada do kernel. Alterar isso para que a preempção pudesse 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 sofreriam algum custo mesmo na melhor das hipóteses (por exemplo, mesmo que a preempção fosse uma configuração de tempo de inicialização e a configuração “sem preempção” pudesse corrigir os sites de chamada relevantes, você ainda acabaria com um código que não faz nada, ocupando um espaço precioso nos caches de código).