Las páginas de manual suelen ser documentos de referencia concisos. Wikipedia es un mejor lugar para buscar explicaciones conceptuales.
Fork duplica un proceso: crea un proceso hijo que es casi idéntico al proceso padre (la diferencia más obvia es que el nuevo proceso tiene una ID de proceso diferente). En particular, fork (conceptualmente) debe copiar toda la memoria del proceso padre.
Como esto es bastante costoso, vfork fue inventado para manejar un caso especial común donde la copia no es necesaria. A menudo, lo primero que hace el proceso secundario es cargar una nueva imagen del programa, así que esto es lo que sucede:
if (fork()) {
# parent process …
} else {
# child process (with a new copy of the process memory)
execve("/bin/sh", …); # discard the process memory
}
La execve
llamada carga un nuevo programa ejecutable, y esto reemplaza el código del proceso y la memoria de datos por el código del nuevo ejecutable y una nueva memoria de datos. Así que toda la copia de memoria creada por fork
fue para nada.
Así vfork
se inventó la llamada. No hace una copia de la memoria. Por vfork
lo tanto, es barato, pero es difícil de usar ya que debe asegurarse de no acceder a ninguno de los espacios de pila o montón del proceso en el proceso secundario. Tenga en cuenta que incluso la lectura podría ser un problema, porque el proceso principal sigue ejecutándose. Por ejemplo, este código está roto (puede o no funcionar dependiendo de si el niño o el padre obtienen un intervalo de tiempo primero):
if (vfork()) {
# parent process
cmd = NULL; # modify the only copy of cmd
} else {
# child process
execve("/bin/sh", "sh", "-c", cmd, (char*)NULL); # read the only copy of cmd
}
Desde la invención de vfork, se han inventado mejores optimizaciones. La mayoría de los sistemas modernos, incluido Linux, utilizan una forma de copia en escritura , donde las páginas en la memoria del proceso no se copian en el momento de la fork
llamada, sino más tarde cuando el padre o hijo escribe por primera vez en la página. Es decir, cada página comienza como compartida y permanece compartida hasta que cualquiera de los procesos escribe en esa página; El proceso que escribe obtiene una nueva página física (con la misma dirección virtual). Copy-on-write hace que vfork sea inútil en su mayoría, ya fork
que no hará ninguna copia en los casos en vfork
que sería utilizable.
Linux retiene vfork. La fork
llamada al sistema aún debe hacer una copia de la tabla de memoria virtual del proceso, incluso si no copia la memoria real; vfork
Ni siquiera necesita hacer esto. La mejora del rendimiento es insignificante en la mayoría de las aplicaciones.
fork
necesita crear una asignación de memoria virtual separada para que las copias posteriores de copia en escritura solo afecten a uno de los dos procesos.Los
fork()
yvfork()
syscalls son diferentes.La
fork()
llamada al sistema genera dos procesos idénticos con memoria separada. Lavfork()
llamada al sistema genera dos procesos que comparten la misma memoria.Con
vfork()
el padre esperará a que el hijo termine. El padre hereda de las variables que comparte el programa. Entonces, después de que se llamó al niño, todas las variables modificadas dentro del niño aún se modificarán dentro del padre.Para más información haga clic aquí.
fuente