La llamada al sistema UNIX para la creación de procesos, fork (), crea un proceso hijo copiando el proceso padre. Tengo entendido que esto casi siempre es seguido por una llamada a exec () para reemplazar el espacio de memoria del proceso secundario (incluido el segmento de texto). Copiar el espacio de memoria de los padres en fork () siempre me pareció un desperdicio (aunque me doy cuenta de que el desperdicio se puede minimizar haciendo que los segmentos de memoria se copien y escriban para que solo se copien los punteros). De todos modos, ¿alguien sabe por qué se requiere este enfoque de duplicación para la creación de procesos?
process
process-management
fork
Ellen Spertus
fuente
fuente
fork(2)
página de manual de Linux dice:Under Linux, fork() is implemented using copy-on-write pages, so the only penalty that it incurs is the time and memory required to duplicate the parent's page tables, and to create a unique task structure for the child.
Me imagino (pero no lo sé con certeza) que este es el caso de otros sabores modernos de Unix.select
estaba roto, pero esa es otra historia).Respuestas:
Es para simplificar la interfaz. La alternativa
fork
yexec
sería algo así como la función CreateProcess de Windows . Observe cuántos parámetrosCreateProcess
tiene, y muchos de ellos son estructuras con aún más parámetros. Esto se debe a que debe pasar todo lo que desee controlar sobre el nuevo procesoCreateProcess
. De hecho,CreateProcess
no tiene suficientes parámetros, por lo que Microsoft tuvo que agregar CreateProcessAsUser y CreateProcessWithLogonW .Con el
fork/exec
modelo, no necesita todos esos parámetros. En cambio, ciertos atributos del proceso se conservan en todoexec
. Esto le permitefork
, luego cambiar los atributos de proceso que desee (usando las mismas funciones que usaría normalmente), y luegoexec
. En Linux,fork
no tiene parámetros, yexecve
solo tiene 3: el programa a ejecutar, la línea de comando para darle y su entorno. (Hay otrasexec
funciones, pero son solo envoltoriosexecve
proporcionados por la biblioteca C para simplificar los casos de uso comunes).Si desea iniciar un proceso con un directorio actualizado diferente:
fork
,chdir
,exec
.Si desea redirigir stdin / stdout:
fork
, cerrar / abrir archivos,exec
.Si quieres usuarios del interruptor:
fork
,setuid
,exec
.Todas estas cosas se pueden combinar según sea necesario. Si a alguien se le ocurre un nuevo tipo de atributo de proceso, no tiene que cambiar
fork
yexec
.Como se mencionó anteriormente, la mayoría de los Unix modernos usan copia en escritura, por lo
fork
que no implica una sobrecarga significativa.fuente
Además de la respuesta de cjm, la especificación Single Unix define una función llamada
vfork()
. Esa función funciona como una bifurcación, excepto que el proceso bifurcado tiene un comportamiento indefinido si hace algo más que intentar llamar a una función familiar ejecutiva o llamar_exit()
.Por lo tanto, prácticamente el único uso con comportamiento definido es:
Entonces, ¿qué hace
vfork
? Es de bajo costofork
. En implementaciones sin copia en escritura, el proceso resultante compartirá espacio de memoria con el proceso original (de ahí el comportamiento indefinido). En implementaciones con copia en escritura,vfork
se permite que sea idénticofork()
, ya que las implementaciones de copia en escritura son rápidas.También existe la
posix_spawn
función opcional (y unaposix_spawnp
función) que puede crear directamente un nuevo proceso. (También está permitido implementarlos con una llamada a la biblioteca usandofork
yexec
, y se proporciona un ejemplo de implementación).fuente