¿Qué es un "hilo" (realmente)?

237

He estado tratando de encontrar una buena definición y comprender qué es realmente un hilo .

Parece que me falta algo obvio, pero cada vez que leo sobre qué es un hilo, es casi una definición circular, como "un hilo es un hilo de ejecución" o "una forma de dividirse en tareas en ejecución". Uh uh ¿Eh?

Parece por lo que he leído que un hilo no es realmente algo concreto, como lo es un proceso. De hecho, es solo un concepto. Por lo que entiendo de la forma en que esto funciona, un procesador ejecuta algunos comandos para un programa (que se ha denominado un hilo de ejecución ), luego, cuando necesita cambiar un poco el procesamiento de otro programa, almacena el estado de el programa se está ejecutando actualmente en algún lugar (Thread Local Storage) y luego comienza a ejecutar las instrucciones del otro programa. Y de ida y vuelta. De tal manera, un hilo es realmente solo un concepto para "uno de los caminos de ejecución" de un programa que se está ejecutando actualmente.

A diferencia de un proceso, que realmente es algo: es un conglomerado de recursos, etc.

Como ejemplo de una definición que realmente no me ayudó mucho. . .

De Wikipedia :

"Un subproceso en ciencias de la computación es la abreviatura de un subproceso de ejecución. Los subprocesos son una forma para que un programa se divida (denomine" dividir ") en dos o más tareas de ejecución simultáneas (o seudo simultáneas). Los subprocesos y procesos difieren de uno "sistema operativo a otro pero, en general, un hilo está contenido dentro de un proceso y diferentes hilos en el mismo proceso comparten los mismos recursos, mientras que diferentes procesos en el mismo sistema operativo multitarea no".

¿Entonces tengo razón? ¿Incorrecto? ¿Qué es realmente un hilo?

Editar: Al parecer un hilo también se da su propia pila de llamadas, por lo que es un poco de un hormigón cosa .

Ricardo
fuente
66
"Proceso" no es menos que un término abstracto.
hobbs
¿El almacenamiento local de subprocesos es solo la pila de llamadas para el subproceso?
committedandroider
1
Posible duplicado de "implementos Runnable" vs. "extiende Thread"
VahidHoseini
3
Las respuestas a continuación son ... abstractas. En términos más simples (y pasar por alto algunos detalles): una vez, un programa de computadora solo podía hacer una cosa a la vez. Entonces hizo A, luego B, luego C, luego ... En los sistemas modernos, esto no es ideal; por ejemplo, desea seguir navegando por la web mientras descarga un archivo. Entonces los programas ahora tienen uno o más 'hilos'. Cada 'hilo' solo puede hacer una cosa a la vez, pero diferentes hilos pueden hacer cosas simultáneamente . El hilo 1 puede hacer A, luego B, luego C; el hilo 2 puede hacer X, luego Y, luego Z. B no puede comenzar hasta que A haya terminado, pero A y X pueden suceder de inmediato.
Mohan
@ Mohan eso es genial, pero ¿cómo es eso diferente de un proceso?
Eric

Respuestas:

154

Un subproceso es un conjunto independiente de valores para los registros del procesador (para un solo núcleo). Como esto incluye el puntero de instrucción (también conocido como Contador de programa), controla lo que se ejecuta en qué orden. También incluye el Apilador de pila, que es mejor apuntar a un área de memoria única para cada hilo o de lo contrario interferirán entre sí.

Los subprocesos son la unidad de software afectada por el flujo de control (llamada de función, bucle, goto), porque esas instrucciones operan en el puntero de instrucción, y eso pertenece a un subproceso particular. Los subprocesos a menudo se programan de acuerdo con algún esquema de priorización (aunque es posible diseñar un sistema con un subproceso por núcleo de procesador, en cuyo caso cada subproceso siempre se está ejecutando y no se necesita una programación).

De hecho, el valor del puntero de instrucción y la instrucción almacenada en esa ubicación es suficiente para determinar un nuevo valor para el puntero de instrucción. Para la mayoría de las instrucciones, esto simplemente avanza la IP por el tamaño de la instrucción, pero las instrucciones de flujo de control cambian la IP de otras maneras predecibles. La secuencia de valores que toma la IP forma una ruta de ejecución que se entrelaza a través del código del programa, dando lugar al nombre de "hilo".

