En un kernel preventivo, un proceso que se ejecuta en modo kernel puede ser reemplazado por otro proceso mientras se encuentra en medio de una función del kernel.
Esto solo se aplica a los procesos que se ejecutan en modo kernel, una CPU que ejecuta procesos en modo usuario se considera "inactiva". Si un proceso en modo usuario desea solicitar un servicio del kernel, debe emitir una excepción que el kernel pueda manejar.
Como ejemplo:
Proceso A
ejecuta un controlador de excepciones, Process B
se despierta por una solicitud IRQ, el kernel reemplaza el proceso A
con B
(un cambio de proceso forzado). Proceso A
queda sin terminar. El programador decide después si el proceso A
obtiene tiempo de CPU o no.
En un kernel no preventivo, procesa A
simplemente habría utilizado todo el tiempo del procesador hasta que termine o decida voluntariamente permitir que otros procesos lo interrumpan (un cambio de proceso planificado).
Los sistemas operativos basados en Linux de hoy en día generalmente no incluyen un kernel totalmente preventivo, todavía hay funciones críticas que tienen que ejecutarse sin interrupción. Así que creo que podría llamar a esto un "núcleo preventivo selectivo".
Aparte de eso, existen enfoques para hacer que el kernel de Linux (casi) sea completamente preventivo.
- Wiki de Linux en tiempo real
- Artículo de LWN
la preferencia es -> La capacidad del sistema operativo para adelantarse o detener una tarea actualmente programada en favor de una tarea de mayor prioridad. La programación puede ser una de, entre otras, programación de procesos o de E/S, etc.
Bajo Linux, los programas de espacio de usuario siempre han sido prioritarios:el kernel interrumpe los programas de espacio de usuario para cambiar a otros subprocesos, utilizando el tictac de reloj regular. Por lo tanto, el núcleo no espera a que los programas de espacio de usuario liberen explícitamente el procesador (que es el caso de la multitarea cooperativa). Esto significa que un bucle infinito en un programa de espacio de usuario no puede bloquear el sistema.
Sin embargo, hasta los núcleos 2.6, el propio núcleo no era prioritario:tan pronto como un subproceso entraba en el núcleo, no se podía impedir que ejecutara otro subproceso. Sin embargo, esta ausencia de derecho preferente en el núcleo provocaba varios problemas con respecto a la latencia y la escalabilidad. Por lo tanto, la prioridad del kernel se introdujo en los kernels 2.6 y se puede habilitar o deshabilitar usando la opción CONFIG_PREEMPT. Si CONFIG_PREEMPT está habilitado, entonces el código del núcleo se puede adelantar en todas partes, excepto cuando el código ha deshabilitado las interrupciones locales. Un bucle infinito en el código ya no puede bloquear todo el sistema. Si CONFIG_PREEMPT está deshabilitado, entonces se restablece el comportamiento 2.4.
Recitado y formateado de:http://www.linuxquestions.org/questions/linux-general-1/pre-emptive-vs-non-pre-emptive-kernel-582437/