Differenza tra fork () e vfork ()

Autore: Laura McKinney
Data Della Creazione: 2 Aprile 2021
Data Di Aggiornamento: 5 Maggio 2024
Anonim
What’s the difference between fork() and vfork()? (2 Solutions!!)
Video: What’s the difference between fork() and vfork()? (2 Solutions!!)

Contenuto


Entrambi forchetta() e vfork () sono i chiamate di sistema che crea un nuovo processo identico al processo che ha invocato fork () o vfork (). utilizzando forchetta() consente l'esecuzione del processo genitore e figlio contemporaneamente. L'altro modo, vfork () sospende l'esecuzione del processo parent fino a quando il processo child non ne completa l'esecuzione. La differenza principale tra la chiamata di sistema fork () e vfork () è che il processo figlio creato usando fork ha uno spazio di indirizzi separato come quello del processo parent. D'altra parte, il processo figlio creato usando vfork deve condividere lo spazio degli indirizzi del suo processo genitore.

Troviamo alcune differenze tra fork () e vfork () con l'aiuto della tabella di confronto mostrata di seguito.

  1. Tabella di comparazione
  2. Definizione
  3. Differenze chiave
  4. Conclusione

Tabella di comparazione

Base per il confrontoforchetta()vfork ()
Di baseIl processo figlio e il processo padre hanno spazi di indirizzi separati.Il processo figlio e il processo padre condividono lo stesso spazio indirizzo.
EsecuzioneIl processo padre e figlio vengono eseguiti contemporaneamente.Il processo padre rimane sospeso fino a quando il processo figlio non completa la sua esecuzione.
ModificaSe il processo figlio modifica qualsiasi pagina nello spazio degli indirizzi, è invisibile al processo principale poiché lo spazio degli indirizzi è separato.Se il processo figlio modifica qualsiasi pagina nello spazio degli indirizzi, è visibile al processo principale in quanto condividono lo stesso spazio degli indirizzi.
Copy-on-writefork () usa il metodo copy-on-write come alternativa in cui padre e figlio condividono le stesse pagine fino a quando una di esse non modifica la pagina condivisa.vfork () non usa copy-on-write.


Definizione di fork ()

Il forchetta() è una chiamata di sistema utilizzata per creare un nuovo processo. Il nuovo processo creato dalla chiamata fork () è il processo figlio, del processo che ha invocato la chiamata di sistema fork (). Il codice del processo figlio è identico al codice del processo principale. Dopo la creazione del processo figlio, entrambi i processi padre e figlio iniziano la loro esecuzione dall'istruzione successiva dopo fork () ed entrambi i processi vengono eseguiti contemporaneamente.

Il processo padre e il processo figlio hanno spazio indirizzo separato. Quindi, quando uno qualsiasi dei processi modifica qualsiasi istruzione o variabile nel codice. Non si rifletterebbe in altri codici di processo. Supponiamo che se il processo figlio modifica il codice non influirebbe sul processo padre.

Alcuni processi figlio dopo la loro creazione chiamano immediatamente exec (). La chiamata di sistema exec () sostituisce il processo con il programma specificato nel suo parametro. Quindi lo spazio degli indirizzi separato del processo figlio non è di alcuna utilità. L'unica alternativa qui è copia su scrittura.


Il copy-on-write consentire al genitore e al figlio di condividere lo stesso spazio degli indirizzi. Se uno qualsiasi dei processi scrive sulle pagine nello spazio degli indirizzi, la copia dello spazio degli indirizzi viene creata per consentire a entrambi i processi di funzionare in modo indipendente.

Definizione di vfork ()

La versione modificata di fork () è vfork (). Il vfork () la chiamata di sistema viene anche utilizzata per creare un nuovo processo. Simile al fork (), anche qui il nuovo processo creato è il processo figlio, del processo che ha invocato vfork (). Anche il codice di processo figlio è identico al codice di processo principale. Qui, il processo figlio sospende l'esecuzione del processo padre fino a quando non completa l'esecuzione poiché entrambi i processi condividono lo stesso spazio indirizzo da utilizzare.

Poiché il processo figlio e genitore condivide il stesso indirizzo. Se uno qualsiasi dei processi modifica il codice, è visibile all'altro processo che condivide le stesse pagine. Supponiamo che il processo genitore modifichi il codice; si rifletterà nel codice del processo figlio.

Poiché l'utilizzo di vfork () non crea spazi di indirizzi separati per i processi figlio e padre. Quindi deve essere implementato dove chiama il processo figlio exec () subito dopo la sua creazione. Quindi, non ci sarà spreco di spazio degli indirizzi, ed è il efficiente modo per creare un processo. vfork non usa copy-on-write.

  1. La differenza principale tra fork e vfork è che il processo figlio creato da forchetta ha un spazio di memoria separato dal processo genitore. Tuttavia, il processo figlio creato da vfork la chiamata di sistema condivide il stesso indirizzo del suo processo genitore.
  2. Il processo figlio creato utilizzando fork eseguire contemporaneamente con il processo genitore. D'altra parte, il processo figlio creato usando vfork sospendere l'esecuzione del processo genitore fino al completamento della sua esecuzione.
  3. Poiché lo spazio di memoria del processo padre e figlio è una modifica separata effettuata da uno qualsiasi dei processi non influisce sulle pagine degli altri. Tuttavia, poiché il processo padre e figlio condividono la stessa modifica dell'indirizzo di memoria effettuata da qualsiasi processo si riflette nello spazio degli indirizzi.
  4. La fork di sistema () utilizza copy-on-write in alternativa, che consente ai processi figlio e genitore di condividere lo stesso spazio di indirizzi fino a quando uno di essi non modifica le pagine. D'altra parte, il vfork non usa il copy-on-write.

Conclusione:

La chiamata di sistema vfork () deve essere implementata quando il processo figlio chiama exec () immediatamente dopo la sua creazione usando fork (). Come spazio di indirizzi separato per il processo figlio e genitore non sarà di alcuna utilità qui.