Ben Voigt
fuente
10
+1. Un hilo no es nada más "concreto" que un conjunto de valores de registro.
Greg Hewgill
66
¿Qué "conjunto de valores"? ¿Qué son? ¿Cómo definen un hilo ?
Richard
20
@ Richard: La lista exacta de registros de CPU depende de la arquitectura, pero el puntero de instrucción y el puntero de pila son bastante universales. Definen un subproceso en la medida en que cuando este subproceso (conjunto de valores de registro) se carga en el núcleo del procesador, el subproceso se está ejecutando . El procesador está obteniendo instrucciones exigidas por el hilo y actualizando los registros de hilo. Cuando se necesita un cambio de contexto, el procesador guarda este conjunto de valores de registro en la memoria y carga un conjunto que pertenece a un subproceso diferente, generalmente como parte de la lógica de servicio de interrupción.
Ben Voigt
44
Gracias Ben Eso es muy útil
Richard
2
Hola, gracias @BenVoigt. Algunas aclaraciones que los novatos como yo pueden tropezar: ¿qué se entiende por "registros de procesador"? ¿Qué se entiende por "puntero de instrucción" y "puntero de pila"?
BKSpurgeon el
215

Un hilo es un contexto de ejecución, que es toda la información que una CPU necesita para ejecutar una secuencia de instrucciones.

Suponga que está leyendo un libro y desea tomarse un descanso ahora mismo, pero desea poder regresar y reanudar la lectura desde el punto exacto donde se detuvo. Una forma de lograrlo es anotando el número de página, el número de línea y el número de palabra. Entonces, el contexto de ejecución para leer un libro son estos 3 números.

Si tienes una compañera de cuarto y ella está usando la misma técnica, puede tomar el libro mientras tú no lo estás usando y reanudar la lectura desde donde se detuvo. Luego puede recuperarlo y reanudarlo desde donde estaba.

Los hilos funcionan de la misma manera. Una CPU te está dando la ilusión de que está haciendo múltiples cálculos al mismo tiempo. Lo hace al pasar un poco de tiempo en cada cálculo. Puede hacerlo porque tiene un contexto de ejecución para cada cálculo. Al igual que puedes compartir un libro con tu amigo, muchas tareas pueden compartir una CPU.

En un nivel más técnico, un contexto de ejecución (por lo tanto, un subproceso) consta de los valores de los registros de la CPU.

Último: los hilos son diferentes de los procesos. Un hilo es un contexto de ejecución, mientras que un proceso es un conjunto de recursos asociados con un cálculo. Un proceso puede tener uno o varios hilos.

Aclaración: los recursos asociados con un proceso incluyen páginas de memoria (todos los subprocesos en un proceso tienen la misma vista de la memoria), descriptores de archivos (por ejemplo, sockets abiertos) y credenciales de seguridad (por ejemplo, la ID del usuario que inició el proceso).

pwnall
fuente
20
Una mejor analogía sería equiparar a la persona con la CPU (ambos hacen algo), y equiparar la libreta con el espacio de direcciones (ambos simplemente existen). De esa manera, los marcadores en diferentes libros son como hilos en diferentes procesos. Un solo libro con más de un marcador sería el análogo de un proceso de subprocesos múltiples, que es lo que la gente suele decir cuando dice "hilos". Funciona para una máquina con un solo procesador, pero se descompone un poco cuando se habla de multiprocesamiento. A nadie le importa qué CPU ejecuta la función f (), pero importa qué persona lea el capítulo 11.
Solomon Slow
@pwnall, ¡muchas gracias por digerir conceptos difíciles para otros como yo! ¿Está involucrado el subprocesamiento múltiple en el multiprocesamiento (o la ejecución de un proceso en paralelo en muchas CPU, en caso de que esté usando el término incorrecto)?
aerijman
51

Para definir formalmente un hilo, primero debemos entender los límites de dónde opera un hilo.

Un programa de computadora se convierte en un proceso cuando se carga desde alguna tienda en la memoria de la computadora y comienza la ejecución. Un proceso puede ser ejecutado por un procesador o un conjunto de procesadores. Una descripción del proceso en la memoria contiene información vital, como el contador del programa que realiza un seguimiento de la posición actual en el programa (es decir, qué instrucción se está ejecutando actualmente), registros, almacenes de variables, identificadores de archivos, señales, etc.

Un hilo es una secuencia de tales instrucciones dentro de un programa que puede ejecutarse independientemente de otro código. La figura muestra el concepto: ingrese la descripción de la imagen aquí

Los subprocesos se encuentran dentro del mismo espacio de direcciones del proceso , por lo tanto, gran parte de la información presente en la descripción de la memoria del proceso se puede compartir entre subprocesos.

