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.