Нека да намерим някои разлики между fork () и vfork () с помощта на таблицата за сравнение, показана по-долу.
Сравнителна таблица
Основа за сравнение | вилица () | vfork () |
---|---|---|
Основен | Детето и родителският процес имат отделни адресни пространства. | Детето и родителският процес споделят едно и също адресно пространство. |
Екзекуция | Родителският и детският процес се изпълняват едновременно. | Родителският процес остава прекъснат, докато детето не завърши изпълнението си. |
модификация | Ако детето променя всяка страница в адресното пространство, то е невидимо за родителския процес, тъй като адресното пространство е отделно. | Ако детето променя всяка страница в адресното пространство, то се вижда от родителския процес, тъй като те споделят едно и също адресно пространство. |
Copy-на-пиша | fork () използва copy-on-write като алтернатива, когато родителят и детето споделят едни и същи страници, докато някой от тях не промени общата страница. | vfork () не използва copy-on-write. |
Определение на вилицата ()
Вилицата () е системно повикване, което създава нов процес . Новият процес, създаден от повикването на fork (), е дъщерен процес, на процеса, който извика системното повикване fork (). Кодът на детския процес е идентичен с кода на родителския процес. След създаването на дъщерен процес, и двата процеса т.е. родителски и дъщерен процес започват изпълнението си от следващото изявление след fork () и двата процеса се изпълняват едновременно .
Родителският процес и дъщерният процес имат отделно адресно пространство . Следователно, когато някой от процесите променя всяко изявление или променлива в кода. Това няма да бъде отразено в други кодове на процесите. Нека предположим, ако детето процес променя кода, това няма да повлияе на родителския процес.
Някои дъщерни процеси след тяхното създаване незабавно извикват exec () . Системното повикване exec () замества процеса с програмата, зададена в неговия параметър. Тогава отделното адресно пространство на детския процес не е от полза. Едната алтернатива тук е копие-на-пиша.
Копирането-на-запис позволява на родител и дете процес да споделят едно и също адресно пространство. Ако някой от процесите пише на страниците в адресното пространство, се създава копие на адресното пространство, за да може и двата процеса да работят независимо.
Определение на vfork ()
Модифицираната версия на fork () е vfork (). Системното повикване vfork () също се използва за създаване на нов процес. Подобно на fork (), тук и новия създаден процес е дъщерен процес, на процеса, който извиква vfork (). Кодът на дъщерен процес също е идентичен с кода на родителския процес. Тук дъщерният процес спира изпълнението на родителския процес, докато завърши изпълнението му, тъй като и двата процеса споделят едно и също адресно пространство за използване.
Тъй като детето и родителският процес споделят едно и също адресно пространство . Ако някой от процесите променя кода, той се вижда от другия процес, който споделя едни и същи страници. Нека предположим, ако родителският процес променя кода; тя ще се отрази в кода на детския процес.
При използването на vfork () не се създават отделни адресни пространства за дъщерни и родителски процеси. Следователно, тя трябва да бъде изпълнена, когато детето обработва повиквания exec () веднага след създаването му. Така че няма да има загуба на адресно пространство и това е ефикасен начин за създаване на процес. vfork не използва copy-on-write .
Ключови разлики между вилицата () и vfork ()
- Основната разлика между вилицата и vfork е, че детето, създадено от вилицата, има отделно място от паметта от родителския процес. Детето процес, създаден от системния разговор vfork, споделя същото адресно пространство на родителския процес.
- Детето процесът, създаден с помощта на fork, се изпълнява едновременно с родителския процес. От друга страна, детският процес, създаден с помощта на vfork, спира изпълнението на родителския процес до неговото изпълнение.
- Тъй като мястото на паметта на родителския и детския процес е отделна модификация, направена от някой от процесите, не засяга страниците на другите. Въпреки това, тъй като родителският и детският процес споделят една и съща модификация на адреса на паметта, извършена от всеки процес, се отразява в адресното пространство.
- Вилицата на системните повиквания () използва алтернативно копиране на запис, което позволява на детето и родителския процес да споделят едно и също адресно пространство, докато някой от тях не промени страниците. От друга страна, vfork не използва copy-on-write.
Заключение:
Системният разговор vfork () трябва да бъде реализиран, когато дъщерното процесиране на повикването exec () веднага след неговото създаване е използвало fork (). Като отделно адресно пространство за детски и родителски процес тук няма да има полза.