what syscall does c process multithreading fork

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



wait process c (5)

¿Alguien puede explicar la diferencia entre un tenedor y un hilo?


Tenedor:

Fork no es más que un nuevo proceso que se ve exactamente como el proceso antiguo o el proceso principal, pero aún así es un proceso diferente con ID de proceso diferente y con 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 sistema operativo 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 de proceso principales, ya que execv reemplaza el espacio de direcciones del proceso principal.

Pocas cosas a tener en cuenta sobre bifurcación son:

  • El proceso secundario tendrá su propio ID de proceso único.
  • El proceso secundario tendrá 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.
  • Todos los semáforos que están abiertos en el proceso principal también estarán abiertos en el proceso hijo.
  • El proceso secundario tendrá su propia copia de descriptores de cola de mensajes de los padres.
  • El niño tendrá su propio espacio de direcciones y memoria.

Trapos:

Los hilos son procesos de peso liviano (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
  • La mayoría de datos
  • abrir archivos (descriptores)
  • señales y manejadores de señal
  • directorio de trabajo actual
  • ID de usuario y grupo

Más detalles se pueden encontrar here .


  1. Los subprocesos comparten el espacio de direcciones del proceso que lo creó; los procesos tienen su propio espacio de direcciones.
  2. Los hilos tienen acceso directo al segmento de datos de su proceso; los procesos tienen su propia copia del 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 hermanos.
  4. Los hilos casi no tienen gastos generales; 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 ejercer control sobre 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 los procesos secundarios

La respuesta de Dacav es excelente, solo quería agregar que no todos los modelos de enhebrado ofrecen un verdadero procesamiento múltiple.

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 los sistemas multiprocesador / multi-core, ya que estos tipos de subprocesos livianos solo pueden ejecutarse en un único núcleo: no obtendrá mucho en términos de aumento de rendimiento al tener múltiples hilos.

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

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

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

¡Buena suerte y diviertete! Multi-threading es a la vez desafiante y gratificante.


Los hilos son funciones que se ejecutan en paralelo, fork 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 controla los semáforos y las cerraduras o mutex, las tuberías se pueden usar tanto en horquilla como en rosca.


Una bifurcación le proporciona un proceso nuevo, 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 utilicen alguna primitiva de comunicación entre procesos (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 que se debe acceder a los datos compartidos a través de algunos objetos primitivos y de sincronización (como mutexes , variables de condición y semaphores ) que le permiten evitar la corrupción de datos.