¿Qué significa decir "el kernel de Linux es preventivo"?


He leído que el kernel de Linux es preventivo, que es diferente de la mayoría de los kernels de Unix. Entonces, ¿qué significa realmente que un kernal sea preventivo?

Algunas analogías o ejemplos serían mejores que una explicación teórica pura.

Author: phihag, 2011-03-12

8 answers

Imagine la simple vista de la multitarea preventiva. Tenemos dos tareas de usuario, las cuales se están ejecutando todo el tiempo sin usar ninguna E/S o realizar llamadas al núcleo. Esas dos tareas no tienen que hacer nada especial para poder ejecutarse en un sistema operativo multitarea. El núcleo, normalmente basado en una interrupción de temporizador, simplemente decide que es hora de que una tarea se detenga para dejar que otra se ejecute. La tarea en cuestión es completamente inconsciente de que algo sucedió.

Sin embargo, la mayoría de las tareas hacen peticiones ocasionales del núcleo a través de llamadas de sistema. Cuando esto sucede, existe el mismo contexto de usuario, pero la CPU está ejecutando código del núcleo en nombre de esa tarea.

Los núcleos de Linux más antiguos nunca permitían la prioridad de una tarea mientras estaba ocupada ejecutando el código del núcleo. (Tenga en cuenta que las operaciones de E/S siempre se reprograman voluntariamente. Estoy hablando de un caso en el que el código del núcleo tiene alguna operación intensiva en CPU como ordenar una lista.)

Si el sistema permite que esa tarea sea preempted mientras se ejecuta el código del núcleo, entonces tenemos lo que se llama un "núcleo apropiativo."Este sistema es inmune a los retrasos impredecibles que se pueden encontrar durante las llamadas al sistema, por lo que podría ser más adecuado para tareas incrustadas o en tiempo real.

Por ejemplo, si en una CPU en particular hay dos tareas disponibles, y una toma una llamada de sistema que toma 5 ms para completarse, y la otra es una aplicación de reproductor de MP3 que necesita alimentar la tubería de audio cada 2 ms, es posible que escuche sonido tartamudo.

El argumento en contra de la preempción es que todo el código del kernel que podría ser llamado en el contexto de la tarea debe ser capaz de sobrevivir a la preempción there hay una gran cantidad de código de controlador de dispositivo pobre, por ejemplo, que podría ser mejor si siempre es capaz de completar una operación antes de permitir que alguna otra tarea se ejecute en ese procesador. (Con los sistemas multiprocesadores la regla en lugar de la excepción en estos días, todo el código del núcleo debe ser reentrante, por lo que ese argumento no es tan relevante hoy en día.) Además, si el mismo objetivo se puede alcanzar mejorando las llamadas de sistema con mala latencia, tal vez no sea necesaria la preempción.

Un compromiso es CONFIG_PREEMPT_VOLUNTARY, que permite un cambio de tarea en ciertos puntos dentro del núcleo, pero no en todas partes. Si solo hay un pequeño número de lugares donde el código del kernel podría atascarse, esta es una forma barata de reducir la latencia mientras se mantiene la complejidad manejable.

 14
Author: Eric Seppanen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-12 17:18:09

Antes de la versión 2.5.4 del kernel de Linux, el kernel de Linux no era preventivo, lo que significa que un proceso que se ejecuta en modo kernel no se puede mover fuera del procesador hasta que salga del procesador o comience a esperar a que se complete alguna operación de entrada y salida.

Generalmente un proceso en modo usuario puede entrar en modo kernel usando llamadas al sistema. Anteriormente, cuando el núcleo no era apropiativo, un proceso de menor prioridad podía invertir la prioridad de un proceso de mayor prioridad negándole el acceso a el procesador llamando repetidamente llamadas al sistema y permaneciendo en el modo kernel. Incluso si el timeslice del proceso de menor prioridad expirara, continuaría ejecutándose hasta que completara su trabajo en el kernel o renunciara voluntariamente al control. Si el proceso de mayor prioridad que espera ejecutarse es un editor de texto en el que el usuario está escribiendo o un reproductor de MP3 listo para rellenar su búfer de audio, el resultado es un rendimiento interactivo deficiente. De esta manera, el kernel no preventivo fue un gran inconveniente tiempo.

 23
Author: pradeepchhetri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-12 16:12:03

Los núcleos unix tradicionales tenían un único bloqueo, que era mantenido por un hilo mientras el código del núcleo se estaba ejecutando. Por lo tanto, ningún otro código del núcleo podría interrumpir ese hilo.

Esto hizo que diseñar el núcleo fuera más fácil, ya que sabías que mientras un subproceso usaba recursos del núcleo, ningún otro subproceso lo era. Por lo tanto, los diferentes hilos no pueden estropear el trabajo de cada uno.

En sistemas de un solo procesador esto no causa demasiados problemas.

Sin embargo, en sistemas multiprocesador, usted podría tener una situación en la que varios subprocesos en diferentes procesadores o núcleos querían ejecutar el código del núcleo al mismo tiempo. Esto significa que dependiendo del tipo de carga de trabajo, puede tener muchos procesadores, pero todos pasan la mayor parte de su tiempo esperándose unos a otros.

