subproceso procesos hilos entre definicion cuadro comparativo multithreading concurrency operating-system

multithreading - definicion - cuadro comparativo entre hilos y procesos



Subprocesos: ¿Por qué se deben asignar todos los subprocesos de usuario a un subproceso de núcleo? (2)

Así que dos preguntas aquí realmente. Primero, (y sí, ya he buscado esto, pero quería una aclaración), ¿cuál es la diferencia entre un hilo de usuario y un hilo de núcleo? ¿Es simplemente que uno es generado por un programa de usuario y el otro por un sistema operativo, y este último tiene acceso a instrucciones privilegiadas? ¿Son conceptualmente iguales o existen diferencias reales en los hilos?

Segundo, y el problema real de mi pregunta es: el libro que estoy usando dice que "debe existir una relación entre los hilos de usuario y los hilos del kernel", y enumerar los diferentes modelos de dicha relación. Pero el libro no explica claramente por qué un hilo de usuario siempre debe asignarse a un hilo específico del núcleo. ¿Por qué es esto?


Creo que un ejemplo del mundo real despejará la confusión, así que veamos cómo se hacen las cosas en Linux.

En primer lugar, Linux no distingue entre proceso y subproceso, la entidad que puede programarse se llama tarea en Linux y está representada por task_struct. Por lo tanto, cada vez que ejecuta una llamada al sistema fork (), se crea una nueva task_struct que contiene datos (o punteros) asociados con una nueva tarea.

Entonces, en el mundo de Linux, un hilo del núcleo significa un objeto task_struct (estructura). Porque el programador solo conoce estas entidades que pueden asignarse a diferentes CPU (lógicas o físicas). En otras palabras, si desea que el programador de Linux programe su proceso, debe crear una task_struct.

El hilo de usuario es algo que es soportado y administrado fuera del kernel por algún entorno de ejecución (EE a partir de ahora) como JVM. Estos EE le proporcionarán algunas funciones para crear nuevos subprocesos.

Ahora respondamos tu pregunta

why a user thread must always be mapped to a specific kernel thread.

Digamos que creaste algunos hilos usando tu EE. finalmente, deben ser ejecutados por la CPU y, según la explicación anterior, sabemos que usted (subproceso) debe tener una task_struct para ser asignado a alguna CPU. Es por eso que el mapeo debe existir. Es deber de tu EE crear task_structs.

Si su EE usa muchos a un modelo, creará solo una tarea_estructura para todos los subprocesos y programará todos estos subprocesos en esa tarea_estructura. Piense que hay una CPU (task_struct) y muchos procesos (subprocesos creados en EE), su sistema operativo (la EE) multiplexará estos procesos en esa única CPU.

Si usa uno a uno, el modelo será task_struct para cada hilo creado en EE. Entonces, cuando creas un nuevo hilo en tu EE, la tarea correspondiente se creará en el kernel.

Windows hace las cosas de manera diferente (el proceso y el subproceso son diferentes), pero la idea general sigue siendo la misma que el subproceso del kernel es la entidad que el programador de CPU considera para la asignación, por lo que los subprocesos del usuario deben asignarse a los subprocesos del kernel correspondientes (si desea que la CPU los ejecute).


Un hilo del núcleo es un objeto de hilo mantenido por el sistema operativo. Es un subproceso real que puede ser programado y ejecutado por el procesador. Normalmente, los subprocesos del sistema son objetos pesados ​​con configuración de permisos, prioridades, etc. El programador de subprocesos del núcleo está a cargo de la programación de subprocesos del núcleo.

Los programas de usuario también pueden hacer sus propios programadores de hilos. Pueden hacer sus propios "hilos" y simular cambios de contexto para cambiar entre ellos. Sin embargo, estos hilos no son hilos del núcleo. Cada subproceso de usuario no puede ejecutarse por sí solo, y la única manera de ejecutar un subproceso de usuario es si se le indica a un subproceso de núcleo que ejecute el código contenido en un subproceso de usuario. Dicho esto, los subprocesos de usuario tienen grandes ventajas sobre los subprocesos del kernel. Pueden ser mucho más ligeros, ya que no necesariamente tienen que tener sus propias prioridades, pueden administrarse mediante un solo proceso (que podría tener mejor información sobre qué subprocesos deben ejecutarse cuándo) y no crean muchos Objetos del núcleo para fines de seguridad y bloqueo.

La razón por la que los subprocesos de los usuarios tienen que estar asociados con los subprocesos del kernel es que, por sí misma, un subproceso de usuario es solo un conjunto de datos en un programa de usuario. Los hilos del kernel son los hilos reales del sistema, por lo que para que un hilo de usuario avance, el programa del usuario debe hacer que su programador tome un hilo de usuario y luego lo ejecute en un hilo del kernel. La asignación entre los subprocesos de usuario y los subprocesos del kernel no tiene que ser uno a uno (1: 1); puede hacer que varios subprocesos de usuario compartan el mismo subproceso del kernel (solo se ejecuta uno de esos subprocesos a la vez), y puede tener un solo subproceso de usuario que se gira a través de diferentes subprocesos del kernel en una asignación 1: n.