¿Cuál es la diferencia entre tenedor e hilo?

Respuestas:

94

Una bifurcación le brinda un proceso completamente nuevo, que es una copia del proceso actual, con los mismos segmentos de código. A medida que cambia la imagen de la memoria (normalmente esto se debe a un comportamiento diferente de los dos procesos), se obtiene una separación de las imágenes de la memoria (Copiar al escribir), sin embargo, el código ejecutable permanece igual. Las tareas no comparten memoria a menos que utilicen alguna primitiva de comunicación entre procesos (IPC) .

Un proceso puede tener varios subprocesos, cada uno ejecutándose en paralelo dentro del mismo contexto del proceso. La memoria y otros recursos se comparten entre subprocesos, por lo tanto, se debe acceder a los datos compartidos a través de algunos objetos primitivos y de sincronización (como mutex , variables de condición y semáforos ) que le permiten evitar la corrupción de datos.

Dacav
fuente
3
Probablemente desee referirse a "copia del proceso actual" como un proceso hijo.
1
Sin embargo, el segmento de texto a menudo se comparte (virtualmente) e incluso el segmento de datos se puede copiar al escribir.
Jé Queue
76

Tenedor

Fork no es más que un proceso nuevo que se ve exactamente como el proceso anterior o el proceso principal, pero aún así es un proceso diferente con un ID de proceso diferente y que tiene su propia memoria. El proceso padre crea un espacio de direcciones separado para el hijo. Tanto el proceso principal como el secundario poseen el mismo segmento de código, pero se ejecutan de forma independiente entre sí.

El ejemplo más simple de bifurcación es cuando ejecuta un comando en el shell en Unix / Linux. Cada vez que un usuario emite un comando, el shell bifurca un proceso hijo y la tarea está terminada.

Cuando se emite una llamada al sistema de bifurcación, se crea una copia de todas las páginas correspondientes al proceso principal, que el sistema operativo carga en una ubicación de memoria separada para el proceso secundario, pero en ciertos casos, esto no es necesario. Al igual que en las llamadas al sistema 'exec', no es necesario copiar las páginas del proceso principal, ya que execv reemplaza el espacio de direcciones del proceso principal.

Algunas cosas a tener en cuenta sobre la bifurcación son:

  • El proceso hijo tendrá su propio ID de proceso único.
  • El proceso hijo tendrá su propia copia del descriptor de archivo de los padres.
  • Los bloqueos de archivos establecidos por el proceso padre no serán heredados por el proceso hijo.
  • Todos los semáforos que estén abiertos en el proceso padre también estarán abiertos en el proceso hijo.
  • El proceso hijo tendrá su propia copia de los descriptores de cola de mensajes del padre.
  • El niño tendrá su propio espacio de direcciones y memoria.

Hilos

Los subprocesos son procesos ligeros (LWP). Tradicionalmente, un hilo es solo un estado de la CPU (y algún otro estado mínimo) con el proceso que contiene el resto (datos, pila, E / S, señales). Los subprocesos requieren menos sobrecarga que "bifurcar" o generar un nuevo proceso porque el sistema no inicializa un nuevo espacio de memoria virtual del sistema y un entorno para el proceso. Si bien es más efectivo en un sistema multiprocesador donde el flujo del proceso se puede programar para que se ejecute en otro procesador, ganando así velocidad a través del procesamiento paralelo o distribuido, también se encuentran ganancias en los sistemas monoprocesador que aprovechan la latencia en E / S y otras funciones del sistema que pueden detener el proceso. ejecución.

Los subprocesos en el mismo proceso comparten:

  • instrucciones de proceso
  • la mayoría de los datos
  • archivos abiertos (descriptores)
  • señales y manejadores de señales
  • directorio de trabajo actual
  • ID de usuario y grupo

Puede encontrar más detalles aquí .

Napster_X
fuente
2
Un proceso puede tener varios hilos. Si uno de los subprocesos en un proceso llama a fork, ¿el proceso bifurcado tiene una memoria completamente duplicada, pero solo el subproceso que llama está en el nuevo proceso?
Michael
29

La respuesta de Dacav es excelente, solo quería agregar que no todos los modelos de subprocesamiento le brindan un verdadero multiprocesamiento.

Por ejemplo, la implementación de subprocesos predeterminada de Ruby no usa verdaderos subprocesos del kernel / sistema operativo. En su lugar, imita tener varios subprocesos al cambiar entre los objetos del subproceso dentro de un solo subproceso / proceso del núcleo.

Esto es importante en los sistemas multiprocesador / multinúcleo, porque estos tipos de subprocesos ligeros solo pueden ejecutarse en un único núcleo; no se obtiene mucho en cuanto al aumento del rendimiento al tener varios subprocesos.

El otro lugar en el que esto marca la diferencia es cuando un hilo se bloquea (esperando en E / S o llamando al IOCTL de un controlador), todos los hilos se bloquean.

Esto no es muy común hoy en día, la mayoría de las implementaciones de subprocesos utilizan subprocesos del kernel que no sufren estos problemas, pero vale la pena mencionarlo por su integridad.

Por el contrario, la bifurcación le brinda otro proceso que se puede ejecutar simultáneamente en otra CPU física mientras se ejecuta el proceso original. Algunas personas encuentran IPC más adecuado para su aplicación, otras prefieren subprocesos.

¡Buena suerte y diviertete! El multihilo es desafiante y gratificante.

Sam Post
fuente
7
+1 por tocar un nervio: "no todos los subprocesos te dan un verdadero multiprocesamiento"
Dacav
5

Los subprocesos son funciones que se ejecutan en paralelo, la bifurcación es un proceso nuevo con herencia de los padres. Los subprocesos son buenos para ejecutar una tarea en paralelo, mientras que las bifurcaciones son procesos independientes, que también se ejecutan simultáneamente. Los subprocesos tienen condiciones de carrera y allí controlan semáforos y bloqueos o mutex, las tuberías se pueden usar tanto en fork como en thread.

sergio
fuente