C - ¿el ejecutivo tiene que seguir inmediatamente a la bifurcación en un proceso de subprocesos múltiples?
Frecuentes
Visto 4,240 equipos
10
Situación: Tengo un programa multiproceso escrito en C. Si uno de los subprocesos se bifurca, el proceso hijo se reemplaza por otro que usa exec () y el padre espera a que el hijo salga.
Problema: Después de que fork () crea el proceso hijo, hay algunas líneas de código que compilan los argumentos que se utilizarán en el siguiente comando exec ().
Hipótesis ¿Estoy en lo cierto al suponer que en el tiempo entre el proceso hijo creado por fork () y reemplazado por exec (), el proceso hijo, que es una copia del padre, tendrá todos los subprocesos del padre y, por lo tanto, estos subprocesos funcionará, aunque sea por un período muy breve?
Si es así, ¿es la solución correcta llamar a exec () inmediatamente después de fork ()?
3 Respuestas
10
Solo el hilo que llama fork
se ejecutará en el nuevo proceso. Sin embargo, existen límites a las funciones que puede llamar antes exec
. Desde fork
:
Se creará un proceso con un solo hilo. Si un proceso de varios subprocesos llama
fork()
, el nuevo proceso contendrá una réplica del hilo de llamada y su espacio de direcciones completo, posiblemente incluyendo los estados de mutex 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 uno de losexec
se llama funciones. Los manipuladores de horquillas pueden establecerse mediante elpthread_atfork()
función para mantener invariantes de aplicación enfork()
llamadas.
Creo que esto significa que, en general, debería estar bien, siempre que las bibliotecas de subprocesos múltiples utilicen pthread_atfork
correctamente.
EDITAR: El pthread_atfork
La página explica con más detalle cómo la biblioteca puede protegerse a sí misma:
El uso esperado es que el controlador de preparación adquiera todos los bloqueos de exclusión mutua y los otros dos controladores de bifurcación los liberen.
Por ejemplo, una aplicación puede proporcionar una rutina de preparación que adquiere los mutex necesarios que la biblioteca mantiene y proporcionar rutinas secundarias y principales que liberan esos mutex, asegurando así que el niño obtenga una instantánea coherente del estado de la biblioteca (y que no haya mutexes). dejado varado). Alternativamente, algunas bibliotecas podrían proporcionar solo una rutina secundaria que reinicialice los mutex en la biblioteca y todos los estados asociados a algún valor conocido (por ejemplo, lo que era cuando se ejecutó originalmente la imagen).
respondido 19 nov., 10:17
3
Como escribió @Matthew en su respuesta, los otros subprocesos del proceso principal no existirán en el proceso secundario (si está utilizando PThreads).
Tenga en cuenta que si esto no fuera así, no ayudaría colocar la llamada a exec () "inmediatamente después" de la llamada a la bifurcación, ya que aún existiría la posibilidad de que los otros subprocesos se ejecuten antes de la llamada a exec (). Sin embargo, podría controlar esto bloqueando un mutex antes de llamar a fork (); esencialmente, sería destruido por la llamada a exec ().
respondido 19 nov., 10:09
No estoy seguro de que esto sea correcto acerca de que los mutex "esencialmente se destruyen". Como dije anteriormente, existe el riesgo de que las cerraduras entren en un estado inconsistente. Es por eso pthread_atfork
existe. - Mateo Flaschen
0
Yo también pensé que todos los hilos también se replicarán en el proceso hijo. Pero eso no es cierto. Dado que otros subprocesos no se replican en el proceso hijo, si usa mutex / bloqueos antes de exec, debe asegurarse de que los controladores de bifurcaciones estén escritos para manejarlos correctamente. Aquí hay un artículo al respecto. http://learnwithtechies.com/tech/index.php?option=com_content&view=article&id=15:fork-in-multithreaded-environment&catid=10:unix
Respondido el 06 de diciembre de 10 a las 14:12
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas c multithreading pthreads exec fork or haz tu propia pregunta.
¿El pasaje citado sugiere que la biblioteca estándar (por ejemplo, stdio,
atexit
,malloc
, creación y destrucción de subprocesos, etc.) pueden usar internamente recursos de sincronización que podrían estar en un estado inconsistente después defork
? Si es así, ¿cómo se usaríapthread_atfork
¿resolver el problema? - R .. GitHub DEJA DE AYUDAR A ICE@R, sí, posiblemente. Depende de la biblioteca. En algunos casos, pueden bloquear todos los mutex antes de la bifurcación y luego liberarlos inmediatamente después de la bifurcación. En otros, está bien simplemente reinicializarlos como si el proceso comenzara desde cero. He añadido un pasaje relevante de
pthread_atfork
. - Mateo Flaschen