Aquí está la analogía que uso en Linux Kernel Development. Los procesos son la abstracción de los programas en ejecución : una imagen binaria, memoria virtualizada, varios recursos del núcleo, un contexto de seguridad asociado, etc. Los subprocesos son la unidad de ejecución en un proceso : un procesador virtualizado, una pila y el estado del programa. Dicho de otra manera, los procesos ejecutan binarios y los subprocesos son la unidad de ejecución más pequeña programable por el programador de procesos de un sistema operativo.
Un proceso contiene uno o más hilos. En procesos de subproceso único, el proceso contiene un subproceso. Puede decir que el hilo es el proceso: hay una cosa que está sucediendo. En los procesos de subprocesos múltiples, el proceso contiene más de un subproceso; hay más de una cosa en curso.
Las dos abstracciones virtualizadas principales en los sistemas operativos modernos son la memoria virtualizada y un procesador virtualizado. Ambos brindan la ilusión de ejecutar procesos que solo ellos consumen los recursos de la máquina. La memoria virtualizada brinda a los procesos una vista única de la memoria que se asigna perfectamente a la RAM física o al almacenamiento en disco (espacio de intercambio). Un procesador virtualizado permite que los procesos actúen como si solo se ejecutaran en un procesador, cuando de hecho múltiples procesos son multitarea en múltiples procesadores.
- ¿Cómo puedo escribir un script de shell para recuperar texto que se encuentra entre dos cadenas?
- ¿Por qué se le da tanta importancia al aprendizaje automático?
- ¿Es este un mundo informático?
- ¿Cómo manipulan las computadoras la aleatoriedad?
- ¿Cómo usan las empresas las máquinas virtuales?
La memoria virtualizada está asociada con el proceso y no con el hilo. Por lo tanto, los hilos comparten un espacio de direcciones de memoria. Por el contrario, un procesador virtualizado distinto está asociado con cada subproceso. Cada hilo es una entidad programable independiente.
¿Cuál es el punto de? Obviamente necesitamos procesos. Pero, ¿por qué introducir el concepto separado de un hilo y permitir procesos multiproceso? Hay cuatro beneficios principales para el subprocesamiento múltiple:
- Programación de abstracción . Dividir el trabajo y asignar cada división a una unidad de ejecución (un hilo) es un enfoque natural para muchos problemas. Los patrones de programación que utilizan este enfoque incluyen los patrones de reactor , hilo por conexión y grupo de hilos . Sin embargo, algunos ven los hilos como un antipatrón. El inimitable Alan Cox resumió esto bien con la cita, “los hilos son para personas que no pueden programar máquinas de estado”.
- Paralelismo En máquinas con múltiples procesadores, los hilos proporcionan una manera eficiente de lograr un verdadero paralelismo . Como cada subproceso recibe su propio procesador virtualizado y es una entidad programable de forma independiente, pueden ejecutarse múltiples subprocesos en múltiples procesadores al mismo tiempo, mejorando el rendimiento de un sistema. En la medida en que los subprocesos se utilizan para lograr paralelismo, es decir, no hay más subprocesos que procesadores, no se aplica la cita “subprocesos para personas que no pueden programar máquinas de estado”.
- Bloqueo de E / S. Sin hilos, el bloqueo de E / S detiene todo el proceso. Esto puede ser perjudicial tanto para el rendimiento como para la latencia. En un proceso multiproceso, los subprocesos individuales pueden bloquearse, esperando E / S, mientras que otros subprocesos avanzan. Las E / S asincrónicas y sin bloqueo son soluciones alternativas a los subprocesos para este problema.
- Ahorro de memoria . Los subprocesos proporcionan una forma eficiente de compartir memoria y, al mismo tiempo, utilizan múltiples unidades de ejecución. De esta manera son una alternativa a múltiples procesos.
El costo de estos beneficios del enhebrado es una mayor complejidad en la forma de necesitar gestionar la concurrencia a través de mecanismos tales como mutexes y variables de condición. Dada la creciente tendencia hacia los procesadores con múltiples núcleos y sistemas con múltiples procesadores, el enhebrado solo se convertirá en una herramienta más importante en la programación de sistemas.