Hilo (informática)


En ciencias de la computación , un hilo de ejecución es la secuencia más pequeña de instrucciones programadas que un planificador puede administrar de forma independiente , que normalmente forma 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 pueden ejecutarse simultáneamente (a través de capacidades de subprocesos múltiples), compartiendo recursos como la memoria, mientras que 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 aparecieron temprano con el nombre de "tareas" en OS / 360 Multiprogramming with a Variable Number of Tasks (MVT) en 1967. Saltzer (1966) atribuye a Victor A. Vyssotsky el término "subproceso". [2]

La popularidad de los subprocesos aumentó alrededor de 2003, ya que el crecimiento de la frecuencia de la CPU se reemplazó con el crecimiento del número de núcleos, lo que a su vez requería 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 núcleo, un proceso contiene uno o más subprocesos del núcleo , 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 generalmente se realiza de manera uniforme de manera preventiva o, con menos frecuencia, de manera cooperativa. A nivel de usuario, un proceso como un sistema de tiempo de ejecución puede programar múltiples subprocesos de ejecución. Si estos no comparten datos, como en Erlang, por lo general se los denomina procesos de manera análoga, [4] mientras que si comparten datos, generalmente se los denomina subprocesos (de usuario) , particularmente si se programan de manera preventiva. Los subprocesos de usuario programados cooperativamente se conocen como fibras .; diferentes procesos pueden programar subprocesos de usuario de manera diferente. Los subprocesos de usuario pueden ser ejecutados por subprocesos del kernel de varias maneras (uno a uno, muchos a uno, muchos a muchos). El término " proceso ligero " se refiere de diversas formas a los hilos de usuario oa los mecanismos del kernel para programar hilos de usuario en hilos de kernel.

Un proceso es una unidad de "peso pesado" de la programación del kernel, ya que crear, destruir y cambiar procesos es relativamente costoso. 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 heredar identificadores de archivos o segmentos de memoria compartidos, o asignar el mismo archivo de forma compartida; consulte la comunicación entre procesos .. Crear o destruir un proceso es relativamente costoso, ya que se deben adquirir o liberar recursos. Los procesos suelen ser multitareas preventivas, y el cambio de procesos es relativamente costoso, más allá del costo básico del cambio de contexto , debido a problemas como el vaciado de caché (en particular, el cambio de procesos 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, ejecutándose en un procesador