multithreading - sistemas - procesos e hilos en linux




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

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

Me da la sensación de que una palabra como "proceso" está sobreutilizada y también hay hilos de hardware y software. ¿Qué hay de los procesos ligeros en lenguajes como Erlang ? ¿Hay una razón definitiva para usar un término sobre el otro?


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 de procesador. Un subproceso puede ejecutar cualquier parte del código de proceso, incluidas las partes que se están ejecutando actualmente por otro subproceso. Una fibra es una unidad de ejecución que debe ser programada manualmente por la aplicación. Las fibras se ejecutan en el contexto de los hilos que los programan.

Robado de here .


  1. Básicamente, un subproceso es una parte de un proceso sin un subproceso de proceso que no podría funcionar.
  2. Un hilo es ligero, mientras que el proceso es pesado.
  3. la comunicación entre el proceso requiere algo de tiempo, mientras que el hilo requiere menos tiempo.
  4. Los hilos pueden compartir la misma área de memoria, mientras que el proceso vive por separado.

Desde el 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 / viejos y un sistema operativo RTOS pequeño (sistema operativo en tiempo real ), como freeRTOS, no hay soporte de MMU y, por lo tanto, no hay procesos, sino solo hilos.

Los subprocesos pueden acceder a la memoria de los demás, y están programados por el sistema operativo de manera intercalada para que parezcan funcionar en paralelo (o con multi-core que realmente se ejecutan en paralelo).

Los procesos , por otro lado, viven en su caja de arena privada de memoria virtual, provista y protegida por MMU. Esto es útil porque permite:

  1. evitando que el proceso de buggy bloquee todo el sistema.
  2. Mantener la seguridad al hacer que los datos de otros procesos sean invisibles e inalcanzables. El trabajo real dentro del proceso está a cargo de uno o más hilos.

Desde el punto de vista de un entrevistador, hay básicamente 3 cosas principales que quiero escuchar, además de cosas obvias, como un proceso, puede tener varios 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 otro hilo. Normalmente los procesos no pueden.
  2. Recursos Los recursos (memoria, identificadores, sockets, etc.) se liberan en la terminación del proceso, no en la terminación del hilo.
  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 prácticamente todo. Todos estos son desde la perspectiva de un sistema operativo. Diferentes idiomas pueden implementar diferentes conceptos, como tareas, subprocesos ligeros y demás, 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 subprocesos de modo de usuario y de núcleo.


Lo siguiente es lo que obtuve de uno de los artículos sobre The Code Project . Supongo que explica todo lo necesario con claridad.

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


Los subprocesos del mismo proceso comparten la memoria, pero cada subproceso tiene su propia pila y registros, y los subprocesos almacenan datos específicos de subprocesos 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 secundario crea, duplica la ubicación de memoria del proceso principal. El proceso de comunicación se realiza mediante el uso de tuberías, memoria compartida y análisis de mensajes. El cambio de contexto entre hilos es muy lento.


Para aquellos que se sienten más cómodos con el aprendizaje mediante la visualización, aquí hay un diagrama útil que creé para explicar el Proceso y los Subprocesos.
Usé la información de MSDN - Acerca de los procesos y subprocesos


Primero, veamos el aspecto teórico. Debe comprender qué es conceptualmente un proceso para comprender la diferencia entre un proceso y un subproceso y lo que se comparte entre ellos.

Tenemos lo siguiente de la sección 2.2.2 El modelo de rosca clásica 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 el texto y los 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 juntarlos en la forma de un 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. Cuenta con registros, que mantienen sus actuales variables de trabajo. Tiene una pila, que contiene el historial de ejecución, con un marco para cada procedimiento llamado pero aún no devuelto. Aunque un subproceso debe ejecutarse en algún proceso, el subproceso y su proceso son conceptos diferentes y se pueden tratar por separado. Los procesos se utilizan para agrupar los recursos; Los hilos 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        |

