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.