¿Se copian los hilos al llamar a fork?

31

Si tengo un programa que se ejecuta con hilos y llamo fork()en un sistema basado en Unix, ¿se copian los hilos? Sé que la memoria virtual para el proceso actual se copia 1: 1 al nuevo proceso generado. Sé que los hilos tienen su propia pila en la memoria virtual de un proceso. Por lo tanto, al menos la pila de hilos también debe copiarse. Sin embargo, no sé si hay algo más en los subprocesos que no reside en la memoria virtual y, por lo tanto, NO se copia. Si no lo hay, ¿los dos procesos comparten los hilos o son copias independientes?

Jean-Baptiste Yunès
fuente

Respuestas:

29

No.

Los hilos no se copian fork(). La especificación POSIX dice (el énfasis es mío):

fork - crea un nuevo proceso

Se creará un proceso con un solo hilo . Si un proceso de subprocesos múltiples llama a fork (), el nuevo proceso contendrá una réplica del subproceso de llamada y su espacio de direcciones completo, posiblemente incluyendo los estados de mutexes y otros recursos. En consecuencia, para evitar errores, el proceso secundario solo puede ejecutar operaciones seguras de señal asíncrona hasta el momento en que se llame a una de las funciones ejecutivas.

Para evitar este problema, existe una pthread_atfork()función para ayudar.

Jean-Baptiste Yunès
fuente
7

tenedor hombre :

El proceso hijo se crea con un solo hilo, el que se llama fork (). Todo el espacio de direcciones virtuales del padre se replica en el hijo, incluidos los estados de mutexes, variables de condición y otros objetos pthreads; El uso de pthread_atfork (3) puede ser útil para tratar los problemas que esto puede causar.

kaylum
fuente
Pero eso parece extraño: ¿por qué se copiaría la pila de los subprocesos en el proceso que llama la bifurcación si los subprocesos reales (que no sé que contienen almacenamiento en otro lugar que no sea la memoria virtual) no lo están?
Bueno, el por qué es una pregunta completamente diferente. No sé las decisiones de diseño originales que llevaron a esa implementación. Si está interesado, debe hacer eso como una pregunta separada.
kaylum
@dip pero la pila de otros hilos no se copian, ¿quién lo dijo?
Jean-Baptiste Yunès
1
@ Jean-BaptisteYunès En los sistemas unix, existe una estructura que representa la memoria virtual para un proceso. Esa es la copiada. No solo el montón y bss
66
obtienes todo el espacio de memoria y, por lo tanto, las pilas de todos los hilos. lo necesita porque no hay limitación sobre dónde apuntan los punteros que viven en la pila (o memoria estática) accesibles para el subproceso restante: podrían muy bien apuntar a datos que vivieron en la pila de algunos subprocesos en el proceso original
davidbak
4

De The Open Group Base Especificaciones Número 7, horquilla de la edición 2018 :

Se creará un proceso con un solo hilo. Si un proceso de subprocesos múltiples llama a fork () , el nuevo proceso contendrá una réplica del hilo de llamada y su espacio de direcciones completo, posiblemente incluyendo los estados de mutexes y otros recursos. En consecuencia, para evitar errores, el proceso hijo solo puede ejecutar operaciones seguras de señal asíncrona hasta el momento en que se llame a una de las funciones ejecutivas .

Cuando la aplicación llama a fork () desde un controlador de señal y cualquiera de los controladores de fork registrados por pthread_atfork () llama a una función que no es segura para la señal asíncrona, el comportamiento es indefinido.

Ian Abbott
fuente
-2

Originalmente, la "bifurcación" se lograba escribiendo la tarea en el disco y luego, en lugar de leer en un hilo diferente (lo que se haría si se intercambia la tarea por una diferente), modificando el ID de la tarea de la imagen que aún está en la memoria y continuando con su ejecución (como la nueva tarea). Esta fue una modificación muy simple al mecanismo básico de cambio de tareas, donde solo una tarea ocuparía la memoria RAM a la vez.

Por supuesto, a medida que la gestión de la memoria se hizo más elaborada, este esquema se modificó para adaptarse al nuevo entorno.

Hot Licks
fuente
Curioso por qué esto fue rechazado. Así lo hizo Unix.
Hot Licks
Esta es una idea interesante, pero ¿dónde menciona los hilos? No me parece una respuesta.
wastl