
El kernel de Linux tiene un gran conjunto deparámetrosque permiten a los usuarios ajustar el comportamiento del kernel sin volver a compilarlo. No parece haber un parámetro para ajustar el modelo de preferencia:
-*- Preemption Model
No Forced Preemption (Server) (PREEMPT_NONE)
--> Voluntary Kernel Preemption (Desktop) (PREEMPT_VOLUNTARY)
Preemptible Kernel (Low-Latency Desktop) (PREEMPT)
¿Por qué los desarrolladores del kernel no agregaron un interruptor para elegir entre ellos?
Respuesta1
La preferencia se implementa utilizando una (gran) cantidad de puntos de preferencia explícitos (búsquelos might_sleep
en el kernel), muchos de los cuales se encuentran en rutas algo activas. La preferencia total ( CONFIG_PREEMPT
) tiene un impacto aún mayor; por ejemplo, los spinlocks verifican el recuento de preferencia (al menos, en kernels que no son SMP), al igual que las IRQ.
Actualmente, el modelo de preferencia elegido se aplica en tiempo de compilación; como resultado, sin preferencia forzada, nada del código de preferencia sobrevive en el kernel y se obtiene el máximo rendimiento. Del mismo modo, un kernel de preferencia voluntaria no tiene controles de preferencia en IRQ ni en los puntos de entrada del kernel. Cambiar esto para que la preferencia pueda cambiarse en tiempo de ejecución significaría que todas las configuraciones tendrían que verificar la configuración de preferencia, al menos en el arranque, y sufrir algún costo incluso en el mejor de los casos (p.ej, incluso si la preferencia fuera una configuración de tiempo de arranque, y la configuración de "sin preferencia" pudiera parchear los sitios de llamadas relevantes, todavía terminaría con un código que no hace nada y que ocupa un espacio precioso en las cachés de código).