Parte de la información no se puede replicar, como la pila (puntero de pila a un área de memoria diferente por subproceso), registros y datos específicos del subproceso. Esta información es suficiente para permitir que los subprocesos se programen independientemente del subproceso principal del programa y posiblemente uno o más subprocesos dentro del programa.

Se requiere soporte explícito del sistema operativo para ejecutar programas multiproceso. Afortunadamente, la mayoría de los sistemas operativos modernos admiten subprocesos como Linux (a través de NPTL), variantes BSD, Mac OS X, Windows, Solaris, AIX, HP-UX, etc. Los sistemas operativos pueden usar diferentes mecanismos para implementar el soporte de subprocesos múltiples.

Aquí, gráficamente, el concepto está representado.

Aquí puede encontrar más información sobre el tema. Esa fue también mi fuente de información.

Permítanme agregar una oración proveniente de Introducción al sistema integrado de Edward Lee y Seshia :

Los subprocesos son programas imprescindibles que se ejecutan simultáneamente y comparten un espacio de memoria. Pueden acceder a las variables de los demás. Muchos profesionales en el campo usan el término "hilos" más estrictamente para referirse a formas particulares de construir programas que comparten memoria, [otros] para referirse ampliamente a cualquier mecanismo donde los programas imperativos se ejecutan simultáneamente y comparten memoria. En este sentido amplio, existen subprocesos en forma de interrupciones en casi todos los microprocesadores, incluso sin ningún sistema operativo (hierro desnudo).

Leos313
fuente
45

Los procesos son como dos personas que usan dos computadoras diferentes, que usan la red para compartir datos cuando es necesario. Los hilos son como dos personas que usan la misma computadora, que no tienen que compartir datos explícitamente, sino que deben turnarse cuidadosamente.

Conceptualmente, los hilos son solo múltiples abejas obreras zumbando en el mismo espacio de direcciones. Cada subproceso tiene su propia pila, su propio contador de programa, etc., pero todos los subprocesos en un proceso comparten la misma memoria. Imagine que dos programas se ejecutan al mismo tiempo, pero ambos pueden acceder a los mismos objetos.

Contrasta esto con los procesos. Los procesos tienen cada uno su propio espacio de direcciones, lo que significa que un puntero en un proceso no se puede usar para referirse a un objeto en otro (a menos que use memoria compartida).

Supongo que las cosas clave para entender son:

  • Ambos procesos y subprocesos pueden "ejecutarse al mismo tiempo".
  • Los procesos no comparten memoria (de forma predeterminada), pero los subprocesos comparten toda su memoria con otros subprocesos en el mismo proceso.
  • Cada hilo en un proceso tiene su propia pila y su propio puntero de instrucción.
Joey Adams
fuente
Usted dice que "los procesos no comparten nada (por defecto)", pero en su analogía, declara que "los procesos son como dos personas que usan dos computadoras diferentes, que usan la red para compartir datos cuando es necesario" ¿Entonces comparten algo?
committedandroider
@committedandroider: Buena llamada. Edité mi respuesta para decir que los procesos no comparten memoria (por defecto), pero los hilos comparten toda la memoria.
Joey Adams
36

Voy a utilizar una gran cantidad de texto del libro Conceptos de sistemas operativos de ABRAHAM SILBERSCHATZ, PETER BAER GALVIN y GREG GAGNE junto con mi propia comprensión de las cosas.

Proceso

Cualquier aplicación reside en la computadora en forma de texto (o código).

Hacemos hincapié en que un programa en sí mismo no es un proceso. Un programa es una entidad pasiva, como un archivo que contiene una lista de instrucciones almacenadas en el disco (a menudo llamado archivo ejecutable).

Cuando iniciamos una aplicación, creamos una instancia de ejecución. Esta instancia de ejecución se llama proceso. EDITAR: (Según mi interpretación, análoga a una clase y una instancia de una clase, la instancia de una clase es un proceso).

Un ejemplo de procesos es el de Google Chrome. Cuando iniciamos Google Chrome, se generan 3 procesos:

• El proceso del navegador es responsable de administrar la interfaz de usuario, así como el disco y la red de E / S. Se crea un nuevo proceso de navegador cuando se inicia Chrome. Solo se crea un proceso de navegador.

Renderer procesos contienen la lógica para la prestación de páginas web. Por lo tanto, contienen la lógica para manejar HTML, Javascript, imágenes, etc. Como regla general, se crea un nuevo proceso de representación para cada sitio web abierto en una nueva pestaña, por lo que varios procesos de representación pueden estar activos al mismo tiempo.

