fork()
- crea un nuevo proceso hijo, que es una copia completa del proceso padre. Los procesos hijo y padre utilizan diferentes espacios de direcciones virtuales, que inicialmente se llenan con las mismas páginas de memoria. Luego, a medida que se ejecutan ambos procesos, los espacios de direcciones virtuales comienzan a diferir cada vez más, porque el sistema operativo realiza una copia diferida de las páginas de memoria que están siendo escritas por cualquiera de estos dos procesos y asigna copias independientes de las páginas modificadas de memoria para cada proceso. Esta técnica se llama Copy-On-Write (COW).vfork()
- crea un nuevo proceso secundario, que es una copia "rápida" del proceso principal. En contraste con la llamada al sistemafork()
, los procesos hijo y padre comparten el mismo espacio de direcciones virtuales. ¡NOTA! Usando el mismo espacio de direcciones virtuales, tanto el padre como el hijo usan la misma pila, el puntero de pila y el puntero de instrucción, como en el caso del clásicofork()
! Para evitar interferencias no deseadas entre padre e hijo, que usan la misma pila, la ejecución del proceso padre se congela hasta que el hijo llame aexec()
(crear un nuevo espacio de direcciones virtuales y una transición a una pila diferente) o_exit()
(Terminación de la ejecución del proceso).vfork()
es la optimización defork()
para el modelo "fork-and-exec". Se puede realizar 4-5 veces más rápido que elfork()
, porque a diferencia delfork()
(incluso con COW en mente), implementación devfork()
La llamada al sistema no incluye la creación de un nuevo espacio de direcciones (la asignación y configuración de nuevos directorios de páginas).clone()
- crea un nuevo proceso hijo. Varios parámetros de esta llamada al sistema especifican qué partes del proceso principal se deben copiar en el proceso secundario y qué partes se compartirán entre ellos. Como resultado, esta llamada al sistema se puede utilizar para crear todo tipo de entidades de ejecución, comenzando por hilos y terminando por procesos completamente independientes. De hecho,clone()
La llamada al sistema es la base que se utiliza para la implementación depthread_create()
y toda la familia delfork()
llamadas al sistema.exec()
- restablece toda la memoria del proceso, carga y analiza el binario ejecutable especificado, configura una nueva pila y pasa el control al punto de entrada del ejecutable cargado. Esta llamada al sistema nunca devuelve el control a la persona que llama y sirve para cargar un nuevo programa al proceso ya existente. Esta llamada al sistema confork()
La llamada del sistema forma un modelo clásico de gestión de procesos de UNIX llamado "fork-and-exec".
-
vfork()
es una optimización obsoleta. Antes de una buena gestión de la memoria,fork()
hizo una copia completa de la memoria de los padres, por lo que era bastante caro. ya que en muchos casos unfork()
fue seguido porexec()
, que descarta el mapa de memoria actual y crea uno nuevo, era un gasto innecesario. Hoy en día,fork()
no copia la memoria; simplemente está configurado como "copiar al escribir", por lo quefork()
+exec()
es tan eficiente comovfork()
+exec()
. -
clone()
es la llamada al sistema utilizada porfork()
. con algunos parámetros crea un nuevo proceso, con otros crea un hilo. la diferencia entre ellos es qué estructuras de datos (espacio de memoria, estado del procesador, pila, PID, archivos abiertos, etc.) se comparten o no.
execve()
reemplaza la imagen ejecutable actual con otra cargada desde un archivo ejecutable.fork()
crea un proceso hijo.vfork()
es una versión histórica optimizada defork()
, destinado a ser utilizado cuandoexecve()
se llama directamente después defork()
. Resultó funcionar bien en sistemas que no son MMU (dondefork()
no puede funcionar de manera eficiente) y cuandofork()
ing procesos con una enorme huella de memoria para ejecutar algún programa pequeño (piense enRuntime.exec()
de Java ). POSIX ha estandarizado elposix_spawn()
para reemplazar estos dos últimos usos más modernos devfork()
.posix_spawn()
hace el equivalente de unfork()/execve()
, y también permite algunos malabarismos con fd en el medio. Se supone que debe reemplazarfork()/execve()
, principalmente para plataformas que no son MMU.pthread_create()
crea un hilo nuevo.clone()
es una llamada específica de Linux, que se puede usar para implementar cualquier cosa desdefork()
apthread_create()
. Da mucho control. Inspirado enrfork()
.rfork()
es una llamada específica de Plan-9. Se supone que es una llamada genérica, que permite varios grados de uso compartido, entre procesos completos y subprocesos.