2010-02-05 8 views
6

Sé lo que hace la horquilla() en el nivel superior. Lo que me gustaría saber es esto -¿Qué sucede en los niveles inferiores después de una llamada al sistema fork?

  1. Tan pronto como hay una llamada tenedor, una instrucción de trampa sigue y el control salta a ejecutar el tenedor "controlador". Ahora, ¿cómo este manejador, que crea el proceso hijo, duplicando el proceso principal creando otro espacio de direcciones y bloque de control de procesos, devuelve 2 valores, uno para cada proceso?

  2. ¿En qué punto de ejecución el tenedor devuelve 2 valores?

Para resumir, ¿puede alguien explicar los eventos paso a paso que tienen lugar en el nivel inferior después de una llamada tenedor?

Respuesta

1

No es tan difícil, la mitad del kernel de la syscall de la horquilla puede diferenciar entre los dos procesos a través del Bloque de control del proceso como usted mencionó, pero ni siquiera tiene que hacer eso. Por lo que el pseudocódigo siguiente aspecto:

int fork() 
{ 
    int orig_pid = getpid(); 

    int new_pid = kernel_do_fork();  // Now there's two processes 

    // Remember, orig_pid is the same in both procs 
    if (orig_pid == getpid()) { 
     return new_pid; 
    } 

    // Must be the child 
    return 0; 
} 

Editar: La versión ingenua hace exactamente como usted la describe - se crea un nuevo contexto de proceso, copias de todos los contextos de hilos asociados, copia todas las páginas y asignaciones de archivo , y el nuevo proceso se incluye en la lista "lista para ejecutarse".

Creo que la parte que está confundiendo el es, que cuando estos procesos se reanudan (es decir, cuando el padre regresa de kernel_do_fork, y el niño está prevista para la primera vez), que comienza en el medio de la función (es decir, ejecutar esa primera 'si'). Es una copia exacta - ambos procesos ejecutarán la segunda mitad de la función.

+0

¿podría decirme qué es kernel_do_fork()? ¿No se está llamando a sí mismo recursivamente? –

+0

Gracias por tomarse su tiempo para explicarle a Paul. –

1

El valor devuelto a cada proceso es diferente. El subproceso padre/original obtiene el PID del proceso hijo y el proceso secundario obtiene 0.

El kernel de Linux lo logra en x86 cambiando el valor en el registro eax como copies the current thread en el proceso principal.

Cuestiones relacionadas