• Un plug-in se crea proceso para cada tipo de plug-in (como Flash o QuickTime) en uso. Los procesos del complemento contienen el código para el complemento, así como un código adicional que permite que el complemento se comunique con los procesos de representación asociados y el proceso del navegador.

Hilo

Para responder esto, creo que primero debes saber qué es un procesador. Un procesador es la pieza de hardware que realmente realiza los cálculos. EDITAR: (Cálculos como agregar dos números, ordenar una matriz, básicamente ejecutar el código que se ha escrito)

Ahora pasando a la definición de un 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.

EDITAR: Definición de un hilo del sitio web de Intel:

Un subproceso, o subproceso de ejecución, es un término de software para la secuencia ordenada básica de instrucciones que puede pasar o procesarse por un solo núcleo de CPU.

Entonces, si el proceso Renderer de la aplicación Chrome clasifica una serie de números, la clasificación se realizará en un hilo / hilo de ejecución. (La gramática con respecto a los hilos me parece confusa)

Mi interpretación de las cosas

Un proceso es una instancia de ejecución. Los subprocesos son los trabajadores reales que realizan los cálculos a través del acceso a la CPU. Cuando se ejecutan varios subprocesos para un proceso, el proceso proporciona memoria común.

EDITAR: Otra información que encontré útil para dar más contexto

Todas las computadoras modernas tienen más de un hilo. El número de hilos en una computadora depende del número de núcleos en una computadora.

Computación concurrente :

De Wikipedia:

La computación concurrente es una forma de computación en la que se ejecutan varias computaciones durante períodos de tiempo superpuestos, concurrentemente, en lugar de secuencialmente (una completa antes de que comience la siguiente). Esta es una propiedad de un sistema (puede ser un programa individual, una computadora o una red) y hay un punto de ejecución separado o "hilo de control" para cada cálculo ("proceso").

Entonces, podría escribir un programa que calcule la suma de 4 números:

(1 + 3) + (4 + 5)

En el programa para calcular esta suma (que será un proceso que se ejecuta en un hilo de ejecución), puedo bifurcar otro proceso que puede ejecutarse en un hilo diferente para calcular (4 + 5) y devolver el resultado al proceso original, mientras que el El proceso original calcula la suma de (1 + 3).

chatuur
fuente
55
esa es la verdadera respuesta
Suhail Mumtaz Awan
1
Ayudó mucho Así es como se ve la explicación.
Dinesh Kumar
Un gran valor de esta respuesta es que proporciona un libro de referencia donde puede encontrar más detalles si es necesario. Gracias @chatuur!
desa
7

Desafortunadamente, existen hilos. Un hilo es algo tangible. Puedes matar a uno, y los otros seguirán corriendo. Puede generar nuevos hilos ... aunque cada hilo no es su propio proceso, se ejecutan por separado dentro del proceso. En máquinas multinúcleo, 2 hilos podrían ejecutarse al mismo tiempo.

http://en.wikipedia.org/wiki/Sim simultánea_multithreading

http://www.intel.com/intelpress/samples/mcp_samplech01.pdf

Orbita
fuente
1
¿Qué es lo que lo hace "algo tangible"? ¿Son solo esos datos almacenados en el TLS y su pila de llamadas?
Richard
Que no es solo una abstracción para la comprensión ... Si realmente fuera solo un hilo que corría de un lado a otro disfrazado de múltiples hilos, el OP estaría en lo cierto, pero sí, diría que estos datos lo harán tangible .
Orbit
Iluminame . . . ¿Entonces, cuál es la respuesta?
Richard
@Richard no busca entrar en un debate sobre semántica, simplemente formuló mi respuesta para intentar aclarar conceptualmente al OP.
Orbit
@richard ¿Qué es el TLS?
committedandroider
6

Un hilo no es más que un contexto de memoria (o cómo Tanenbaum lo pone mejor, agrupación de recursos) con reglas de ejecución. Es una construcción de software. La CPU no tiene idea de qué es un hilo (algunas excepciones aquí, algunos procesadores tienen hilos de hardware), solo ejecuta instrucciones.

El núcleo presenta el concepto de hilo y proceso para administrar la memoria y el orden de las instrucciones de manera significativa.

Valentin Radu
fuente
5

Esto fue tomado de una respuesta de Yahoo:

Un hilo es una construcción de codificación no afectada por la arquitectura de una aplicación. Un solo proceso con frecuencia puede contener múltiples hilos. Los hilos también pueden comunicarse directamente entre sí, ya que comparten las mismas variables.

