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).vfork()
- crea un nuovo processo figlio, che è una copia "veloce" del processo genitore. In contrasto con la chiamata di sistemafork()
, 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 classicofork()
! 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 difork()
per il modello "fork-and-exec". Può essere eseguito 4-5 volte più velocemente delfork()
, perché diversamente dafork()
(anche tenendo a mente COW), implementazione divfork()
la chiamata di sistema non include la creazione di un nuovo spazio di indirizzi (l'allocazione e l'impostazione di nuove directory di pagine).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 dipthread_create()
e tutta la famiglia delfork()
chiamate di sistema.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 confork()
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 unfork()
è stato seguito daexec()
, 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", quindifork()
+exec()
è efficiente quantovfork()
+exec()
. -
clone()
è la chiamata di sistema usata dafork()
. 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 difork()
, pensato per essere usato quandoexecve()
viene chiamato subito dopofork()
. Si è rivelato funzionare bene nei sistemi non MMU (dovefork()
non può funzionare in modo efficiente) e quandofork()
ing processi con un enorme footprint di memoria per eseguire qualche piccolo programma (si pensi aRuntime.exec()
di Java ). POSIX ha standardizzato ilposix_spawn()
per sostituire questi ultimi due usi più moderni divfork()
.posix_spawn()
fa l'equivalente di unfork()/execve()
, e permette anche un po' di giocoleria nel mezzo. Dovrebbe sostituirefork()/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 dafork()
apthread_create()
. Dà molto controllo. Ispirato arfork()
.rfork()
è una chiamata specifica di Plan-9. Dovrebbe essere una chiamata generica, che consente diversi gradi di condivisione, tra processi completi e thread.