¿Cuál es la diferencia entre los hilos de nivel de usuario y los hilos de nivel de kernel?

33

Después de leer varias fuentes, todavía estoy confundido acerca de los hilos de nivel de usuario y kernel.

En particular:

Los hilos pueden existir tanto a nivel de usuario como a nivel de núcleo

¿Cuál es la diferencia entre el nivel de usuario y el nivel de kernel?

Sheldon
fuente
1
¿Es esto realmente Comp Sci (teoría) o solo programación?
Mehrdad
66
@Mehrdad, los sistemas operativos son parte de la informática.
Kaveh

Respuestas:

28

Una de las funciones de un núcleo del sistema operativo multitarea es la programación : determinar qué subproceso de ejecución ejecutar cuando. Entonces, ese núcleo tiene alguna noción de hilo o proceso . Un subproceso es una pieza secuencial de código que se está ejecutando y tiene su propia pila y, a veces, otros datos. En el contexto de un sistema operativo, las personas generalmente usan proceso para referirse a un hilo que tiene su propio espacio de memoria, e hilo para referirse a un hilo que comparte su espacio de memoria con otros hilos. Un proceso puede tener uno o más hilos.

Algunos sistemas operativos, por ejemplo, sistemas Unix más antiguos, solo proporcionan procesos: cada subproceso que gestiona el núcleo tiene su propio espacio de memoria. Otros sistemas operativos, por ejemplo, los sistemas Unix más modernos, permiten que los procesos contengan múltiples hilos de ejecución: proporcionan una noción de hilos a nivel de núcleo.

También es posible que un proceso gestione sus propios subprocesos. En el multihilo cooperativo , el código de cada subproceso contiene instrucciones para cambiar a otro subproceso. En el subprocesamiento múltiple preventivo , el proceso solicita notificaciones asincrónicas periódicas del núcleo y reacciona a estas notificaciones cambiando a un subproceso diferente. De esta forma, el subprocesamiento múltiple se implementa sin la cooperación del núcleo, a nivel de usuario, en una biblioteca.

Un sistema puede ofrecer hilos tanto a nivel de kernel como a nivel de usuario; Esto se conoce como roscado híbrido .

Los subprocesos a nivel de usuario y kernel tienen sus ventajas y desventajas. El cambio entre subprocesos a nivel de usuario a menudo es más rápido, ya que no requiere restablecer las protecciones de memoria para cambiar al programador en el núcleo y nuevamente para volver al proceso. Esto es importante principalmente para sistemas masivamente concurrentes que usan una gran cantidad de hilos de muy corta duración, como algunos lenguajes de alto nivel ( Erlang en particular) y sus hilos verdes . Los subprocesos a nivel de usuario requieren menos compatibilidad con el núcleo, lo que puede simplificar el núcleo. Los subprocesos a nivel de kernel permiten que un subproceso se ejecute mientras otro subproceso en el mismo proceso se bloquea en una llamada al sistema; los procesos con subprocesos a nivel de usuario deben tener cuidado de no realizar llamadas al sistema de bloqueo, ya que bloquean todos los subprocesos del proceso. Los subprocesos a nivel de kernel pueden ejecutarse simultáneamente en máquinas multiprocesador, que los subprocesos puramente a nivel de usuario no pueden lograr.

Gilles 'SO- deja de ser malvado'
fuente
Su última línea dice "Los subprocesos a nivel de kernel pueden ejecutarse simultáneamente en máquinas multiprocesador, que los subprocesos puramente a nivel de usuario no pueden lograr". Pero, según el enlace dado, ULT puede ejecutarse simultáneamente stackoverflow.com/questions/14791801/… . ¿Me estoy equivocando?
Garrick
¿Pueden consultar mi comentario anterior?
Garrick el
1
@Garrick Varios subprocesos de nivel de usuario pueden ejecutarse en diferentes núcleos al mismo tiempo, siempre que se ejecuten dentro de diferentes subprocesos de nivel de núcleo. Si solo tiene ULT como herramienta, está limitado a un solo procesador. Si KLT está disponible, puede distribuir los hilos del kernel en múltiples procesadores y enviar su ULT entre los hilos del kernel disponibles.
Gilles 'SO- deja de ser malvado'
4

Piense en los subprocesos a nivel de kernel como " procesadores virtuales " y en los subprocesos a nivel de usuario como simples subprocesos (llamémoslos así por ahora). Ahora, para que un subproceso se ejecute, se ha asignado a un procesador, ¿verdad? Por lo tanto, cada subproceso se asigna a un procesador virtual para que pueda ejecutarse.

Aquí hay hechos

  • Crear un nuevo procesador virtual es un poco costoso. (El núcleo tiene que crear una entrada en el Bloque de control de subprocesos , asignar la pila, etc.)

  • Crear un hilo es bastante simple en comparación con crear un nuevo procesador virtual. Un desarrollador de aplicaciones puede crear subprocesos utilizando las bibliotecas de subprocesos proporcionadas por los lenguajes de programación y se administran en el espacio de usuario . Y diferentes idiomas implementan múltiples subprocesos de diferentes maneras.

Modelos

  • Si los subprocesos se asignan a un único procesador virtual, se debe tener cuidado de no hacer una llamada al sistema de bloqueo en ninguno de los subprocesos, ya que otros subprocesos ya no pueden ejecutarse simultáneamente.

  • Esta limitación se puede superar si se pueden crear algunos procesadores virtuales más. Ahora, los subprocesos pueden ejecutarse simultáneamente (en paralelo si hay varios procesadores reales). Un subproceso no afectará a otros subprocesos que se asignan en otros procesadores virtuales.

  • En el último modelo, uno o varios subprocesos pueden asignarse a procesadores virtuales.

  • Los modelos anteriores se denominan Many to One, One to One y Many to Many respectivamente.

Referenes: conceptos de sistema operativo por Galvin et al. Tema: Subprocesos -> Modelos de subprocesos múltiples

azam
fuente