Vamos a tratar con el problema de multiproceso de hardware . Clásicamente, una CPU admitiría un solo subproceso de ejecución, manteniendo el estado del subproceso a través de un solo contador de programa y un conjunto de registros. Pero, ¿qué pasa si hay una falta de caché? Se tarda mucho tiempo en recuperar los datos de la memoria principal, y mientras eso sucede, la CPU simplemente permanece inactiva. Así que alguien tuvo la idea de tener básicamente dos conjuntos de estados de subprocesos (PC + registros) para que otro subproceso (quizás en el mismo proceso, tal vez en un proceso diferente) pueda realizar el trabajo mientras el otro subproceso está esperando en la memoria principal. Existen múltiples nombres e implementaciones de este concepto, como HyperThreading y Simultaneous Multithreading (SMT para abreviar).

Ahora veamos el lado del software. Básicamente, hay tres formas en que los subprocesos se pueden implementar en el lado del software.

  1. Hilos 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 varias 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 atrapar el kernel y la capacidad de programar sus subprocesos como desee. El mayor inconveniente es la incapacidad de bloquear I / O (lo que bloquearía todo el proceso y todos los subprocesos de usuario), que es una de las grandes razones por las que usamos subprocesos en primer lugar. El bloqueo de E / S mediante subprocesos simplifica enormemente el diseño del programa en muchos casos.

Los subprocesos del kernel tienen la ventaja de poder utilizar el bloqueo de E / S, además de dejar todos los problemas de programación al sistema operativo. Pero cada cambio de hilo requiere una captura en el kernel que es potencialmente relativamente lento. Sin embargo, si está cambiando hilos debido a una E / S bloqueada, esto no es realmente un problema, ya que la operación de E / S probablemente ya lo atrapó en el kernel.

Otro enfoque es combinar los dos, con múltiples subprocesos del kernel, cada uno con múltiples subprocesos de usuario.

Entonces, volviendo a su pregunta 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", no veo personalmente el punto en él, ya que realmente no transmite lo que está pasando, así como el término "hilo de ejecución".


Tanto los hilos como los procesos son unidades atómicas de la 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 pueden compartir memoria, pero hay un mecanismo separado para eso, mantenido por el sistema operativo)
  • Espacio de asignación (espacio de núcleo para procesos frente a espacio de usuario para subprocesos)

Greg Hewgill fue correcto en cuanto al significado de Erlang de la palabra "proceso", y here hay una discusión de por qué Erlang podría hacer procesos ligeros.


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 qué subprocesos de "hardware" vs "software" puede referirse. Los subprocesos son una característica del entorno operativo, en lugar de una característica de la CPU (aunque la CPU normalmente 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 tienen memoria compartida.


Tratando de responder a esta pregunta relacionada con el mundo de 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 las hebras en una JVM comparten el montón que pertenece a ese proceso. Es por eso que varios hilos pueden acceder al mismo objeto. Los hilos comparten el montón y tienen su propio espacio de pila. Así es como la invocación de un hilo por 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 estar sincronizado para la seguridad de subprocesos.

Ejemplo 2: Es posible que un programa no pueda dibujar imágenes mediante la lectura de teclas. El programa debe prestar toda su atención a la entrada del teclado y, al carecer de la capacidad de manejar más de un evento a la vez, se producirán 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í, la imagen de dibujo es un proceso y la lectura de teclas es un subproceso (subproceso).


Tratando de responderla desde Linux Kernel's OS View

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 el segmento de texto para almacenar el código compilado, .bss para almacenar variables estáticas o globales sin inicializar, etc. Cada proceso tendrá su propio contador de programa y pila de usuarios. Dentro del kernel, cada proceso tendría su propia pila de kernel (que está separada de la pila de espacio del usuario por problemas de seguridad) y una estructura llamada task_struct que generalmente se abstrae como el bloque de control de procesos, almacenando toda la información relacionada con el proceso, como su prioridad. estado, (y un montón de otros trozos). 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), por lo que los subprocesos son livianos por lo tanto permitiendo un cambio de contexto más rápido. Dentro del kernel, cada hilo tiene su propia pila de kernel junto con la estructura task_struct que define el hilo. Por lo tanto, el núcleo ve subprocesos del mismo proceso como entidades diferentes y son programables en sí mismos. Los subprocesos en el mismo proceso comparten un ID común llamado id de grupo de subprocesos ( tgid ), y también tienen un ID único llamado id de proceso ( pid ).