En Linux 2.6, los recursos del núcleo se dividían en unidades mucho más pequeñas, protegidas por bloqueos individuales, y el código del núcleo se revisaba para asegurarse de que los bloqueos solo se mantenían mientras los recursos correspondientes estaban en uso. Así que ahora los diferentes procesadores solo tienen que esperar entre sí si quieren acceder al mismo recurso (por ejemplo, el recurso de hardware).

 5
Author: Ben,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-12 15:54:31

La preferencia permite que el núcleo dé la IMPRESIÓN de paralelismo: solo tiene un procesador (digamos hace una década), pero siente que todos sus procesos se ejecutan simultáneamente. Esto se debe a que el núcleo se adelanta (es decir, elimina la ejecución de) la ejecución de un proceso para darle al siguiente (tal vez de acuerdo con su prioridad).

EDITAR Kernels no preventivos esperar a que los procesos para devolver la mano (es decir, durante syscalls), por lo que si su process calcula una gran cantidad de datos y no llama a ningún tipo de función yield, los otros procesos no podrán ejecutar para ejecutar sus llamadas. Se dice que tales sistemas son cooperativos porque piden la cooperación de los procesos para garantizar la equidad del tiempo de ejecución

EDIT 2 El objetivo principal de preemption es mejorar la reactividad del sistema entre múltiples tareas, por lo que es bueno para los usuarios finales, mientras que, por otro lado, los servidores quieren lograr el más alto througput, por lo que no lo necesitan: (de la configuración del kernel de Linux)

 5
Author: Kevin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-12 16:14:46

Significa que el programador del sistema operativo es libre de suspender la ejecución de los procesos en ejecución para dar la CPU a otro proceso cuando lo desee; la forma normal de hacer esto es dar a cada proceso que está esperando la CPU un "quantum" de tiempo de CPU para ejecutarse. Después de que ha expirado el planificador toma de nuevo el control (y el proceso en ejecución no puede evitar esto) para dar otro quantum a otro proceso.

Este método a menudo se compara con la multitarea cooperativa, en los que los procesos mantienen la CPU todo el tiempo que necesitan, sin ser interrumpidos, y para permitir que otras aplicaciones se ejecuten tienen que llamar explícitamente a algún tipo de función de "rendimiento"; naturalmente, para evitar dar la sensación de que el sistema está atascado, las aplicaciones bien comportadas producirán la CPU a menudo. Aún así, si hay un error en una aplicación (por ejemplo, un bucle infinito sin llamadas de rendimiento), todo el sistema se colgará, ya que la CPU es completamente mantenida por el programa defectuoso.

Casi todo reciente los sistemas operativos de escritorio utilizan multitarea preventiva, que, incluso si es más caro en términos de recursos, es en general más estable (es más difícil para una aplicación defectuosa sigle colgar todo el sistema, ya que el sistema operativo siempre está en control). Por otro lado, cuando los recursos son escasos y se espera que la aplicación se comporte bien, se utiliza la multitarea cooperativa. Windows 3 fue un sistema operativo multitarea cooperativo; un ejemplo más reciente puede ser RockBox, un reemplazo de firmware PMP de código abierto.

 3
Author: Matteo Italia,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-12 16:05:50

El núcleo linux es monolítico y da un poco de tiempo de cómputo a todo el proceso en ejecución secuencialmente. Esto significa que los procesos (por ejemplo. los programas) no se ejecutan simultáneamente, pero se les da un intervalo de tiempo de entrega regularmente para ejecutar su lógica. El principal problema es que algunas lógicas pueden tardar más en terminar e impedir que el núcleo deje tiempo para el siguiente proceso. Esto da como resultado "lags" del sistema.

Un núcleo preemtivo tiene la capacidad de cambiar de contexto. Significa que puede detener un proceso "colgado" incluso si no está terminado, y dar el tiempo de computación al siguiente proceso como se espera. El proceso de" suspensión " continuará ejecutándose cuando llegue su momento sin ningún problema.

Prácticamente, significa que el núcleo tiene la capacidad de realizar tareas en tiempo real, lo que es particularmente interesante para la grabación y edición de audio.

El ubuntu studio districution empaqueta un núcleo preventivo, así como un paquete de calidad gratis software dedicado a la edición de audio y vídeo.

 2
Author: Damien,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-18 00:06:47

Creo que se convirtió en preventivo a partir de 2.6. preventivo significa que cuando un nuevo proceso está listo para ejecutarse, la cpu se asignará al nuevo proceso, no necesita que el proceso en ejecución sea cooperativo y renuncie a la cpu.

 0
Author: Amirali Sanatinia,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-12 15:53:40

El kernel de Linux es preventivo significa que el kernel soporta la prevención.

Por ejemplo, hay dos procesos P1(prioridad más alta) y P2(prioridad más baja) que están haciendo llamadas al sistema de lectura y se están ejecutando en modo kernel. Supongamos que P2 se está ejecutando y está en el modo kernel y P2 está programado para ejecutarse.

Si la preempción del kernel está disponible, entonces la preempción puede ocurrir a nivel del kernel, es decir, P2 puede ser preemptada y, sin embargo, dormir y el P1 puede continuar ejecutándose.

Si la preempción del kernel no está disponible, ya que P2 está en modo kernel, el sistema simplemente espera hasta que P2 esté completo y luego

 0
Author: BHS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-21 08:47:35