2012-10-13 106 views
6

Duplicar posible:
fork in multi-threaded programHilos y tenedor(). ¿Cómo puedo lidiar con eso?

Si tengo una aplicación que emplea tenedor() y podría ser desarrollado como multiproceso, ¿cuáles son las reglas del pulgar/directrices a tener en cuenta para seguridad programar esta tipo de aplicaciones?

+0

@JensGustedt Originalmente, aunque así también, pero esto debe ser más largo de las líneas de una pregunta completa sobre las discusiones y _fork() _ en Linux. – Emanuele

Respuesta

4

Las reglas básicas del pulgar, de acuerdo con varios artículos de internet como (http://www.linuxprogrammingblog.com/threads-and-fork-think-twice-before-using-them, fork in multi-threaded program) son:

  1. (Principal) Proceso [0] monofilamento -> tenedor() -> (niño) Proceso [1] Multithreaded: ¡Está bien!
    Si Proceso [1] se bloquea o se mete en todo con la memoria que no se táctil espacio de direcciones del proceso [0] (a menos que utilice la memoria compartida R/W ... pero esto es otro tema de su propio).
    En Linux de forma predeterminada, todos fork() ed memoria es Copy On Write. Dado que Proceso [0] se monothreaded, cuando invocamos tenedor() todas las posibles primitivas de exclusión mutua deben ser generalmente en un estado desbloqueado.

  2. (Principal) Proceso [0] multiproceso -> tenedor() -> (niño) Proceso [1] Mono/multiproceso: MALO!
    Si horquilla() un proceso multiproceso sus exclusiones mutuas y muchas otras primitivas de sincronización hilo será probablemente en un estado indefinido en el proceso [1]. Puedes trabajar con pthread_atfork(), pero si utilizas bibliotecas, también puedes lanzar un dado y esperar tener suerte. Porque generalmente no desea (quiere) conocer los detalles de implementación de las bibliotecas.

Las ventajas de tenedor() en un proceso multiproceso son que se podía manipular/leer/agregado sus datos más rápidos (en el proceso de Menores), sin tener que preocuparse por la estabilidad del proceso que tenedor() de (Principal). Esto es útil si su proceso principal tiene un conjunto de datos de mucho de memoria y no desea duplicar/recargarlo para procesar los datos de forma segura en otro proceso (Niño). De esta forma, el proceso original es estable e independiente del proceso de agregación/manipulación de datos (fork() ed).

Por supuesto, esto significa que el proceso original generalmente será más lento de lo que podría ser si se desarrollara en modo multiproceso. Pero, de nuevo, este es el precio que quizás desee pagar para obtener más estabilidad.

Si por el contrario el proceso principal es multiproceso, estribillo del uso de tenedor().Va a ser un desastre apropiado para implementarlo de una manera estable.

Saludos

-1

En Linux, las discusiones se implementan en términos de procesos. En otras palabras, los hilos son en realidad solo un fork() con la mayoría de memoria compartida, en lugar de la memoria completamente de escritura. Lo que esto significa es que cuando usa fork() en un hilo (principal u otro), termina copiando todo el espacio de memoria compartida de todos los hilos, y el almacenamiento específico de hilo del hilo al que llama fork().

Ahora todo esto suena bien, pero eso no significa que esto sea lo que sucederá o funcionará bien. Si desea realizar un proceso clonado, intente hacer una bifurcación antes de iniciar cualquier otra conversación, y luego utilice la memoria virtual de solo lectura para mantener el proceso bifurcado actualizado con los valores de memoria actuales.

Así que, aunque puede funcionar, solo sugiero probar y tratar de encontrar otra manera primero. Y estar preparado para un montón de:

Segmentation fault 
+1

Todavía subprocesos y procesos, incluso con linux, tienen una semántica muy diferente. En particular, al estrellarse, donde un hilo que se cuelga llevará a todos los demás con él y se puede manejar un proceso de colisión. No tengo la sensación de que su respuesta sea particularmente útil para la pregunta original y debería haber sido puesta en un comentario. –

+0

@Linuxios Gracias por esta explicación adicional sobre cómo se crean los subprocesos en Linux, pero ¿no debería ser _clone() _ la llamada que se usa técnicamente? Creo que es un poco confuso en términos generales. Saludos – Emanuele

+0

@Emanuele: Eso es exactamente lo que menciono. La llamada de clon – Linuxios

Cuestiones relacionadas