Un proceso es una instancia en ejecución de una aplicación. Qué significa eso? Bueno, por ejemplo, cuando hace doble clic en el icono de Microsoft Word, inicia un proceso que ejecuta Word. Un hilo es una ruta de ejecución dentro de un proceso. Además, un proceso puede contener múltiples hilos. Cuando inicia Word, el sistema operativo crea un proceso y comienza a ejecutar el subproceso principal de ese proceso.

Es importante tener en cuenta que un hilo puede hacer cualquier cosa que un proceso pueda hacer. Pero como un proceso puede constar de varios subprocesos, un subproceso podría considerarse un proceso "ligero". Por lo tanto, la diferencia esencial entre un subproceso y un proceso es el trabajo que cada uno debe realizar. Los hilos 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 subproceso y un proceso es que los subprocesos dentro del mismo proceso comparten el mismo espacio de direcciones, mientras que los diferentes procesos no lo hacen. Esto permite que los subprocesos lean y escriban en las mismas estructuras de datos y variables, y también facilita la comunicación entre los subprocesos. La comunicación entre procesos, también conocida como IPC, o comunicación entre procesos, es bastante difícil y requiere muchos recursos.


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

Linus Torvalds ([email protected])

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

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

Mensaje siguiente: Bernd P. Ziller: "Re: Oops in get_hash_table"

Mensaje anterior: Linus Torvalds: "Re: I / O request ordering"

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

Necesitamos mantener en claro el concepto de hilos. Demasiadas personas parecen 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 ninguna razón para pensar que "subprocesos" y "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 así es el bagaje histórico.

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

Un "contexto de ejecución", denominado aquí COE, es solo el conglomerado de todo el estado de ese COE. Ese estado incluye elementos como el estado de la CPU (registros, etc.), el estado de la MMU (asignaciones de página), el estado de los permisos (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 un subproceso tiene un 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. Limitarte a ese tipo de imagen es simplemente estúpido.

La forma en que Linux piensa sobre esto (y la forma en que quiero que las cosas funcionen) es que no existe tal cosa como un "proceso" o un "hilo". Solo existe la totalidad del COE (llamada "tarea" por Linux). Los diferentes COE pueden compartir partes de su contexto entre sí, y un subconjunto de ese intercambio es la configuración tradicional de "subproceso" / "proceso", pero en realidad debería considerarse SÓLO un subconjunto (es un subconjunto importante, pero esa importancia es importante). no desde el diseño, sino desde los estándares: obviamente queremos ejecutar programas de subprocesos que cumplen con los estándares también sobre Linux).

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

Solo como un ejemplo de lo que se hace posible cuando piensa que el COE es opuesto al hilo / proceso:

  • Puedes hacer un programa externo "cd", algo que es tradicionalmente imposible en UNIX y / o process / thread (ejemplo tonto, pero la idea es que puedes 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);

child: execve ("external-cd");

/ * "execve ()" desasociará la máquina virtual, por lo que la única razón por la que usamos CLONE_VM fue para acelerar el proceso de clonación * /

  • Puede hacer "vfork ()" de forma natural (se necesita un soporte mínimo del kernel, pero ese soporte se ajusta perfectamente a la manera de pensar de CUA):

clon (CLONE_VM);

hijo: continuar corriendo, eventualmente execve ()

madre: espera a execve

  • Usted puede hacer "Deamons IO" externos:

clon (CLONE_FILES);

hijo: abrir descriptores de archivos, etc.

Madre: usa los fd's que el niño abre y vv.

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

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

