Hilo (informática)


En informática , un hilo de ejecución es la secuencia más pequeña de instrucciones programadas que un programador puede gestionar de forma independiente , que suele ser parte del sistema operativo . [1] La implementación de subprocesos y procesos difiere entre sistemas operativos, pero en la mayoría de los casos un subproceso es un componente de un proceso. Los múltiples subprocesos de un proceso dado se pueden ejecutar simultáneamente (a través de capacidades de subprocesos múltiples), compartiendo recursos como la memoria, mientras que los diferentes procesos no comparten estos recursos. En particular, los subprocesos de un proceso comparten su código ejecutable y los valores de sus variables asignadas dinámicamente y las variables globales no locales del subproceso en un momento dado.

Los subprocesos hicieron una aparición temprana bajo el nombre de "tareas" en OS / 360 Multiprogramming with a Variable Number of Tasks (MVT) en 1967. Saltzer (1966) acredita a Victor A. Vyssotsky con el término "thread". [2]

La popularidad de los subprocesos ha aumentado alrededor de 2003, ya que el crecimiento de la frecuencia de la CPU se reemplazó por el crecimiento del número de núcleos, lo que a su vez requiere la concurrencia para utilizar múltiples núcleos. [3]

La programación se puede realizar a nivel de kernel o de usuario, y la multitarea se puede realizar de forma preventiva o cooperativa. Esto produce una variedad de conceptos relacionados.

A nivel del kernel, un proceso contiene uno o más subprocesos del kernel , que comparten los recursos del proceso, como la memoria y los identificadores de archivos: un proceso es una unidad de recursos, mientras que un subproceso es una unidad de programación y ejecución. La programación del kernel se realiza típicamente de manera uniforme de manera preventiva o, con menos frecuencia, de manera cooperativa. A nivel de usuario, un proceso como un sistema en tiempo de ejecución puede programar múltiples subprocesos de ejecución. Si estos no comparten datos, como en Erlang, generalmente se denominan procesos de manera análoga, [4] mientras que si comparten datos, generalmente se denominan subprocesos (de usuario) , sobre todo si se programan de forma preventiva. Los subprocesos de usuario programados cooperativamente se conocen como fibras; diferentes procesos pueden programar los subprocesos de usuario de manera diferente. Los subprocesos de usuario pueden ser ejecutados por subprocesos del kernel de varias formas (uno a uno, muchos a uno, muchos a muchos). El término " proceso liviano " se refiere de diversas formas a los hilos del usuario o a los mecanismos del kernel para programar los hilos del usuario en los hilos del kernel.

Un proceso es una unidad "pesada" de programación del núcleo, ya que crear, destruir y cambiar procesos es relativamente caro. Procesa los recursos propios asignados por el sistema operativo. Los recursos incluyen memoria (tanto para código como para datos), identificadores de archivos , sockets, identificadores de dispositivos, ventanas y un bloque de control de procesos . Los procesos se aíslan mediante el aislamiento de procesos y no comparten espacios de direcciones ni recursos de archivos, excepto a través de métodos explícitos, como la herencia de identificadores de archivos o segmentos de memoria compartida, o el mapeo del mismo archivo de forma compartida; consulte Comunicación entre procesos .. Crear o destruir un proceso es relativamente caro, ya que los recursos deben adquirirse o liberarse. Los procesos suelen ser multitarea preventivamente y el cambio de proceso es relativamente caro, más allá del costo básico del cambio de contexto , debido a problemas como el vaciado de la caché (en particular, el cambio de proceso cambia el direccionamiento de la memoria virtual, lo que provoca la invalidación y, por lo tanto, el vaciado de un búfer de búsqueda de traducción sin etiquetar , especialmente en x86).


Un proceso con dos subprocesos de ejecución, que se ejecuta en un procesador.