2012-02-13 20 views
5

enter image description hereNo entiendo este diagrama del tenedor()

¿Cómo podemos obtener este proceso con esta condición ?? esquema del proceso?

int main (int argc, char **argv) { 
    int i; 
    int pid; 
     for (i= 0; i < 3; i++) { 
      pid = fork(); 

      if (pid < 0) break;// with this condition i dont understand?? 

     } 
      while (wait(NULL) != -1); 
+3

si esto es #homework, por favor, márquelo como tal –

+0

La función se llama "horquilla", no "horquilla"; He corregido el título. –

Respuesta

8

fork() divide un proceso en dos y devuelve 0 (si este proceso es el secundario), o el PID del hijo (si este proceso es el primario), o -1 si el fork falló. Por lo tanto, esta línea:

if (pid < 0) break; 

dice "salir del bucle si no hemos podido crear un proceso hijo".

El diagrama es un poco confuso debido a la forma en que los procesos (círculos) corresponden a las llamadas fork() en el ciclo. Los tres procesos secundarios del proceso principal se crean cuando i es 0, 1 y 2, respectivamente (vea el diagrama en la parte inferior de esta publicación).

Desde el bucle continúa tanto en el proceso hijo desde el punto de tenedor padres y fue llamado, esto es cómo ocurren las horquillas:

  • i == 0: tenedor se le llama en la controladora original. Ahora hay dos procesos (el superior y el izquierdo).
  • i == 1: fork se invoca en los dos procesos existentes. Los niños nuevos son el niño más a la izquierda en la segunda capa desde la parte inferior y el niño mediano en la tercera capa desde abajo. Ahora hay cuatro procesos
  • i == 2: se llama fork en todos los procesos existentes. Nuevos niños son todos los nodos restantes (el nodo inferior, los dos nodos de más a la derecha en la segunda capa de la Borrom, y el nodo más a la derecha en la tercera capa de la parte inferior)
  • i == 3: Todos los 8 procesos de salir del bucle

Aquí es el diagrama de nuevo, con números que indican cuál es el valor de i estaba en el bucle cuando se creó el proceso:

    -1 <--- this is the parent that starts the loop 
      / | \ 
      0 1 2 
     /\ | 
      1 2 2 
      | 
      2 
2

fork devuelve -1 si falló la llamada de la horquilla. devuelve el pid en el padre y 0 en el hijo. La condición que estás mirando realmente no importa para el funcionamiento del código; solo dice si hay un error con la horquilla y luego sale del ciclo. Si no hay ningún error en la llamada de la bifurcación, se generará el árbol de procesos en su diagrama.

La razón es que el mismo bucle continuará ejecutándose en los procesos hijos. Por lo tanto, los niños también continuarán bifurcando según el valor de i en el momento en que se llamó a la horquilla.

3

Para entender su diagrama debe confiar en el comportamiento de fork: se divide el proceso de en dos, creando otro proceso idéntico al primero (a excepción del PID) en una nueva ubicación de memoria.

Si usted lo llama en un bucle que es lo que sucede:

Cuando se dividirá i=0 el primer proceso, la creación de otro proceso que comenzará a funcionar exactamente desde este punto en adelante (por lo que se saltará el primer bucle). Centrándose en el primer proceso, continuará el ciclo, generando otro proceso cuando i=1.El segundo proceso, por lo tanto, comenzará desde i=1, por lo que omitirá los primeros dos bucles. El primer proceso se dividirá la última vez para i=2. La última copia creada, sin embargo, comenzará a ejecutarse desde i=2, por lo que saldrá del bucle y no generará nada.

La primera copia creada iniciará el ciclo desde i=1, generando dos procesos, mientras que la segunda copia comenzará desde i=2, generando solo una copia.

Puede continuar este razonamiento y comprender el resto del diagrama.

Como han señalado otros, if (pid < 0) es solo una comprobación para ver si hay errores y no modifica la lógica del código.

2

fork return -1 en error, y 0 o positivo else, por lo que la línea if (pid < 0) break; dice "si hubo error, salga del ciclo".

Suponiendo que no hay error, es algo así como:

Al principio, i=0, y usted tiene un solo proceso. llamémoslo p0.

En la línea fork();, p0 crea otro proceso. llamémoslo p1.

En todos ellos, tenemos i++ (entonces ahora i es 1), y estamos iterando nuevamente en el ciclo.

p0 y p1, por separado, tienen un comando fork();, por lo que cada uno de ellos crea otro proceso. llamemos a los nuevos procesos p2 y p3.

Ahora, en cada proceso, tenemos i++, que establece i en 2, y ejecutamos el ciclo nuevamente.

Cada uno de los 4 procesos que tenemos, ejecuta la línea fork();, y crea un nuevo proceso. así que ahora también tenemos p4, p5, p6, p7.

Cada proceso aumenta su i a 3, y luego, como la condición de bucle ahora es falsa, el ciclo finalmente termina.

Ahora, el proceso 8 llega (por separado) a la línea siguiente.

(De hecho, cada iteración el doble del número de procesos, por lo que si cambiar el 3 a, por ejemplo, 15, tendrá 2^15 procesos al final.)

Cuestiones relacionadas