GNU/Linux >> Tutoriales Linux >  >> Linux

La diferencia entre fork(), vfork(), exec() y clone()

  1. 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).
  2. vfork() - crea un nuevo proceso secundario, que es una copia "rápida" del proceso principal. En contraste con la llamada al sistema fork() , 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ásico fork() ! 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 a exec() (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 de fork() para el modelo "fork-and-exec". Se puede realizar 4-5 veces más rápido que el fork() , porque a diferencia del fork() (incluso con COW en mente), implementación de vfork() 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).
  3. 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 de pthread_create() y toda la familia del fork() llamadas al sistema.
  4. 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 con fork() 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 un fork() fue seguido por exec() , 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 que fork() +exec() es tan eficiente como vfork() +exec() .

  • clone() es la llamada al sistema utilizada por fork() . 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 de fork() , destinado a ser utilizado cuando execve() se llama directamente después de fork() . Resultó funcionar bien en sistemas que no son MMU (donde fork() no puede funcionar de manera eficiente) y cuando fork() ing procesos con una enorme huella de memoria para ejecutar algún programa pequeño (piense en Runtime.exec() de Java ). POSIX ha estandarizado el posix_spawn() para reemplazar estos dos últimos usos más modernos de vfork() .
  • posix_spawn() hace el equivalente de un fork()/execve() , y también permite algunos malabarismos con fd en el medio. Se supone que debe reemplazar fork()/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 desde fork() a pthread_create() . Da mucho control. Inspirado en rfork() .
  • 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.

Linux
  1. La diferencia entre '$ . Foo' y '$ ./foo'??

  2. ¿La diferencia entre 'env' y 'printenv'?

  3. ¿La diferencia entre ~/.profile y ~/.bash_profile?

  4. ¿La diferencia entre Nss y Pam?

  5. Diferencia entre el montón de Java y el montón de C nativo

¿Cuál es la diferencia entre Linux y Unix?

¿La diferencia entre .exrc y .vimrc?

¿Qué es un Hipervisor? ¿Cuál es la diferencia entre el tipo 1 y 2?

¿Cuál es la diferencia entre curl y Wget?

¿Cuál es la diferencia entre Kernel no preventivo, preventivo y selectivo?

¿Cuál es la diferencia entre unlink y rm?