GNU/Linux >> Linux Esercitazione >  >> Linux

La differenza tra fork(), vfork(), exec() e clone()

  1. fork() - crea un nuovo processo figlio, che è una copia completa del processo padre. I processi figlio e padre utilizzano diversi spazi di indirizzi virtuali, inizialmente popolati dalle stesse pagine di memoria. Quindi, man mano che entrambi i processi vengono eseguiti, gli spazi degli indirizzi virtuali iniziano a differire sempre di più, perché il sistema operativo esegue una copia pigra delle pagine di memoria che vengono scritte da uno di questi due processi e assegna copie indipendenti delle pagine modificate di memoria per ogni processo. Questa tecnica è chiamata Copy-On-Write (COW).
  2. vfork() - crea un nuovo processo figlio, che è una copia "veloce" del processo genitore. In contrasto con la chiamata di sistema fork() , i processi figlio e padre condividono lo stesso spazio di indirizzi virtuali. NOTA! Utilizzando lo stesso spazio di indirizzi virtuali, sia il genitore che il figlio usano lo stesso stack, il puntatore allo stack e il puntatore all'istruzione, come nel caso del classico fork() ! Per evitare interferenze indesiderate tra genitore e figlio, che utilizzano lo stesso stack, l'esecuzione del processo genitore viene bloccata finché il figlio non chiamerà exec() (crea un nuovo spazio di indirizzi virtuale e una transizione a uno stack diverso) o _exit() (interruzione dell'esecuzione del processo). vfork() è l'ottimizzazione di fork() per il modello "fork-and-exec". Può essere eseguito 4-5 volte più velocemente del fork() , perché diversamente da fork() (anche tenendo a mente COW), implementazione di vfork() la chiamata di sistema non include la creazione di un nuovo spazio di indirizzi (l'allocazione e l'impostazione di nuove directory di pagine).
  3. clone() - crea un nuovo processo figlio. Vari parametri di questa chiamata di sistema specificano quali parti del processo padre devono essere copiate nel processo figlio e quali parti saranno condivise tra loro. Di conseguenza, questa chiamata di sistema può essere utilizzata per creare tutti i tipi di entità di esecuzione, partendo dai thread e terminando con processi completamente indipendenti. Infatti, clone() la chiamata di sistema è la base utilizzata per l'implementazione di pthread_create() e tutta la famiglia del fork() chiamate di sistema.
  4. exec() - reimposta tutta la memoria del processo, carica e analizza il binario eseguibile specificato, imposta un nuovo stack e passa il controllo al punto di ingresso dell'eseguibile caricato. Questa chiamata di sistema non restituisce mai il controllo al chiamante e serve per caricare un nuovo programma nel processo già esistente. Questa chiamata di sistema con fork() system call insieme formano un classico modello di gestione dei processi UNIX chiamato "fork-and-exec".

  • vfork() è un'ottimizzazione obsoleta. Prima di una buona gestione della memoria, fork() ha fatto una copia completa della memoria del genitore, quindi era piuttosto costoso. poiché in molti casi un fork() è stato seguito da exec() , che scarta l'attuale mappa di memoria e ne crea una nuova, è stata una spesa inutile. Al giorno d'oggi, fork() non copia la memoria; è semplicemente impostato come "copy on write", quindi fork() +exec() è efficiente quanto vfork() +exec() .

  • clone() è la chiamata di sistema usata da fork() . con alcuni parametri crea un nuovo processo, con altri crea un thread. la differenza tra loro è solo quali strutture di dati (spazio di memoria, stato del processore, stack, PID, file aperti, ecc.) sono condivise o meno.


  • execve() sostituisce l'immagine eseguibile corrente con un'altra caricata da un file eseguibile.
  • fork() crea un processo figlio.
  • vfork() è una versione storica ottimizzata di fork() , pensato per essere usato quando execve() viene chiamato subito dopo fork() . Si è rivelato funzionare bene nei sistemi non MMU (dove fork() non può funzionare in modo efficiente) e quando fork() ing processi con un enorme footprint di memoria per eseguire qualche piccolo programma (si pensi a Runtime.exec() di Java ). POSIX ha standardizzato il posix_spawn() per sostituire questi ultimi due usi più moderni di vfork() .
  • posix_spawn() fa l'equivalente di un fork()/execve() , e permette anche un po' di giocoleria nel mezzo. Dovrebbe sostituire fork()/execve() , principalmente per piattaforme non MMU.
  • pthread_create() crea un nuovo thread.
  • clone() è una chiamata specifica di Linux, che può essere usata per implementare qualsiasi cosa da fork() a pthread_create() . Dà molto controllo. Ispirato a rfork() .
  • rfork() è una chiamata specifica di Plan-9. Dovrebbe essere una chiamata generica, che consente diversi gradi di condivisione, tra processi completi e thread.

Linux
  1. La differenza tra [[ $a ==Z* ]] e [ $a ==Z* ]?

  2. La differenza tra Kill, Pkill e Killall?

  3. La differenza tra .exrc e .vimrc?

  4. La differenza tra '$ . Foo' E '$ ./foo'??

  5. La differenza tra ~/.profile e ~/.bash_profile?

Qual è la differenza tra InnoDB e MyISAM?

Qual è la differenza tra Linux e Unix?

Che cos'è un hypervisor? Qual è la differenza tra il tipo 1 e 2?

Qual è la differenza tra curl e Wget?

Qual è la differenza tra ls e l?

Qual è la differenza tra kernel preventivo non preventivo, preventivo e selettivo?