Qual è la differenza tra fork () e vfork ()?


13

Vorrei capire in dettaglio la differenza tra fork () e vfork (). Non sono riuscito a digerire completamente la pagina man.

Vorrei anche chiarire uno dei miei colleghi commentando " Nell'attuale Linux, non esiste vfork (), anche se lo chiami, chiamerà internamente fork () ."

Risposte:


24

Le pagine man sono di solito documenti di riferimento concisi. Wikipedia è un posto migliore a cui rivolgersi per spiegazioni concettuali.

Fork duplica un processo: crea un processo figlio che è quasi identico al processo padre (la differenza più evidente è che il nuovo processo ha un ID processo diverso). In particolare, fork (concettualmente) deve copiare tutta la memoria del processo genitore.

Poiché questo è piuttosto costoso, vfork è stato inventato per gestire un caso speciale comune in cui la copia non è necessaria. Spesso, la prima cosa che fa il processo figlio è caricare una nuova immagine del programma, quindi questo è ciò che accade:

if (fork()) {
    # parent process …
} else {
    # child process (with a new copy of the process memory)
    execve("/bin/sh", …);  # discard the process memory
}

La execvechiamata carica un nuovo programma eseguibile e questo sostituisce il codice del processo e la memoria dei dati con il codice del nuovo eseguibile e una nuova memoria di dati. Quindi l'intera copia di memoria creata da non forkera per niente.

vforkFu così inventata la chiamata. Non crea una copia della memoria. Pertanto vforkè economico, ma è difficile da usare poiché devi assicurarti di non accedere a nessuno degli stack o heap dello spazio nel processo figlio. Si noti che anche la lettura potrebbe essere un problema, poiché il processo padre continua l'esecuzione. Ad esempio, questo codice non funziona (può funzionare o meno a seconda che il figlio o il genitore ottengano prima una fascia oraria):

if (vfork()) {
    # parent process
    cmd = NULL; # modify the only copy of cmd
} else {
    # child process
    execve("/bin/sh", "sh", "-c", cmd, (char*)NULL);  # read the only copy of cmd
}

Dall'invenzione di Vfork sono state inventate migliori ottimizzazioni. La maggior parte dei sistemi moderni, incluso Linux, utilizza una forma di copia su scrittura , in cui le pagine nella memoria del processo non vengono copiate al momento della forkchiamata, ma in seguito quando il genitore o il figlio scrivono per la prima volta sulla pagina. Cioè, ogni pagina inizia come condivisa e rimane condivisa fino a quando uno dei processi non scrive su quella pagina; il processo che scrive ottiene una nuova pagina fisica (con lo stesso indirizzo virtuale). Copy-on-write rende vfork per lo più inutile, dal momento forkche non ne farà alcuna copia nei casi in cui vforksarebbe utilizzabile.

Linux mantiene vfork. La forkchiamata di sistema deve comunque effettuare una copia della tabella della memoria virtuale del processo, anche se non copia la memoria effettiva; vforknon è nemmeno necessario farlo. Il miglioramento delle prestazioni è trascurabile nella maggior parte delle applicazioni.


1
Grazie per questa brillante risposta. Durante l'esecuzione di fork (), il bambino otterrà comunque un nuovo ID processo e il suo spazio virtuale associato, quindi perché dovrebbe comunque fare una copia della tabella di memoria virtuale del processo? Non sono chiaro in quella parte.
Sen

@Sen: forkdeve creare un mapping di memoria virtuale separato in modo che le successive copie copy-on-write influenzino solo uno dei due processi.
Gilles 'SO- smetti di essere malvagio' il

sei sicuro che il processo genitore sia in esecuzione?
qbolec,

2

Le fork()e vfork()syscalls sono diverse.

La fork()syscall genera due processi identici con memoria separata. La vfork()syscall genera due processi che condividono la stessa memoria.

Con vfork()il genitore attenderà il termine del figlio. Il genitore eredita dalle variabili condivise dal programma. Quindi, dopo che il figlio è stato chiamato, tutte le variabili modificate all'interno del figlio verranno comunque modificate all'interno del padre.

Per maggiori informazioni clicca qui

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.