¿Cuál es la diferencia entre un proceso y un hilo?

1642

¿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?

James Fassett
fuente
44
Probablemente justifica decir que cada sistema operativo tiene una idea diferente de lo que es un 'hilo' o 'proceso'. Algunos sistemas operativos convencionales 'no tienen un concepto de' hilo ', también hay algunos sistemas operativos integrados' que solo tienen 'hilos'.
Neil

Respuestas:

1459

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.

Greg Hewgill
fuente
56
Los subprocesos de hardware probablemente se refieren a contextos de subprocesos múltiples dentro de un núcleo (por ejemplo, HyperThreading, SMT, Sun's Niagara / Rock). Esto significa archivos de registro duplicados, bits adicionales transportados con la instrucción a través de las tuberías y una lógica de desvío / reenvío más compleja, entre otras cosas.
Matt J
44
@greg, una duda que tengo en los hilos. déjame considerar que tengo un proceso A, que tiene algo de espacio en la RAM. Si el proceso A crea un hilo, el hilo también necesita algo de espacio para ejecutarse. Entonces, ¿aumentará el tamaño del espacio creado para el proceso A, o el espacio para el hilo creado en otro lugar? Entonces, ¿qué es lo que crea ese proceso de espacio virtual? Corríjame si mi pregunta es incorrecta. Gracias
duslabo
99
@JeshwanthKumarNK: la creación de un nuevo subproceso asigna al menos suficiente memoria para una nueva pila. Esta memoria es asignada por el sistema operativo en el proceso A.
Greg Hewgill
24
Esta respuesta parece incorrecta. Si ambos procesos y subprocesos fueran secuencias de ejecución independientes, entonces un proceso que contuviera dos subprocesos tendría que tener tres secuencias de ejecución, y eso no puede ser correcto. Solo un hilo es una secuencia de ejecución: un proceso es un contenedor que puede contener una o más secuencias de ejecución.
David Schwartz
8
Los "subprocesos de hardware" son subprocesos que reciben recursos de hardware individuales (un núcleo, procesador o hyperthread separado). Los "hilos de software" son hilos que tienen que competir por la misma potencia de procesamiento.
jpmc26
811

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

Microsoft Windows admite la multitarea preventiva, lo que crea el efecto de la ejecución simultánea de múltiples subprocesos desde múltiples procesos. En una computadora multiprocesador, el sistema puede ejecutar simultáneamente tantos subprocesos como procesadores en la computadora.

Scott Langham
fuente
18
Para las personas que desean saber por qué no pueden formatear un disquete al mismo tiempo: stackoverflow.com/questions/20708707/…
Computernerd
77
@LuisVasconcellos: si no hubiera hilos, entonces el proceso no haría nada. El proceso solo sería algún código y estado del programa cargado en la memoria. No sirve de mucho. Sería como tener una carretera sin vehículos que la recorrieran.
Scott Langham
44
@LuisVasconcellos - Bien. Sí, puede pensar en un hilo como algo que se mueve a través del código del proceso y que lleva a cabo las instrucciones en ese código.
Scott Langham
99
Esta respuesta es mucho mejor que la respuesta aceptada porque habla sobre el ideal de procesos e hilos: deberían ser cosas separadas con preocupaciones separadas. El hecho es que la mayoría de los sistemas operativos tienen una historia que se remonta más allá de la invención de los subprocesos y, en consecuencia, en la mayoría de los sistemas operativos, esas preocupaciones todavía están algo enredadas, incluso si están mejorando lentamente con el tiempo.
Solomon Slow
44
@BKSpurgeon Con cada explicación que uno dé, debe llevar a su lector de un nivel de comprensión al siguiente nivel. Desafortunadamente, no puedo adaptar la respuesta a cada lector y, por lo tanto, tengo que asumir un nivel de conocimiento. Para aquellos que no saben, pueden hacer más búsquedas de términos que yo uso no entienden, no pueden, hasta que alcanzan un punto base que sí entienden. Iba a sugerirle que ofrezca su propia respuesta, pero me alegra ver que ya la tiene.
Scott Langham
301

Proceso:

  • Una instancia de ejecución de un programa se denomina proceso.
  • 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.
  • Dado que los hilos de un proceso comparten la misma memoria, sincronizar el acceso a los datos compartidos dentro del proceso adquiere una importancia sin precedentes.

¡Tomé prestada la información anterior de Knowledge Quest! el blog .

Kumar
fuente
90
Kumar: Que yo sepa, los hilos no comparten la misma pila. De lo contrario, no sería posible ejecutar un código diferente en cada uno de ellos.
Mihai Neacsu
27
Sí, creo que @MihaiNeacsu tiene razón. Los hilos comparten "código, datos y archivos" y tienen sus propios "registros y pila". Diapositiva de mi curso de SO: i.imgur.com/Iq1Qprv.png
Shehaaz
Esto es bastante útil, ya que se expande sobre qué hilos y procesos son y cómo se relacionan entre sí. Sugeriría agregar un ejemplo de un subproceso, especialmente porque hay uno para un proceso. ¡Buen material!
Smithers
1
Los enlaces de Kquest.co.cc están muertos.
Elijah Lynn el
1
@ Rndp13 El problema es solo el uso de la palabra "apilar" en lugar de "apilar". Los hilos comparten pilas, ya que la pila es solo una parte de la memoria virtual y los hilos comparten toda la memoria virtual. Los subprocesos incluso pueden esconder sus punteros de pila y la ejecución puede ser reanudada por otro subproceso sin problemas. Que un subproceso esté ejecutando una pila en un momento particular no significa que los subprocesos no compartan pilas, al igual que el hecho de que un subproceso esté funcionando en un descriptor de archivo a la vez no significa que los subprocesos no compartan descriptores de archivo .
David Schwartz
129

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:

El modelo de proceso se basa en dos conceptos independientes: agrupación y ejecución de recursos. A veces es útil separarlos; aquí es donde entran los hilos ...

Él continúa:

Una forma de ver un proceso es que es una forma de agrupar recursos relacionados. Un proceso tiene un espacio de direcciones que contiene texto y datos del programa, así como otros recursos. Estos recursos pueden incluir archivos abiertos, procesos secundarios, alarmas pendientes, manejadores de señales, información contable y más. Al unirlos en forma de proceso, se pueden gestionar más fácilmente. El otro concepto que tiene un proceso es un hilo de ejecución, generalmente acortado a solo un hilo. El hilo tiene un contador de programa que realiza un seguimiento de qué instrucción ejecutar a continuación. Tiene registros, que contienen sus variables de trabajo actuales. Tiene una pila, que contiene el historial de ejecución, con un marco para cada procedimiento llamado pero aún no devuelto. Aunque un hilo debe ejecutarse en algún proceso, El hilo y su proceso son conceptos diferentes y se pueden tratar por separado. Los procesos se utilizan para agrupar recursos juntos; los subprocesos son las entidades programadas para su ejecución en la CPU.

Más abajo proporciona la siguiente tabla:

Per process items             | Per thread items
------------------------------|-----------------
Address space                 | Program counter
Global variables              | Registers
Open files                    | Stack
Child processes               | State
Pending alarms                |
Signals and signal handlers   |
Accounting information        |

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.

  1. Subprocesos de espacio de usuario
  2. Hilos de Kernel
  3. Una combinación de los dos

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".

Robert S. Barnes
fuente
44
Excelente respuesta! Desglosa gran parte de la jerga y las suposiciones. Sin embargo, esto hace que esta línea se destaque como incómoda: "Entonces, alguien tuvo la idea de tener básicamente dos conjuntos de estado de subproceso (registros de PC +)": ¿a qué se refiere aquí la "PC"?
Smithers
2
@Smithers La PC es el contador del programa, o puntero de instrucción, que proporciona la dirección de la siguiente instrucción que se ejecutará: en.wikipedia.org/wiki/Program_counter
Robert S. Barnes
Veo lo que hiciste alli. stackoverflow.com/questions/1762418/process-vs-thread/…
Alexander Gonchiy
¿Por qué "Pila" no figura en "Elementos por proceso"? Tanto los procesos como los subprocesos tienen su propia pila.
stackoverflowuser2010
1
@ stackoverflowuser2010 no solo los subprocesos tienen pilas. Lo que llama un proceso es un proceso con un solo hilo de ejecución y es el hilo que tiene la pila, no el proceso.
Robert S. Barnes
101

Explicar más con respecto a la programación concurrente.

  1. 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.

  2. 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.

Reachgoals
fuente
14
Excelente respuesta, simplifica las cosas y proporciona un ejemplo con el que todos los usuarios que ven la pregunta pueden identificarse.
Smithers
77
¡editar / guardar fue un buen ejemplo para múltiples hilos dentro de un proceso!
53

Una aplicación consta de uno o más procesos. Un proceso, en los términos más simples, es un programa en ejecución. Uno o más hilos se ejecutan en el contexto del proceso. Un subproceso es la unidad básica a la que el sistema operativo asigna el tiempo del procesador. Un subproceso puede ejecutar cualquier parte del código de proceso, incluidas las partes que otro subproceso está ejecutando actualmente. Una fibra es una unidad de ejecución que la aplicación debe programar manualmente. Las fibras se ejecutan en el contexto de los hilos que las programan.

Robado de aquí .

Nodo
fuente
En otros sistemas operativos, como Linux, no existe una diferencia práctica entre los dos en el nivel del sistema operativo, excepto que los subprocesos generalmente comparten el mismo espacio de memoria que el proceso principal. (De ahí mi
voto negativo
1
Buena respuesta (especialmente con la acreditación), ya que muestra la relación entre los dos y los valores en una "próxima pregunta" fácilmente esperada (sobre fibras).
Smithers
29

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.

Gerald
fuente
27

Ejemplo del mundo real para proceso y subproceso Esto le dará la idea básica sobre subproceso y proceso ingrese la descripción de la imagen aquí

Tomé prestada la información anterior de la respuesta de Scott Langham - gracias

Ratheesh
fuente
25

Proceso:

  1. El proceso es un proceso pesado.
  2. El proceso es un programa separado que tiene memoria separada, datos, recursos, etc.
  3. Los procesos se crean utilizando el método fork ().
  4. El cambio de contexto entre el proceso lleva mucho tiempo.

Ejemplo:
Digamos, abriendo cualquier navegador (mozilla, Chrome, IE). En este punto comenzará a ejecutarse un nuevo proceso.

Hilos:

  1. Los subprocesos son procesos ligeros. Los subprocesos se agrupan dentro del proceso.
  2. Los hilos tienen una memoria compartida, datos, recursos, archivos, etc.
  3. Los hilos se crean usando el método clone ().
  4. El cambio de contexto entre los hilos no consume mucho tiempo como Proceso.

Ejemplo:
abrir varias pestañas en el navegador.

ANK
fuente
En el mundo de Windows tienes razón, pero en Linux cada 'hilo' es un proceso y son igualmente 'pesados' (o livianos).
Neil
22
  • Cada proceso es un hilo (hilo primario).
  • Pero cada hilo no es un proceso. Es una parte (entidad) de un proceso.
karthikeyan_somu
fuente
3
¿Puede explicar eso un poco más y / o incluir alguna evidencia?
Zim84
15

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:

  • Recursos compartidos (los subprocesos comparten memoria por definición, no poseen nada excepto la pila y las variables locales; los procesos también podrían compartir memoria, pero hay un mecanismo separado para eso, mantenido por el sistema operativo)
  • Espacio de asignación (espacio de kernel para procesos frente a espacio de usuario para subprocesos)

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.

Sergey Mikhanov
fuente
13

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

Saurabh Juneja
fuente
13

http://lkml.iu.edu/hypermail/linux/kernel/9608/0191.html

Linus Torvalds ([email protected])

Martes, 6 de agosto de 1996 12:47:31 +0300 (EET DST)

Mensajes ordenados por: [fecha] [hilo] [asunto] [autor]

Mensaje siguiente: Bernd P. Ziller: "Re: Vaya en get_hash_table"

Mensaje anterior: Linus Torvalds: "Re: pedido de E / S"

El lunes 5 de agosto de 1996, Peter P. Eiserloh escribió:

Necesitamos mantener claro el concepto de hilos. Demasiada gente parece confundir un hilo con un proceso. La siguiente discusión no refleja el estado actual de Linux, sino que es un intento de mantenerse en una discusión de alto nivel.

¡NO!

NO hay razón para pensar que los "hilos" y los "procesos" son entidades separadas. Así es como se hace tradicionalmente, pero personalmente creo que es un gran error pensar de esa manera. La única razón para pensar de esa manera es el equipaje histórico.

Tanto los subprocesos como los procesos son realmente una sola cosa: un "contexto de ejecución". Intentar distinguir artificialmente diferentes casos es solo autolimitado.

Un "contexto de ejecución", por el presente denominado COE, es solo el conglomerado de todo el estado de ese COE. Ese estado incluye cosas como el estado de la CPU (registros, etc.), el estado de MMU (asignaciones de página), el estado de permiso (uid, gid) y varios "estados de comunicación" (archivos abiertos, controladores de señales, etc.). Tradicionalmente, la diferencia entre un "subproceso" y un "proceso" ha sido principalmente que los subprocesos tienen estado de CPU (+ posiblemente algún otro estado mínimo), mientras que el resto del contexto proviene del proceso. Sin embargo, esa es solo una forma de dividir el estado total del COE, y no hay nada que diga que es la forma correcta de hacerlo. Limitarse a ese tipo de imagen es simplemente estúpido.

La forma en Linux piensa acerca de esto (y la forma en que quiere que las cosas de trabajo) es que no es ninguna cosa tal como un "proceso" o un "hilo". Solo existe la totalidad del COE (llamado "tarea" por Linux). Diferentes COE pueden compartir partes de su contexto entre sí, y un subconjunto de ese intercambio es la configuración tradicional de "hilo" / "proceso", pero eso realmente debería verse como SOLO un subconjunto (es un subconjunto importante, pero esa importancia viene no desde el diseño, sino desde los estándares: obviamente, también queremos ejecutar programas de hilos que cumplan con los estándares sobre Linux).

En resumen: NO diseñe alrededor de la forma de pensar del hilo / proceso. El núcleo debe diseñarse en torno a la forma de pensar del COE, y luego la biblioteca pthreads puede exportar la interfaz limitada de pthreads a los usuarios que desean utilizar esa forma de ver los COE.

Solo como un ejemplo de lo que se hace posible cuando piensas COE en lugar de hilo / proceso:

  • Puede hacer un programa "cd" externo, algo que tradicionalmente es imposible en UNIX y / o proceso / thread (ejemplo tonto, pero la idea es que puede tener este tipo de "módulos" que no están limitados al UNIX tradicional / configuración de hilos). Hacer un:

clonar (CLONE_VM | CLONE_FS);

hijo: execve ("external-cd");

/ * el "execve ()" desasociará la VM, por lo que la única razón por la que usamos CLONE_VM fue hacer que el acto de clonar sea más rápido * /

  • Puede hacer "vfork ()" de forma natural (se necesita un soporte mínimo del núcleo, pero ese soporte se adapta perfectamente a la forma de pensar CUA):

clonar (CLONE_VM);

child: continuar corriendo, eventualmente execve ()

madre: espera al execve

  • puedes hacer "demonios IO" externos:

clon (CLONE_FILES);

hijo: descriptores de archivos abiertos, etc.

madre: usa los fd's que abrió el niño y vv.

Todo lo anterior funciona porque no estás atado a la forma de pensar del hilo / proceso. Piense en un servidor web, por ejemplo, donde los scripts CGI se realizan como "hilos de ejecución". No puede hacer eso con hilos tradicionales, porque los hilos tradicionales siempre tienen que compartir todo el espacio de direcciones, por lo que tendría que vincular todo lo que siempre quiso hacer en el servidor web (un "hilo" no puede ejecutarse otro ejecutable).

Pensando en esto como un "contexto de la ejecución del" problema en su lugar, sus tareas ahora puede elegir para ejecutar programas externos (= separar el espacio de direcciones del padre), etc, si quieren, o pueden, por ejemplo, compartir todo con los padres , excepto para los descriptores de archivo (para que los sub "subprocesos" puedan abrir muchos archivos sin que el padre necesite preocuparse por ellos: se cierran automáticamente cuando el sub "subproceso" sale, y no usa fd's en el padre) .

Piense en un "inetd" roscado, por ejemplo. Desea un bajo fork + exec, por lo que con la forma de Linux que puede en lugar de usar un "fork ()", escribe un inetd multiproceso donde cada subproceso se crea con solo CLONE_VM (comparta el espacio de direcciones, pero no comparta el archivo descriptores, etc.) Entonces el niño puede ejecutar si fue un servicio externo (rlogind, por ejemplo), o tal vez fue uno de los servicios internos de inetd (echo, timeofday) en cuyo caso simplemente hace lo suyo y sale.

No puede hacer eso con "hilo" / "proceso".

Linus

陳 力
fuente
12

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 .textsegmentación para almacenar código compilado, .bsspara 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_structque 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_structestructura 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).

Rachit Tayal
fuente
11

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).

Rupesh
fuente
1
Buena respuesta, me gusta que define su alcance (mundo Java) y proporciona algunos ejemplos aplicables, incluido uno (# 2) con el que cualquiera que tenga que hacer la pregunta original puede relacionarse de inmediato.
Smithers
9

¿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.

Aquí hay un resumen de las diferencias entre hilos y procesos:

  1. Los subprocesos son más fáciles de crear que los procesos, ya que no requieren un espacio de direcciones separado.

  2. 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.

  3. Los subprocesos se consideran livianos porque usan muchos menos recursos que los procesos.

  4. 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.

  5. Un proceso puede consistir en múltiples hilos.

Carlos
fuente
9

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.

Un hilo es otro mecanismo para dividir la carga de trabajo en secuencias de ejecución separadas. Un hilo es más liviano que un proceso. Esto significa que ofrece menos flexibilidad que un proceso completo, pero puede iniciarse más rápido porque hay menos para configurar el sistema operativo. Cuando un programa consta de dos o más subprocesos, todos los subprocesos comparten un solo espacio de memoria. Los procesos reciben espacios de direcciones separados. Todos los hilos comparten un único montón. Pero cada hilo tiene su propia pila.

Carthi
fuente
1
No estoy seguro si esto está claro, a menos que provenga de una perspectiva que ya entienda los hilos frente a los procesos. Agregar cómo se relacionan entre sí podría ser útil.
Smithers
No es claro. ¿Significa solo un proceso y sus hilos? ¿Qué pasa si hay muchos procesos con muchos hilos en cada uno? ¿Todos esos hilos comparten un solo espacio de memoria? De todos esos procesos?
Verde
9

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

Lovekush Vishwakarma
fuente
Suena como concurrencia de nodos en un proceso frente al paralelismo de múltiples hilos de otro idioma
user2734550
Esto está literalmente copiado de la respuesta a continuación de 2010 ...
mc01
8

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:

  1. Los hilos comparten el mismo espacio de memoria, lo que significa que un hilo puede acceder a la memoria desde la memoria de hilos de otros. Los procesos normalmente no pueden.
  2. Recursos. Los recursos (memoria, identificadores, sockets, etc.) se liberan al finalizar el proceso, no al finalizar el subproceso.
  3. Seguridad. Un proceso tiene un token de seguridad fijo. Un hilo, por otro lado, puede hacerse pasar por diferentes usuarios / tokens.

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 .

AndreiM
fuente
Cuando dice token de seguridad, ¿se refiere a una credencial de usuario (nombre de usuario / contraseña) como la que tiene en linux, por ejemplo?
En Windows, este es un tema complejo, el token de seguridad (en realidad llamado Token de acceso) es una gran estructura, que contiene toda la información requerida para la verificación de acceso. La estructura se crea después de la autorización, lo que significa que no hay nombre de usuario / contraseña, sino una lista de SID / derecho basada en el nombre de usuario / contraseña. Más detalles aquí: msdn.microsoft.com/en-us/library/windows/desktop/…
AndreiM
8
  1. Un subproceso se ejecuta en un espacio de memoria compartida, pero un proceso se ejecuta en un espacio de memoria separado
  2. Un hilo es un proceso ligero, pero un proceso es un proceso pesado.
  3. Un hilo es un subtipo de proceso.
Sushil Kumar
fuente
Esto se siente muy recursivo. Quizás sería una mejor respuesta si la relación entre el hilo y el proceso se ampliara.
Smithers
7

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

Procesos e hilos

Saurabh RS
fuente
1
Puede ser interesante agregar otro proceso solo para ver cómo el subprocesamiento múltiple se compara con el multiprocesamiento.
Bram Vanroy
6

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:

  1. evitar que el proceso defectuoso bloquee todo el sistema.
  2. Mantener la seguridad haciendo que los datos de otros procesos sean invisibles e inalcanzables. El trabajo real dentro del proceso es atendido por uno o más hilos.
Divergencia
fuente
6
  1. Básicamente, un hilo es parte de un proceso sin un hilo de proceso que no podría funcionar.
  2. Un hilo es ligero, mientras que el proceso es pesado.
  3. la comunicación entre procesos requiere algo de tiempo, mientras que el subproceso requiere menos tiempo.
  4. Los subprocesos pueden compartir la misma área de memoria, mientras que el proceso vive por separado.
dinesh sharma
fuente
6

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.

saidesh kilaru
fuente
No está mal, aunque introduce un nuevo concepto ("uno con otro") que probablemente sea extraño para alguien que hace la pregunta.
Smithers
La publicación está formateada como código pero debe ser texto normal.
Heinrich
6

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.

ingrese la descripción de la imagen aquí

snr
fuente
5

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.

Aaron
fuente
4

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.

S.Adikaram
fuente
4

La mejor respuesta que he encontrado hasta ahora es 'La interfaz de programación de Linux' de Michael Kerrisk :

En las implementaciones modernas de UNIX, cada proceso puede tener múltiples hilos de ejecución. Una forma de visualizar subprocesos es como un conjunto de procesos que comparten la misma memoria virtual, así como una gama de otros atributos. Cada subproceso está ejecutando el mismo código de programa y comparte la misma área de datos y montón. Sin embargo, cada subproceso tiene su propia pila que contiene variables locales e información de enlace de llamada de función. [LPI 2.12]

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 .

Zach Valenta
fuente
Esto parece directamente contradictorio. Una parte dice que un proceso puede tener más de un hilo. La siguiente parte dice que un hilo es un conjunto de procesos que comparten memoria virtual. No veo cómo ambas cosas pueden ser ciertas.
David Schwartz
Así es como lo leo: deseche la palabra 'tener' en la primera oración. Lo que queda, en términos de terminología, es 1) un solo hilo y 2) una agrupación de hilos, lo que se conoce como un proceso por conveniencia. Esta es mi opinión sobre lo que Kerrisk está buscando aquí.
Zach Valenta
Lo que creo que está tratando de decir es que si estás acostumbrado a la antigua vista UNIX de que los procesos son lo que el sistema operativo programa, entonces un conjunto de hilos es como un conjunto de procesos, excepto que comparten un montón de cosas.
David Schwartz
¡Derecha! Buena manera de colocarlo.
Zach Valenta
3

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.

usuario3633458
fuente
3

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.

Nasir Ul Islam Butt
fuente
¿Podría ampliar su respuesta?
Fiver
3
El subproceso es un subproceso, comparten recursos comunes como código, datos, archivos dentro de un proceso. Mientras que los dos procesos no pueden compartir recursos (las excepciones son si un proceso (padre) se bifurca para hacer otro proceso (hijo), por defecto pueden compartir recursos.), exige una alta carga útil a los recursos de la CPU, mientras que los subprocesos son mucho más ligeros en este contexto. Aunque ambos poseen las mismas cosas. el estado de espera, pero cuando el proceso de subprocesos múltiples está bloqueado por E / S, entonces su único hilo de E / S en cuestión se bloqueará.
Nasir Ul Islam Butt