todas - ultima version de linux 2018
¿Qué es un núcleo reentrante? (4)
El kernel es la parte central de un sistema operativo que interactúa directamente con el hardware y schedules procesos para ejecutarse.
Los procesos llaman a las funciones del kernel para realizar tareas como acceder al hardware o iniciar nuevos procesos. Por ciertos períodos de tiempo, por lo tanto, un proceso ejecutará el código del kernel. Un kernel se llama reentrante si más de un proceso puede ejecutar el código del kernel al mismo tiempo. "Al mismo tiempo" puede significar que dos procesos en realidad están ejecutando el código del kernel simultáneamente (en un sistema multiprocesador) o que un proceso se ha interrumpido mientras se está ejecutando el código del kernel (porque está esperando que el hardware responda, por ejemplo) y que otro proceso que ha sido programado para ejecutarse también ha llamado al kernel.
Un kernel reentrante proporciona un mejor rendimiento porque no hay contention para el kernel. Un kernel que no es reentrante necesita usar un lock para asegurarse de que no haya dos procesos ejecutando el código del kernel al mismo tiempo.
¿Qué es un kernel reentrante?
Respuesta mucho más simple:
Reingreso del Kernel
Si el kernel no es reingresante, un proceso solo puede suspenderse mientras está en modo usuario. Aunque podría suspenderse en modo kernel, aún bloquearía la ejecución en modo kernel en todos los demás procesos. La razón de esto es que todos los hilos del núcleo comparten la misma memoria. Si la ejecución saltara entre ellos arbitrariamente, podría ocurrir corrupción.
Un kernel de reingreso permite que los procesos (o, para ser más precisos, sus hilos de kernel correspondientes) regalan la CPU mientras está en modo kernel. No impiden que otros procesos entren también en el modo kernel. Un caso de uso típico es IO espera. El proceso quiere leer un archivo. Se llama a una función del núcleo para esto. Dentro de la función del kernel, al controlador de disco se le piden los datos. Obtener los datos llevará algún tiempo y la función se bloquea durante ese tiempo. Con un kernel reingresante, el programador asignará la CPU a otro proceso (subproceso del kernel) hasta que una interrupción del controlador del disco indique que los datos están disponibles y que se puede reanudar nuestro hilo. Este proceso aún puede acceder a IO (que necesita funciones del kernel), como la entrada del usuario. El sistema sigue respondiendo y se reduce el tiempo de CPU debido a la espera de IO.
Esto es bastante estándar para los sistemas operativos de escritorio de hoy.
Previo al Kernel
La prevención de kernel no ayuda en el rendimiento general del sistema. En su lugar, busca una mejor capacidad de respuesta.
La idea aquí es que normalmente las funciones del kernel solo están interrumpidas por causas de hardware: ya sea interrupciones externas, o casos de espera IO, donde voluntariamente cede el control al programador. Un kernel preventivo en su lugar también interrumpe y suspende las funciones del kernel tal como interrumpiría los procesos en modo usuario. El sistema es más sensible, ya que los procesos, por ejemplo, el manejo de la entrada del mouse, se activan incluso cuando se realiza un trabajo pesado dentro del kernel.
La prioridad en el nivel del kernel dificulta las cosas para el desarrollador del kernel: la función del kernel no se puede suspender solo de forma voluntaria o mediante controladores de interrupciones (que son en cierto modo un entorno controlado), sino también por cualquier otro proceso debido al programador. Se debe tener cuidado para, por ejemplo, evitar puntos muertos: un hilo bloquea el recurso A, pero la necesidad del recurso B se ve interrumpida por otro hilo que bloquea el recurso B, pero luego necesita el recurso A.
Toma mi explicación de la prevención con un grano de sal. Estoy feliz por cualquier corrección.
Una función reentrante es aquella que puede ser utilizada por más de una tarea simultáneamente sin temor a la corrupción de datos. A la inversa, una función no reentrante no puede ser compartida por más de una tarea a menos que se asegure la exclusión mutua de la función mediante el uso de un semáforo o la desactivación de interrupciones durante las secciones críticas del código. Una función de reentrada puede interrumpirse en cualquier momento y reanudarse en un momento posterior sin pérdida de datos. Las funciones de reentrada usan variables locales o protegen sus datos cuando se usan variables globales.
Una función reentrante:
Does not hold static data over successive calls
Does not return a pointer to static data; all data is provided by the caller of the function
Uses local data or ensures protection of global data by making a local copy of it
Must not call any non-reentrant functions
Todos los kernels de Unix son reentrantes. Esto significa que varios procesos pueden ejecutarse en modo Kernel al mismo tiempo. Por supuesto, en los sistemas con un solo procesador, solo un proceso puede progresar, pero muchos pueden bloquearse en el modo Kernel cuando se espera la CPU o la finalización de algunas operaciones de E / S. Por ejemplo, después de emitir una lectura a un disco en nombre de un proceso, el kernel permite que el controlador del disco lo maneje y reanuda la ejecución de otros procesos. Una interrupción notifica al kernel cuando el dispositivo ha satisfecho la lectura, por lo que el proceso anterior puede reanudar la ejecución.
Una forma de proporcionar reentrada es escribir funciones para que solo modifiquen las variables locales y no alteren las estructuras de datos globales. Tales funciones son llamadas funciones reentrantes. Pero un kernel reentrante no está limitado solo a tales funciones reentrantes (aunque así es como se implementan algunos kernels en tiempo real). En su lugar, el kernel puede incluir funciones no reentrantes y utilizar mecanismos de bloqueo para garantizar que solo un proceso pueda ejecutar una función no reentrante a la vez.
Si se produce una interrupción de hardware, un kernel reentrante puede suspender el proceso actual en ejecución incluso si ese proceso está en modo Kernel. Esta capacidad es muy importante, ya que mejora el rendimiento de los controladores de dispositivos que generan interrupciones. Una vez que un dispositivo ha emitido una interrupción, espera hasta que la CPU lo confirma. Si el kernel puede responder rápidamente, el controlador del dispositivo podrá realizar otras tareas mientras la CPU maneja la interrupción.
Ahora veamos la reentrada del kernel y su impacto en la organización del kernel. Una ruta de control del kernel denota la secuencia de instrucciones ejecutadas por el kernel para manejar una llamada al sistema, una excepción o una interrupción.
En el caso más simple, la CPU ejecuta una ruta de control de kernel secuencialmente desde la primera instrucción hasta la última. Sin embargo, cuando ocurre uno de los siguientes eventos, la CPU intercala las rutas de control del kernel:
Un proceso que se ejecuta en Modo usuario invoca una llamada del sistema, y la ruta de control del kernel correspondiente verifica que la solicitud no se pueda satisfacer de inmediato; luego invoca al programador para seleccionar un nuevo proceso para ejecutar. Como resultado, se produce un cambio de proceso. La primera ruta de control del kernel queda sin terminar, y la CPU reanuda la ejecución de alguna otra ruta de control del kernel. En este caso, las dos rutas de control se ejecutan en nombre de dos procesos diferentes.
La CPU detecta una excepción, por ejemplo, el acceso a una página que no está presente en la RAM, mientras se ejecuta una ruta de control de kernel. La primera ruta de control se suspende y la CPU inicia la ejecución de un procedimiento adecuado. En nuestro ejemplo, este tipo de procedimiento puede asignar una nueva página para el proceso y leer su contenido del disco. Cuando finaliza el procedimiento, se puede reanudar la primera ruta de control. En este caso, las dos rutas de control se ejecutan en nombre del mismo proceso.
Se produce una interrupción de hardware mientras la CPU está ejecutando una ruta de control del kernel con las interrupciones habilitadas. La primera ruta de control del kernel queda sin terminar, y la CPU comienza a procesar otra ruta de control del kernel para manejar la interrupción. La primera ruta de control del kernel se reanuda cuando el manejador de interrupciones termina. En este caso, las dos rutas de control del kernel se ejecutan en el contexto de ejecución del mismo proceso, y se le atribuye el tiempo total de CPU del sistema. Sin embargo, el controlador de interrupciones no necesariamente opera en nombre del proceso.
Se produce una interrupción mientras la CPU se está ejecutando con la preferencia de kernel habilitada, y se puede ejecutar un proceso de mayor prioridad. En este caso, la primera ruta de control del kernel se deja sin terminar, y la CPU reanuda la ejecución de otra ruta de control del kernel en nombre del proceso de mayor prioridad. Esto ocurre solo si el kernel ha sido compilado con soporte de preferencia de kernel.
Esta información está disponible en http://jno.glas.net/data/prog_books/lin_kern_2.6/0596005652/understandlk-CHP-1-SECT-6.html
Más sobre http://linux.omnipotent.net/article.php?article_id=12496&page=-1