Los procesos son unidades de ejecución independientes con su propia información de estado. También usan sus propios espacios de direcciones y solo pueden interactuar con otros procesos a través de mecanismos de comunicación entre procesos.

Sin embargo, para poner en términos más simples, los hilos son como diferentes "tareas". Así que piense en cuándo está haciendo algo, por ejemplo, escribiendo una fórmula en un papel. Eso puede considerarse un hilo. Luego, otro hilo es que estás escribiendo algo más en otra hoja de papel. Ahí es donde entra la multitarea.

Se dice que los procesadores Intel tienen "hiperprocesamiento" (AMD también lo tiene) y está destinado a poder realizar múltiples "subprocesos" o realizar múltiples tareas mucho mejor.

No estoy seguro de la logística de cómo se maneja un hilo. Recuerdo haber escuchado sobre el procesador yendo y viniendo entre ellos, pero no estoy 100% seguro de esto y espero que alguien más pueda responder eso.

Aleta
fuente
¿Cómo manejan mejor los procesadores Intel múltiples hilos? Con un solo núcleo, solo se debe ejecutar un hilo a la vez. Estoy de acuerdo con el procesador yendo y viniendo. Realmente no puedes hacerlo mejor, ¿verdad?
committedandroider
Es una optimización que ofrece un mejor rendimiento para algunos casos de uso. Puede leer sobre hyper threading aquí: en.wikipedia.org/wiki/Hyper-threading
Jeremy Friesner
5

La respuesta varía enormemente entre diferentes sistemas y diferentes implementaciones, pero las partes más importantes son:

  1. Un subproceso tiene un subproceso de ejecución independiente (es decir, puede cambiar de contexto, alejarse y luego volver a ejecutarse, y continuará ejecutándose donde estaba).
  2. Un hilo tiene una vida útil (puede ser creado por otro hilo, y otro hilo puede esperar a que termine).
  3. Probablemente tiene menos equipaje adjunto que un "proceso".

Más allá de eso: los subprocesos podrían implementarse dentro de un solo proceso mediante un tiempo de ejecución de lenguaje, los subprocesos podrían ser corutinas, los subprocesos podrían implementarse dentro de un solo proceso mediante una biblioteca de subprocesos o los subprocesos podrían ser una construcción del núcleo.

En varios sistemas modernos de Unix, incluido Linux con el que estoy más familiarizado, todo son hilos: un proceso es simplemente un tipo de hilo que comparte relativamente pocas cosas con su padre (es decir, obtiene sus propias asignaciones de memoria, su propia tabla de archivos). y permisos, etc.) La lectura man 2 clone, especialmente la lista de banderas, es realmente instructiva aquí.

hobbs
fuente
¿Es un cambio de contexto justo cuando el procesador pasa de un hilo a otro (ya sea en el mismo proceso u otro)?
committedandroider
-1

No estoy muy contento con ninguna de esas respuestas, así que voy a agregar la mía aquí :) Un hilo es una abstracción del núcleo para programar el trabajo en el procesador, un hilo es lo que el núcleo le da para administrar el tiempo del procesador y compartir trabajo con otros

Ion Todirel
fuente
1
-1 Los hilos no necesitan ser creados por el núcleo. Los hilos con soporte a nivel de núcleo son programados por el núcleo (donde se emite algún tipo de syscall). Pero también hay subprocesos con soporte de nivel de biblioteca de usuario, con la tabla de subprocesos que reside en el espacio del usuario.
AleksandrH
-1

Permítanme explicar primero la diferencia entre proceso e hilos.

Un proceso puede tener {1..N} número de hilos. Una pequeña explicación sobre memoria virtual y procesador virtual.

Memoria virtual

Se utiliza como espacio de intercambio para que un proceso piense que está en la memoria primaria para la ejecución.

Procesador virtual

El mismo concepto que la memoria virtual, excepto que es para el procesador. Para un proceso, parecerá que es lo único que está usando el procesador.

El sistema operativo se encargará de asignar la memoria virtual y el procesador virtual a un proceso y realizar el intercambio entre procesos y la ejecución.

Todos los hilos dentro de un proceso compartirán la misma memoria virtual. Sin embargo, cada subproceso tendrá asignado su procesador virtual individual para que puedan ejecutarse individualmente.

Por lo tanto, guarda la memoria y utiliza la CPU a su máximo potencial.

Balaji Radhakrishnan
fuente