Piense en un "inetd" roscado, por ejemplo. Desea un fork + exec de baja sobrecarga, por lo que con la forma de Linux puede, en lugar de usar un "fork ()", escribe un inetd de múltiples subprocesos en el que cada subproceso se crea solo con CLONE_VM (comparte el espacio de direcciones, pero no comparte el archivo descriptores etc). Luego, el niño puede ejecutar si era un servicio externo (rlogind, por ejemplo), o tal vez fue uno de los servicios internos internos (echo, time of day) en cuyo caso simplemente hace su trabajo y sale.

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

Linus


Ejemplo del mundo real para Procesos y subprocesos Esto le dará una idea básica acerca de los subprocesos y procesos

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


Proceso:

  • Una instancia en ejecución de un programa se llama proceso.
  • Algunos sistemas operativos utilizan el término 'tarea' para referirse a un programa que se está ejecutando.
  • Un proceso siempre se almacena en la memoria principal, también denominado memoria primaria o memoria de acceso aleatorio.
  • Por lo tanto, un proceso se denomina como una entidad activa. Desaparece si se reinicia la máquina.
  • Varios procesos pueden estar asociados con un mismo programa.
  • En un sistema multiprocesador, se pueden ejecutar múltiples procesos en paralelo.
  • En un sistema de uni procesador, aunque no se logra un verdadero paralelismo, se aplica un algoritmo de programación de procesos y se programa al procesador para que ejecute cada proceso uno por uno, lo que produce una ilusión de concurrencia.
  • Ejemplo: Ejecutar múltiples instancias del programa 'Calculadora'. Cada una de las instancias se denomina como un proceso.

Hilo:

  • Un hilo es un subconjunto del proceso.
  • Se denomina "proceso liviano", 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 que se ejecutan 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 de procesador único, se aplica un algoritmo de programación de subprocesos y el procesador está programado para ejecutar cada subproceso uno a la vez.
  • Todos los subprocesos que se ejecutan dentro de un proceso comparten el mismo espacio de direcciones, descriptores de archivos, pila y otros atributos relacionados con el proceso.
  • Como los hilos de un proceso comparten la misma memoria, la sincronización del acceso a los datos compartidos dentro del proceso adquiere una importancia sin precedentes.

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


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 el otro", por lo que el thread es una parte del proceso.


Proceso
Cada proceso proporciona los recursos necesarios para ejecutar un programa. Un proceso tiene un espacio de direcciones virtuales, código ejecutable, mangos abiertos a objetos del sistema, un contexto de seguridad, un identificador de proceso único, variables de entorno, una clase de prioridad, tamaños de conjuntos de trabajo mínimos y máximos y al menos un hilo de ejecución. Cada proceso se inicia con un solo hilo, a menudo llamado el hilo primario, pero puede crear hilos adicionales a partir de cualquiera de sus hilos.

Hilo
Un hilo 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 los recursos del sistema. Además, cada subproceso mantiene controladores de excepciones, una prioridad de programación, un almacenamiento local de subprocesos, un identificador único de subprocesos y un conjunto de estructuras que el sistema utilizará para guardar el contexto del subproceso hasta que esté programado. El contexto del subproceso incluye el conjunto de registros de la máquina del subproceso, la pila del kernel, un bloque de entorno del subproceso y una pila de usuario en el espacio de direcciones del proceso del subproceso. Los subprocesos también pueden tener su propio contexto de seguridad, que se puede usar para hacerse pasar por clientes.

Encontré esto en MSDN aquí:
Sobre Procesos y Hilos

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


Considere el proceso como una unidad de propiedad o qué recursos necesita una tarea. Un proceso puede tener recursos como espacio de memoria, entrada / salida específica, archivos específicos y prioridad, etc.

Un hilo es una unidad de ejecución despachable o en palabras simples el progreso a través de una secuencia de instrucciones


Ejemplo 1: una JVM se ejecuta en un solo proceso y las hebras en una JVM comparten el montón que pertenece a ese proceso. Es por eso que varios hilos pueden acceder al mismo objeto. Los hilos comparten el montón y tienen su propio espacio de pila. Así es como la invocación de un hilo por 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 estar sincronizado para la seguridad de subprocesos.





process