Să găsim unele diferențe între fork () și vfork () cu ajutorul graficului de comparație prezentat mai jos.
Diagramă de comparație
Bazele comparației | furculiţă() | vfork () |
---|---|---|
De bază | Procesul copilului și procesul părinte au spații separate de adrese. | Procesul copilului și procesul părinte au același spațiu de adrese. |
Execuţie | Procesul parental și copilul se execută simultan. | Procesul parental rămâne suspendat până când procesul copilului își încheie execuția. |
Modificare | Dacă procesul copil modifică orice pagină din spațiul de adrese, este invizibil procesului părinte ca spațiul de adresă separat. | Dacă procesul copil schimbă orice pagină din spațiul de adrese, acesta este vizibil pentru procesul părinte, deoarece împărtășește același spațiu de adresă. |
Copie pe scriere | fork () folosește copy-on-write ca alternativă în cazul în care părintele și copilul partajează aceleași pagini până când oricare dintre ele modifică pagina partajată. | vfork () nu folosește copy-on-write. |
Definiția fork ()
Furca () este o utilizare a sistemului de apel pentru a crea un nou proces . Noul proces creat de apelul fork () este procesul copil, al procesului care a invocat apelul de sistem fork (). Codul procesului copil este identic cu codul procesului său părinte. După procesul de creare a unui proces copil, procesele de procesare, respectiv procesul parental și copil, pornesc de la următoarea declarație după furcă () și ambele procese se execută simultan .
Procesul părinte și procesul copil au un spațiu de adresă separat . Prin urmare, atunci când oricare dintre procese modifică orice declarație sau variabilă din cod. Nu s-ar reflecta în alte coduri de proces. Să presupunem că dacă procesul copil modifică codul, acesta nu ar afecta procesul părinte.
Unele procese copil după crearea lor cheamă imediat exec () . Apelul de sistem exec () înlocuiește procesul cu programul specificat în parametrul său. Apoi, spațiul de adresă separat al procesului copil este de nici un folos. Singura alternativă aici este copierea pe scriere.
Copy-on-write permite procesului părinte și copilului să partajeze același spațiu de adrese. Dacă oricare dintre procese scrie pe paginile din spațiul de adrese, copia spațiului de adrese este creată pentru a permite procesului să funcționeze independent.
Definiția vfork ()
Versiunea modificată a furcii () este vfork (). Apelul de sistem vfork () este, de asemenea, folosit pentru a crea un nou proces. Similar cu fork (), aici, de asemenea, noul proces creat este procesul copil, al procesului care a invocat vfork (). Codul de proces copil este, de asemenea, identic cu codul procesului părinte. În acest caz, procesul copil suspendă executarea procesului părinte până la finalizarea execuției sale, ambele proces partajând același spațiu de adresă utilizat.
Deoarece procesul copil și părinte împărtășește același spațiu de adrese . Dacă oricare dintre procese modifică codul, acesta este vizibil pentru celălalt proces care împărtășește aceleași pagini. Să presupunem că dacă procesul părinte modifică codul; se va reflecta în codul procesului copilului.
Deoarece utilizarea vfork () nu creează spații de adresă separate pentru procesele copil și părinte. Prin urmare, acesta trebuie implementat în cazul în care procesul copil solicită exec () imediat după crearea acestuia. Deci, nu va exista risipă de spațiu de adrese, și este modul eficient de a crea un proces. vfork nu utilizează copy-on-write .
Diferențele cheie dintre furculiță () și vfork ()
- Diferența principală dintre furcă și vfork este că procesul copil creat de furculiță are un spațiu de memorie separat față de procesul părinte. Cu toate acestea, procesul copil creat de apelul de sistem vfork împarte același spațiu de adresă al procesului părinte.
- Procesul copil creat folosind furculiță execută simultan procesul de bază. Pe de altă parte, procesul copil creat utilizând vfork suspendă executarea procesului părinte până la finalizarea executării acestuia.
- Deoarece spațiul de memorie al procesului părinte și copil este o modificare separată efectuată de oricare dintre procese nu afectează paginile altora. Cu toate acestea, pe măsură ce procesul parinte și copil partajează aceeași modificare a adresei de memorie efectuată de orice proces reflectat în spațiul de adrese.
- Fereastra de apel sistem () utilizează opțiunea copy-on-write ca alternativă, care permite procesului copil și părinte să partajeze același spațiu de adresă până când oricare dintre ele modifică paginile. Pe de altă parte, vfork-ul nu folosește copy-on-write.
Concluzie:
Apelul de sistem vfork () trebuie implementat atunci când procesarea copilului exec () imediat după crearea acestuia folosind fork (). Ca spațiu separat de adrese pentru procesul copilului și părintelui nu va fi de folos aici.