2010-03-20 33 views

Respuesta

73

Un tenedor le da un nuevo proceso de marca, que es una copia del proceso actual, con los mismos segmentos de código. A medida que la imagen de la memoria cambia (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 sigue siendo el mismo. Las tareas no comparten memoria a menos que usen alguna primitiva Inter Process Communication (IPC).

Un proceso puede tener múltiples hilos, 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 mutexes, condition variables y semaphores) que le permiten evitar daños en los datos.

+3

Probablemente desee consultar "copia del proceso actual" como un proceso secundario. –

+1

Sin embargo, el segmento de texto a menudo se comparte (prácticamente) e incluso el segmento de datos puede copiarse por escritura. – Xailor

+0

Definir un hilo utilizando el hilo no es una buena idea ... – nbro

26

respuesta de Dacav es excelente, sólo quería añadir que no todos los modelos de roscado que dan verdadero multi-procesamiento.

Por ejemplo, la implementación de subprocesamiento por defecto de Ruby no utiliza subprocesos verdaderos de OS/kernel. En su lugar, imita tener múltiples hilos al cambiar entre los objetos Thread dentro de un hilo/proceso de kernel único.

Esto es importante en sistemas multiprocesador/multi-core, porque estos tipos de subprocesos livianos solo pueden ejecutarse en un solo núcleo: no se obtiene mucho en términos de aumento de rendimiento por tener múltiples hilos.

El otro lugar esto hace la diferencia es cuando uno secuencias de roscado (a la espera de E/S o llamando IOCTL de conducir), todos los bloques Hilos.

Esto no es muy común hoy en día - implementaciones más enhebrado utilizan hilos del núcleo que no sufren de estos problemas - pero vale la pena mentioining para la integridad.

Por el contrario, tenedor le da otro proceso que es ejecutable simultáneamente en otra CPU física, mientras que el proceso original se está ejecutando. Algunas personas consideran que el IPC es más adecuado para su aplicación, mientras que otras prefieren el enhebrado.

¡Buena suerte y diviértete! Multi-threading es a la vez desafiante y gratificante.

+6

+1 para golpear un nervio: "no todos los hilos te dan un verdadero multiprocesamiento " – Dacav

+0

ruby> = 2.0 Soporta subprocesos de SO/kernel. –

5

Los hilos son funciones que se ejecutan en paralelo, el tenedor es un proceso nuevo con la herencia de los padres. Los subprocesos son buenos para ejecutar una tarea en paralelo, mientras que los tenedores son procesos independientes, que también se ejecutan simultáneamente. Los hilos tienen condiciones de carrera y hay semáforos y cerraduras o mutexes de control, los tubos se pueden usar tanto en horquilla como en rosca.

63

Tenedor:

Tenedor no es más que un nuevo proceso que se ve exactamente como la edad o el proceso padre, pero todavía es un proceso diferente con diferentes ID de proceso y tener su propia memoria. El proceso principal crea un espacio de direcciones separado para el niño. Ambos procesos padre e hijo poseen el mismo segmento de código, pero se ejecutan de forma independiente el uno del otro.

El ejemplo más simple de bifurcación es cuando ejecuta un comando en shell en unix/linux. Cada vez que un usuario emite un comando, el shell realiza un proceso secundario y la tarea finaliza.

Cuando se emite una llamada al sistema tenedor, el SO crea una copia de todas las páginas correspondientes al proceso primario cargado en una ubicación de memoria separada para el proceso hijo, pero en algunos casos, esto no es necesario.Al igual que en las llamadas al sistema 'exec', no es necesario copiar las páginas de proceso principales, ya que execv reemplaza el espacio de direcciones del proceso principal.

Pocas cosas a tener en cuenta sobre bifurcan son:

  • El proceso hijo va a tener su propio identificador de proceso único.
  • El proceso secundario debe tener su propia copia del descriptor de archivo del padre.
  • Los bloqueos de archivos establecidos por el proceso principal no se heredarán mediante el proceso hijo.
  • Cualquier semáforo que esté abierto en el proceso principal también debe estar abierto en el proceso hijo.
  • El proceso secundario debe tener su propia copia de los descriptores de cola de mensaje de los padres.
  • El niño tendrá su propio espacio de direcciones y memoria.

Temas:

Hilos son procesos peso ligero (LWP). Tradicionalmente, un hilo es simplemente un estado de CPU (y algún otro estado mínimo) con el proceso que contiene los restos (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 el entorno para el proceso. Si bien es más efectivo en un sistema multiprocesador donde el flujo del proceso puede programarse para ejecutarse en otro procesador, ganando velocidad mediante el procesamiento paralelo o distribuido, también se obtienen ganancias en sistemas uniprocesadores que aprovechan la latencia en E/S y otras funciones del sistema que pueden detener el proceso ejecución.

Temas en el mismo proceso comparten:

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

Más detalles se pueden encontrar here.

+0

Un proceso puede tener varios hilos. Si uno de los subprocesos en un proceso llama fork, ¿el proceso bifurcado tiene una memoria completamente duplicada, pero solo el hilo de llamada está en el nuevo proceso? – Michael

+0

Respuesta: SÍ https://stackoverflow.com/questions/10080811/what-happens-to-other-threads-when-one-thread-forks – Michael

4
  1. Los subprocesos comparten el espacio de direcciones del proceso que lo creó; los procesos tienen su propia dirección espacio.
  2. Los subprocesos tienen acceso directo al segmento de datos de su proceso; los procesos tienen su propia copia de el segmento de datos del proceso principal.
  3. Los hilos pueden comunicarse directamente con otros hilos de su proceso; los procesos deben usar la comunicación entre procesos para comunicarse con los procesos de hermanos.
  4. Los subprocesos casi no tienen sobrecarga; los procesos tienen una sobrecarga considerable.
  5. Los nuevos hilos se crean fácilmente; los nuevos procesos requieren la duplicación del proceso principal.
  6. Los hilos pueden ejercer un control considerable sobre los hilos del mismo proceso; los procesos solo pueden controlar los procesos secundarios.
  7. Los cambios en el hilo principal (cancelación, cambio de prioridad, etc.) pueden afectar el comportamiento de los otros hilos del proceso; los cambios en el proceso principal no afectan a los procesos secundarios
Cuestiones relacionadas