Raccomandato, 2024

Scelta Del Redattore

Differenza tra fork () e vfork ()

Sia fork () che vfork () sono le chiamate di sistema che creano un nuovo processo identico al processo che ha invocato fork () o vfork (). L'uso di fork () consente l'esecuzione simultanea del processo genitore e figlio. L'altro modo, vfork () sospende l'esecuzione del processo genitore finché il processo figlio non completa l'esecuzione. La differenza principale tra la chiamata di sistema fork () e vfork () è che il processo figlio creato usando fork ha uno spazio indirizzo separato come quello del processo padre. D'altra parte, il processo figlio creato usando vfork deve condividere lo spazio degli indirizzi del suo processo genitore.

Cerchiamo di trovare alcune differenze tra fork () e vfork () con l'aiuto del grafico di confronto mostrato di seguito.

Grafico comparativo

Base per il confrontoforchetta()vfork ()
Di baseIl processo figlio e il processo principale hanno spazi di indirizzi separati.Processo figlio e processo genitore condivide lo stesso spazio indirizzo.
EsecuzioneI processi padre e figlio vengono eseguiti simultaneamente.Il processo principale rimane sospeso fino a quando il processo figlio non completa l'esecuzione.
ModificaSe il processo figlio modifica qualsiasi pagina nello spazio degli indirizzi, è invisibile al processo padre in quanto lo spazio degli indirizzi è separato.Se il processo figlio altera qualsiasi pagina nello spazio degli indirizzi, è visibile al processo genitore mentre condivide lo stesso spazio indirizzo.
Copy-on-writefork () usa copy-on-write come alternativa in cui il genitore e il figlio condividono le stesse pagine finché nessuno di essi modifica la pagina condivisa.vfork () non usa copy-on-write.

Definizione di fork ()

Fork () è una chiamata di sistema utilizzata per creare un nuovo processo . Il nuovo processo creato dalla chiamata a fork () è il processo figlio, del processo che ha richiamato la chiamata di sistema fork (). Il codice del processo figlio è identico al codice del suo processo genitore. Dopo la creazione del processo figlio, entrambi i processi, ad esempio genitore e figlio, iniziano la loro esecuzione dalla successiva istruzione dopo fork () ed entrambi i processi vengono eseguiti simultaneamente .

Il processo padre e il processo figlio hanno uno 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 il processo figlio modifichi il codice che non influenzerebbe il processo genitore.

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 di indirizzamento separato del processo figlio non è utile. L'unica alternativa qui è copy-on-write.

La copia su scrittura consente al processo padre e figlio di condividere lo stesso spazio indirizzo. Se uno qualsiasi dei processi scrive sulle pagine nello spazio indirizzo, la copia dello spazio indirizzo viene creata per consentire a entrambi i processi di funzionare in modo indipendente.

Definizione di vfork ()

La versione modificata di fork () è vfork (). La chiamata di sistema vfork () viene anche utilizzata per creare un nuovo processo. Simile a 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 genitore. Qui, il processo figlio sospende l'esecuzione del processo genitore fino al completamento della sua esecuzione in quanto entrambi i processi condividono lo stesso spazio di indirizzi da utilizzare.

Poiché il processo figlio e genitore condivide lo stesso spazio di indirizzamento . 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; rifletterà nel codice del processo figlio.

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

Differenze chiave tra fork () e vfork ()

  1. La differenza principale tra fork e vfork è che il processo figlio creato dalla fork ha uno spazio di memoria separato dal processo padre. Tuttavia, il processo figlio creato dalla chiamata di sistema vfork condivide lo stesso spazio di indirizzamento del processo padre.
  2. Il processo figlio creato utilizzando fork esegue simultaneamente con il processo padre. D'altra parte, processo figlio creato usando vfork sospende l'esecuzione del processo genitore fino al completamento della sua esecuzione.
  3. Poiché lo spazio di memoria del processo genitore e figlio è una modifica separata eseguita da uno qualsiasi dei processi, non influisce sulle pagine degli altri. Tuttavia, poiché il processo genitore e figlio condivide la stessa modifica dell'indirizzo di memoria eseguita da qualsiasi processo, si riflette nello spazio degli indirizzi.
  4. Il fork di chiamata di sistema () utilizza la copia su scrittura come alternativa, che consente ai processi figlio e padre di condividere lo stesso spazio di indirizzi fino a quando uno di essi non modifica le pagine. D'altra parte, il vfork non usa 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 (). In questo caso lo spazio di indirizzi separato per il processo figlio e genitore sarà inutile.

Top