¿Qué sucede en los niveles inferiores después de una llamada al sistema fork?

StackOverflow https://stackoverflow.com/questions/2205224

  •  18-09-2019
  •  | 
  •  

Pregunta

Sé lo que hace fork() en el nivel superior.Lo que me gustaría saber es esto...

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

  2. ¿En qué punto de ejecución la bifurcación devuelve 2 valores?

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

¿Fue útil?

Solución

No es tan difícil, ¿verdad? La mitad del núcleo de la llamada al sistema fork() puede distinguir la diferencia entre los dos procesos a través del Bloque de control de procesos como mencionaste, pero ni siquiera necesitas hacerlo.Entonces el pseudocódigo se ve así:

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 lo que usted describe: crea un nuevo contexto de proceso, copia todos los contextos de subprocesos asociados, copia todas las páginas y asignaciones de archivos, y el nuevo proceso se coloca en la lista "listo para ejecutar".

Creo que la parte que te confunde es que cuando estos procesos se reanudan (es decir,cuando el padre regresa de kernel_do_fork y el hijo está programado por primera vez), comienza en el medio de la función (es decir,ejecutando ese primer 'si').Se trata de un exacto copiar: ambos procesos ejecutarán la segunda mitad de la función.

Otros consejos

El valor devuelto a cada proceso es diferente. El padre / get hilo original el PID del proceso hijo y el proceso hijo de get 0.

El núcleo de Linux en x86 logra cambiando el valor en el registro EAX, ya que copia el hilo actual en el proceso principal.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top