Рекомендуємо, 2024

Вибір Редакції

Різниця між вилкою () і vfork ()

І fork (), і vfork () є системними викликами, які створюють новий процес, ідентичний процесу, який викликав fork () або vfork (). Використання fork () дозволяє виконувати одночасно батьківський і дочірній процес. З іншого боку, vfork () призупиняє виконання батьківського процесу, поки дочірній процес не завершить його виконання. Основною відмінністю між системним викликом fork () і vfork () є те, що дочірній процес, створений за допомогою fork, має окремий адресний простір, як і батьківського процесу. З іншого боку, дочірній процес, створений за допомогою vfork, повинен розділити адресний простір свого батьківського процесу.

Знайдемо деякі відмінності між fork () і vfork () за допомогою діаграми порівняння, показаної нижче.

Діаграма порівняння

Основа для порівняннявилка ()vfork ()
ОсновнийДитячий процес і батьківський процес мають окремі адресні простори.Дитячий процес і батьківський процес поділяють один і той же простір адрес.
ВиконанняБатьківський і дочірній процес виконуються одночасно.Батьківський процес залишається призупиненим до завершення виконання дочірнього процесу.
МодифікаціяЯкщо дочірній процес змінює будь-яку сторінку в адресному просторі, вона невидима для батьківського процесу, оскільки адресний простір є окремим.Якщо дочірній процес змінює будь-яку сторінку в адресному просторі, вона видно батьківським процесом, оскільки вони мають спільний простір адрес.
Copy-on-writefork () використовує метод copy-on-write в якості альтернативи, коли батько та дочірній файл поділяють одні й ті ж сторінки, поки будь-яка з них не змінює спільну сторінку.vfork () не використовує копіювання.

Визначення вилки ()

Форк () - це системний виклик для створення нового процесу . Новим процесом, створеним викликом fork (), є дочірній процес, процес, який викликав системний виклик fork (). Код дочірнього процесу ідентичний коду батьківського процесу. Після створення дочірнього процесу обидва процеси тобто батьківський і дочірній процес починають виконання з наступного оператора після fork () і обидва процеси виконуються одночасно .

Батьківський процес і дочірній процес мають окремий адресний простір . Отже, коли будь-який з процесів змінює будь-який вираз або змінну в коді. Це не буде відображено в інших кодах процесів. Припустимо, якщо дочірній процес змінює код, це не вплине на батьківський процес.

Деякий дочірній процес після їх створення відразу викликає exec () . Системний виклик exec () замінює процес програмою, вказаною в його параметрі. Тоді окремий адресний простір дочірнього процесу не має сенсу. Однією з альтернатив тут є копіювання на запис.

Копіювання на запис дозволить батьківському і дочірньому процесам обмінюватися одним і тим же адресним простором. Якщо будь-який з процесів записує на сторінках адресного простору, то створюється копія адресного простору для того, щоб процес працював незалежно.

Визначення vfork ()

Модифікована версія fork () - vfork (). Системний виклик vfork () також використовується для створення нового процесу. Подібно до fork (), тут також створюється новий процес - дочірній процес, процес, який викликав vfork (). Код дочірнього процесу також ідентичний коду батьківського процесу. Тут дочірній процес призупиняє виконання батьківського процесу, поки він не завершить його виконання, оскільки обидва процеси мають спільне простір адрес.

Оскільки дочірній і батьківський процес поділяє один і той же простір адрес . Якщо будь-який з процесів модифікує код, він відображається в іншому процесі, який поділяє ті самі сторінки. Припустимо, якщо батьківський процес змінює код; воно відображатиметься в коді дитячого процесу.

Як використання vfork () не створює окремих адресних просторів для дочірніх і батьківських процесів. Отже, він повинен бути реалізований там, де дочірній процес викликає exec () відразу після його створення. Таким чином, не буде втрат адресного простору, і це ефективний спосіб створення процесу. vfork не використовує copy-on-write .

Ключові відмінності між вилкою () і vfork ()

  1. Основною відмінністю між fork і vfork є те, що дочірній процес, створений вилкою, має окремий простір пам'яті від батьківського процесу. Однак дочірній процес, створений системним викликом vfork, використовує той самий адресний простір свого батьківського процесу.
  2. Дочірній процес, створений за допомогою fork, виконується одночасно з батьківським процесом. З іншого боку, дочірній процес, створений за допомогою vfork, призупиняє виконання батьківського процесу до завершення його виконання.
  3. Оскільки простір пам'яті батьківського і дочірнього процесів є окремою модифікацією, виконаною будь-яким з процесів, не впливає на інші сторінки. Однак, оскільки батьківський і дочірній процеси поділяють одну і ту ж модифікацію адреси пам'яті, зроблену будь-яким процесом, він відображається в адресному просторі.
  4. Системний виклик fork () використовує метод copy-on-write в якості альтернативи, який дозволяє дочірньому і батьківському процесу спільно використовувати один і той самий адресний простір, поки будь-який з них не змінює сторінки. З іншого боку, vfork не використовує copy-on-write.

Висновок:

Системний виклик vfork () повинен бути реалізований, коли дочірній процес викликає exec () відразу після його створення за допомогою fork (). Як окремий адресний простір для дочірніх і батьківських процесів тут не буде.

Top