¿Cuál es la diferencia técnica entre un proceso y un hilo?
Tengo la sensación de que una palabra como 'proceso' se usa en exceso y también hay hilos de hardware y software. ¿Qué hay de los procesos ligeros en idiomas como Erlang ? ¿Hay una razón definitiva para usar un término sobre el otro?
multithreading
process
operating-system
James Fassett
fuente
fuente
Respuestas:
Tanto los procesos como los hilos son secuencias independientes de ejecución. La diferencia típica es que los subprocesos (del mismo proceso) se ejecutan en un espacio de memoria compartida, mientras que los procesos se ejecutan en espacios de memoria separados.
No estoy seguro de a qué hilos de "hardware" versus "software" se refiere. Los subprocesos son una característica del entorno operativo, en lugar de una característica de la CPU (aunque la CPU generalmente tiene operaciones que hacen que los subprocesos sean eficientes).
Erlang usa el término "proceso" porque no expone un modelo de multiprogramación de memoria compartida. Llamarlos "hilos" implicaría que han compartido memoria.
fuente
Proceso
Cada proceso proporciona los recursos necesarios para ejecutar un programa. Un proceso tiene un espacio de dirección virtual, código ejecutable, identificadores abiertos para los objetos del sistema, un contexto de seguridad, un identificador de proceso único, variables de entorno, una clase de prioridad, tamaños mínimos y máximos de conjuntos de trabajo y al menos un hilo de ejecución. Cada proceso se inicia con un solo hilo, a menudo llamado hilo primario, pero puede crear hilos adicionales a partir de cualquiera de sus hilos.
Subproceso
Un subproceso es una entidad dentro de un proceso que se puede programar para su ejecución. Todos los hilos de un proceso comparten su espacio de direcciones virtuales y recursos del sistema. Además, cada subproceso mantiene controladores de excepciones, una prioridad de programación, almacenamiento local de subprocesos, un identificador único de subprocesos y un conjunto de estructuras que el sistema usará para guardar el contexto del subproceso hasta que esté programado. El contexto del hilo incluye el conjunto de registros de máquina del hilo, la pila del núcleo, un bloque de entorno de hilo y una pila de usuario en el espacio de direcciones del proceso del hilo. Los subprocesos también pueden tener su propio contexto de seguridad, que puede usarse para hacerse pasar por clientes.
Esta información se encontró en Microsoft Docs aquí: Acerca de procesos y subprocesos
fuente
Proceso:
Hilo:
¡Tomé prestada la información anterior de Knowledge Quest! el blog .
fuente
Primero, veamos el aspecto teórico. Debe comprender qué es un proceso conceptualmente para comprender la diferencia entre un proceso y un hilo y lo que se comparte entre ellos.
Tenemos lo siguiente de la sección 2.2.2 El modelo de hilo clásico en los sistemas operativos modernos 3e de Tanenbaum:
Él continúa:
Más abajo proporciona la siguiente tabla:
Abordemos el problema del subproceso múltiple de hardware . Clásicamente, una CPU admitiría un solo subproceso de ejecución, manteniendo el estado del subproceso a través de un único contador de programa y un conjunto de registros. Pero, ¿qué sucede si hay una falta de caché? Lleva mucho tiempo recuperar datos de la memoria principal, y mientras eso sucede, la CPU está inactiva. Entonces, alguien tuvo la idea de tener básicamente dos conjuntos de estado de subproceso (PC + registros) para que otro subproceso (tal vez en el mismo proceso, tal vez en un proceso diferente) pueda realizar el trabajo mientras el otro subproceso está esperando en la memoria principal. Hay varios nombres e implementaciones de este concepto, como HyperThreading y Simith Multithreading (SMT para abreviar).
Ahora echemos un vistazo al lado del software. Básicamente, hay tres formas en que los hilos se pueden implementar en el lado del software.
Todo lo que necesita para implementar subprocesos es la capacidad de guardar el estado de la CPU y mantener múltiples pilas, lo que en muchos casos se puede hacer en el espacio del usuario. La ventaja de los subprocesos de espacio de usuario es el cambio súper rápido de subprocesos, ya que no tiene que quedar atrapado en el núcleo y la capacidad de programar sus subprocesos de la manera que desee. El mayor inconveniente es la incapacidad de bloquear el bloqueo de E / S (que bloquearía todo el proceso y todos sus hilos de usuario), que es una de las principales razones por las que usamos hilos en primer lugar. El bloqueo de E / S mediante subprocesos simplifica enormemente el diseño del programa en muchos casos.
Los hilos del kernel tienen la ventaja de poder usar E / S de bloqueo, además de dejar todos los problemas de programación al sistema operativo. Pero cada cambio de subproceso requiere captura en el núcleo, que es potencialmente relativamente lento. Sin embargo, si está cambiando subprocesos debido a E / S bloqueadas, esto no es realmente un problema ya que la operación de E / S probablemente ya lo haya atrapado en el núcleo de todos modos.
Otro enfoque es combinar los dos, con múltiples hilos del núcleo, cada uno con múltiples hilos de usuario.
Entonces, volviendo a su cuestión de terminología, puede ver que un proceso y un hilo de ejecución son dos conceptos diferentes y su elección de qué término usar depende de lo que esté hablando. Con respecto al término "proceso de peso ligero", personalmente no veo el punto, ya que realmente no transmite lo que está sucediendo, así como el término "hilo de ejecución".
fuente
Explicar más con respecto a la programación concurrente.
Un proceso tiene un entorno de ejecución autónomo. Un proceso generalmente tiene un conjunto privado completo de recursos básicos de tiempo de ejecución; en particular, cada proceso tiene su propio espacio de memoria.
Los hilos existen dentro de un proceso: cada proceso tiene al menos uno. Los subprocesos comparten los recursos del proceso, incluida la memoria y los archivos abiertos. Esto permite una comunicación eficiente, pero potencialmente problemática.
Teniendo en cuenta a la persona promedio,
En su computadora, abra Microsoft Word y el navegador web. Llamamos a estos dos procesos .
En Microsoft Word, escribe algo y se guarda automáticamente. Ahora, habría observado que la edición y el guardado ocurren en paralelo: edite en un hilo y guarde en el otro.
fuente
Robado de aquí .
fuente
Un proceso es una colección de código, memoria, datos y otros recursos. Un hilo es una secuencia de código que se ejecuta dentro del alcance del proceso. Puede (generalmente) tener múltiples subprocesos ejecutándose simultáneamente dentro del mismo proceso.
fuente
Ejemplo del mundo real para proceso y subproceso Esto le dará la idea básica sobre subproceso y proceso
Tomé prestada la información anterior de la respuesta de Scott Langham - gracias
fuente
Proceso:
Ejemplo:
Digamos, abriendo cualquier navegador (mozilla, Chrome, IE). En este punto comenzará a ejecutarse un nuevo proceso.
Hilos:
Ejemplo:
abrir varias pestañas en el navegador.
fuente
fuente
Tanto los subprocesos como los procesos son unidades atómicas de asignación de recursos del sistema operativo (es decir, hay un modelo de concurrencia que describe cómo se divide el tiempo de CPU entre ellos y el modelo de poseer otros recursos del sistema operativo). Hay una diferencia en:
Greg Hewgill arriba tenía razón sobre el significado de Erlang de la palabra "proceso", y aquí hay una discusión de por qué Erlang podría hacer procesos ligeros.
fuente
Tanto los procesos como los hilos son secuencias independientes de ejecución. La diferencia típica es que los subprocesos (del mismo proceso) se ejecutan en un espacio de memoria compartida, mientras que los procesos se ejecutan en espacios de memoria separados.
Proceso
Es un programa en ejecución. tiene una sección de texto, es decir, el código del programa, la actividad actual representada por el valor del contador del programa y el contenido del registro de los procesadores. También incluye la pila de procesos que contiene datos temporales (como parámetros de función, direcciones de retorno y variables locales) y una sección de datos que contiene variables globales. Un proceso también puede incluir un montón, que es la memoria que se asigna dinámicamente durante el tiempo de ejecución del proceso.
Hilo
Un hilo es una unidad básica de utilización de la CPU; comprende una ID de subproceso, un contador de programa, un conjunto de registros y una pila. compartió con otros hilos pertenecientes al mismo proceso su sección de código, sección de datos y otros recursos del sistema operativo, como archivos abiertos y señales.
- Tomado del sistema operativo por Galvin
fuente
http://lkml.iu.edu/hypermail/linux/kernel/9608/0191.html
fuente
Intentando responderlo desde la Vista del SO Linux Kernel
Un programa se convierte en un proceso cuando se inicia en la memoria. Un proceso tiene su propio espacio de direcciones, lo que significa que tiene varios segmentos en la memoria, como la
.text
segmentación para almacenar código compilado,.bss
para almacenar variables estáticas o globales no inicializadas, etc.Cada proceso tendría su propio contador de programa y pila de espacio de usuario .
Dentro del kernel, cada proceso tendría su propia pila de kernel (que está separada de la pila de espacio del usuario por cuestiones de seguridad) y una estructura denominada
task_struct
que generalmente se abstrae como el bloque de control del proceso, almacenando toda la información sobre el proceso, como su prioridad, estado , (y muchas otras partes).Un proceso puede tener múltiples hilos de ejecución.
Al llegar a los subprocesos, residen dentro de un proceso y comparten el espacio de direcciones del proceso principal junto con otros recursos que se pueden pasar durante la creación de subprocesos, como los recursos del sistema de archivos, el intercambio de señales pendientes, el intercambio de datos (variables e instrucciones), lo que hace que los subprocesos sean livianos y por lo tanto, permite un cambio de contexto más rápido.
Dentro del núcleo, cada subproceso tiene su propia pila de núcleo junto con la
task_struct
estructura que define el subproceso. Por lo tanto, el núcleo ve subprocesos del mismo proceso que entidades diferentes y son programables en sí mismos. Los subprocesos en el mismo proceso comparten una identificación común llamada id de grupo de subprocesos (tgid
), también tienen una identificación única llamada id de proceso (pid
).fuente
Intentando responder a esta pregunta relacionada con el mundo Java.
Un proceso es una ejecución de un programa, pero un subproceso es una secuencia de ejecución única dentro del proceso. Un proceso puede contener múltiples hilos. Un hilo a veces se llama un proceso ligero .
Por ejemplo:
Ejemplo 1: una JVM se ejecuta en un solo proceso y los subprocesos en una JVM comparten el montón que pertenece a ese proceso. Es por eso que varios hilos pueden acceder al mismo objeto. Los subprocesos comparten el montón y tienen su propio espacio de pila. Así es como la invocación de un hilo de un método y sus variables locales se mantienen a salvo de otros hilos. Pero el montón no es seguro para subprocesos y debe sincronizarse para la seguridad de subprocesos.
Ejemplo 2: un programa podría no ser capaz de dibujar imágenes al leer las teclas. El programa debe prestar toda su atención a la entrada del teclado y la falta de capacidad para manejar más de un evento a la vez generará problemas. La solución ideal para este problema es la ejecución perfecta de dos o más secciones de un programa al mismo tiempo. Los hilos nos permiten hacer esto. Aquí el dibujo es un proceso y la lectura de teclas es un subproceso (hilo).
fuente
¿Diferencia entre hilo y proceso?
Un proceso es una instancia de ejecución de una aplicación y un hilo es una ruta de ejecución dentro de un proceso. Además, un proceso puede contener varios subprocesos. Es importante tener en cuenta que un subproceso puede hacer cualquier cosa que un proceso pueda hacer. Pero dado que un proceso puede consistir en múltiples hilos, un hilo podría considerarse un proceso 'ligero'. Por lo tanto, la diferencia esencial entre un hilo y un proceso es el trabajo que cada uno está acostumbrado a realizar. Los subprocesos se usan para tareas pequeñas, mientras que los procesos se usan para tareas más 'pesadas', básicamente la ejecución de aplicaciones.
Otra diferencia entre un hilo y un proceso es que los hilos dentro del mismo proceso comparten el mismo espacio de direcciones, mientras que los diferentes procesos no lo hacen. Esto permite que los hilos lean y escriban en las mismas estructuras de datos y variables, y también facilita la comunicación entre hilos. La comunicación entre procesos, también conocida como IPC, o comunicación entre procesos, es bastante difícil y requiere muchos recursos.
Los subprocesos son más fáciles de crear que los procesos, ya que no requieren un espacio de direcciones separado.
El subprocesamiento múltiple requiere una programación cuidadosa ya que los subprocesos comparten estructuras de datos que solo deben modificarse por un subproceso a la vez. A diferencia de los hilos, los procesos no comparten el mismo espacio de direcciones.
Los subprocesos se consideran livianos porque usan muchos menos recursos que los procesos.
Los procesos son independientes entre sí. Los subprocesos, dado que comparten el mismo espacio de direcciones, son interdependientes, por lo que se debe tener precaución para que los diferentes subprocesos no se crucen entre sí.
Esta es realmente otra forma de declarar # 2 arriba.
Un proceso puede consistir en múltiples hilos.
fuente
Lo siguiente es lo que obtuve de uno de los artículos sobre The Code Project . Supongo que explica todo lo que se necesita claramente.
fuente
Proceso:
El proceso es básicamente un programa en ejecución. Es una entidad activa. Algunos sistemas operativos usan el término 'tarea' para referirse a un programa que se está ejecutando. Un proceso siempre se almacena en la memoria principal, también denominada memoria primaria o memoria de acceso aleatorio. Por lo tanto, un proceso se denomina entidad activa. Desaparece si la máquina se reinicia. Varios procesos pueden estar asociados con un mismo programa. En un sistema multiprocesador, se pueden ejecutar múltiples procesos en paralelo. En un sistema uni-procesador, aunque no se logra un verdadero paralelismo, se aplica un algoritmo de programación de procesos y el procesador está programado para ejecutar cada proceso de uno en uno produciendo una ilusión de concurrencia. Ejemplo: Ejecutar múltiples instancias del programa 'Calculadora'. Cada una de las instancias se denomina proceso.
Hilo:
Un hilo es un subconjunto del proceso. Se denomina como un "proceso ligero", ya que es similar a un proceso real pero se ejecuta dentro del contexto de un proceso y comparte los mismos recursos asignados al proceso por el núcleo. Por lo general, un proceso solo tiene un hilo de control: un conjunto de instrucciones de máquina ejecutándose a la vez. Un proceso también puede estar compuesto por múltiples hilos de ejecución que ejecutan instrucciones simultáneamente. Múltiples hilos de control pueden explotar el verdadero paralelismo posible en sistemas multiprocesador. En un sistema uni-procesador, se aplica un algoritmo de programación de subprocesos y el procesador está programado para ejecutar cada subproceso uno a la vez. Todos los hilos que se ejecutan dentro de un proceso comparten el mismo espacio de direcciones, descriptores de archivo, pila y otros atributos relacionados con el proceso. Como los hilos de un proceso comparten la misma memoria,
ref- https://practice.geeksforgeeks.org/problems/difference-between-process-and-thread
fuente
Desde el punto de vista de un entrevistador, básicamente hay solo 3 cosas principales que quiero escuchar, además de cosas obvias como un proceso puede tener múltiples hilos:
Si quieres más, la respuesta de Scott Langham cubre casi todo. Todos estos son desde la perspectiva de un sistema operativo. Diferentes lenguajes pueden implementar diferentes conceptos, como tareas, subprocesos ligeros, etc., pero son solo formas de usar subprocesos (de fibras en Windows). No hay hilos de hardware y software. Hay excepciones e interrupciones de hardware y software , o hilos de kernel y modo usuario .
fuente
fuente
Para aquellos que se sienten más cómodos aprendiendo visualizando, aquí hay un práctico diagrama que creé para explicar Procesos e Hilos.
Usé la información de MSDN - Acerca de procesos y subprocesos
fuente
Viniendo del mundo integrado, me gustaría agregar que el concepto de procesos solo existe en procesadores "grandes" ( CPU de escritorio, ARM Cortex A-9 ) que tienen MMU (unidad de administración de memoria) y sistemas operativos que admiten el uso de MMU ( como Linux ). Con procesadores y microcontroladores pequeños / antiguos y un sistema operativo RTOS pequeño (sistema operativo en tiempo real ), como freeRTOS, no hay soporte MMU y, por lo tanto, no hay procesos, sino solo subprocesos.
Los subprocesos pueden acceder a la memoria de los demás, y el sistema operativo los programa de manera intercalada para que parezcan ejecutarse en paralelo (o con varios núcleos, realmente se ejecutan en paralelo).
Los procesos , por otro lado, viven en su caja de arena privada de memoria virtual, proporcionada y protegida por MMU. Esto es útil porque permite:
fuente
fuente
Proceso : el programa en ejecución se conoce como proceso
Thread : Thread es una funcionalidad que se ejecuta con la otra parte del programa basada en el concepto de "uno con otro", por lo que el thread es parte del proceso.
fuente
He leído casi todas las respuestas allí, por desgracia, como estudiante de pregrado que toma un curso de SO actualmente no puedo comprender a fondo los dos conceptos. Me refiero a que la mayoría de los chicos leen de algunos libros de SO las diferencias, es decir, los hilos pueden acceder a variables globales en la unidad de transacción, ya que utilizan el espacio de direcciones de su proceso. Sin embargo, surge la nueva pregunta de por qué hay procesos, ya que sabemos que los subprocesos son más livianos frente a los procesos. Echemos un vistazo al siguiente ejemplo haciendo uso de la imagen extraída de una de las respuestas anteriores ,
Tenemos 3 hilos trabajando a la vez en un documento de Word, por ejemplo, Libre Office . El primero hace la corrección ortográfica subrayando si la palabra está mal escrita. La segunda toma e imprime letras desde el teclado. Y el último guarda el documento cada poco tiempo para no perder el documento trabajado si algo sale mal. En este caso, los 3 hilos no pueden ser 3 procesos ya que comparten una memoria común que es el espacio de direcciones de su proceso y, por lo tanto, todos tienen acceso al documento que se está editando. Entonces, el camino es el documento de Word junto con dos excavadoras que son los hilos, aunque una de ellas es la falta de imagen.
fuente
Mientras construía un algoritmo en Python (lenguaje interpretado) que incorporaba múltiples subprocesos, me sorprendió ver que el tiempo de ejecución no era mejor en comparación con el algoritmo secuencial que había construido anteriormente. En un esfuerzo por comprender la razón de este resultado, leí un poco y creo que lo que aprendí ofrece un contexto interesante desde el cual comprender mejor las diferencias entre multiprocesamiento y multiprocesos.
Los sistemas multinúcleo pueden ejercer múltiples subprocesos de ejecución, por lo que Python debería admitir subprocesos múltiples. Pero Python no es un lenguaje compilado y, en cambio, es un lenguaje interpretado 1 . Esto significa que el programa debe interpretarse para ejecutarse, y el intérprete no tiene conocimiento del programa antes de que comience la ejecución. Sin embargo, lo que sí sabe son las reglas de Python y luego las aplica dinámicamente. Las optimizaciones en Python deben ser principalmente optimizaciones del propio intérprete y no el código que se debe ejecutar. Esto contrasta con los lenguajes compilados, como C ++, y tiene consecuencias para los subprocesos múltiples en Python. Específicamente, Python usa el Bloqueo global de intérpretes para administrar subprocesos múltiples.
Por otro lado, un lenguaje compilado es, bueno, compilado. El programa se procesa "completamente", donde primero se interpreta de acuerdo con sus definiciones sintácticas, luego se asigna a una representación intermedia independiente del lenguaje y finalmente se vincula a un código ejecutable. Este proceso permite que el código sea altamente optimizado porque está disponible en el momento de la compilación. Las diversas interacciones y relaciones del programa se definen en el momento en que se crea el ejecutable y se pueden tomar decisiones sólidas sobre la optimización.
En entornos modernos, el intérprete de Python debe permitir múltiples subprocesos, y esto debe ser seguro y eficiente. Aquí es donde entra en juego la diferencia entre ser un lenguaje interpretado y un lenguaje compilado. El intérprete no debe alterar los datos compartidos internamente de diferentes subprocesos, al mismo tiempo que optimiza el uso de procesadores para los cálculos.
Como se ha señalado en las publicaciones anteriores, tanto un proceso como un subproceso son ejecuciones secuenciales independientes, con la diferencia principal de que la memoria se comparte entre múltiples subprocesos de un proceso, mientras que los procesos aíslan sus espacios de memoria.
En Python, los datos están protegidos del acceso simultáneo por diferentes hilos por el Global Interpreter Lock. Requiere que en cualquier programa de Python solo se pueda ejecutar un hilo en cualquier momento. Por otro lado, es posible ejecutar múltiples procesos ya que la memoria para cada proceso está aislada de cualquier otro proceso, y los procesos pueden ejecutarse en múltiples núcleos.
1 Donald Knuth tiene una buena explicación de las rutinas interpretativas en El arte de la programación de computadoras: Algoritmos fundamentales.
fuente
Los subprocesos dentro del mismo proceso comparten la memoria, pero cada subproceso tiene su propia pila y registros, y los subprocesos almacenan datos específicos del subproceso en el montón. Los subprocesos nunca se ejecutan de forma independiente, por lo que la comunicación entre subprocesos es mucho más rápida en comparación con la comunicación entre procesos.
Los procesos nunca comparten la misma memoria. Cuando un proceso hijo crea, duplica la ubicación de la memoria del proceso padre. La comunicación del proceso se realiza mediante el uso de canalización, memoria compartida y análisis de mensajes. El cambio de contexto entre hilos es muy lento.
fuente
La mejor respuesta que he encontrado hasta ahora es 'La interfaz de programación de Linux' de Michael Kerrisk :
Este libro es una fuente de gran claridad; Julia Evans mencionó su ayuda para aclarar cómo funcionan realmente los grupos de Linux en este artículo .
fuente
Ejemplo 1: una JVM se ejecuta en un solo proceso y los subprocesos en una JVM comparten el montón que pertenece a ese proceso. Es por eso que varios hilos pueden acceder al mismo objeto. Los subprocesos comparten el montón y tienen su propio espacio de pila. Así es como la invocación de un hilo de un método y sus variables locales se mantienen a salvo de otros hilos. Pero el montón no es seguro para subprocesos y debe sincronizarse para la seguridad de subprocesos.
fuente
Son casi iguales ... Pero la diferencia clave es que un hilo es liviano y un proceso es pesado en términos de cambio de contexto, carga de trabajo, etc.
fuente