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

Выбор редакции

Разница между fork () и vfork ()

И fork (), и vfork () являются системными вызовами, которые создают новый процесс, идентичный процессу, который вызвал fork () или vfork (). Использование fork () позволяет одновременно выполнять родительский и дочерний процессы. Другой способ, vfork () приостанавливает выполнение родительского процесса, пока дочерний процесс не завершит его выполнение. Основное различие между системным вызовом fork () и vfork () состоит в том, что дочерний процесс, созданный с использованием fork, имеет отдельное адресное пространство, как и у родительского процесса. С другой стороны, дочерний процесс, созданный с помощью vfork, должен совместно использовать адресное пространство своего родительского процесса.

Давайте найдем некоторые различия между fork () и vfork () с помощью сравнительной таблицы, показанной ниже.

Сравнительная таблица

Основа для сравнениявилка ()vfork ()
основнойДочерний процесс и родительский процесс имеют отдельные адресные пространства.Дочерний процесс и родительский процесс используют одно и то же адресное пространство.
выполнениеРодительский и дочерний процессы выполняются одновременно.Родительский процесс остается приостановленным, пока дочерний процесс не завершит свое выполнение.
модификацияЕсли дочерний процесс изменяет какую-либо страницу в адресном пространстве, он невидим для родительского процесса, поскольку адресное пространство разделено.Если дочерний процесс изменяет какую-либо страницу в адресном пространстве, он виден родительскому процессу, поскольку они совместно используют одно и то же адресное пространство.
Копирование при записиВ качестве альтернативы fork () использует копирование при записи, когда родительский и дочерний элементы совместно используют одни и те же страницы, пока одна из них не изменит общую страницу.vfork () не использует копирование при записи.

Определение fork ()

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

Родительский процесс и дочерний процесс имеют отдельное адресное пространство . Следовательно, когда любой из процессов изменяет любое выражение или переменную в коде. Это не будет отражено в других кодах процесса. Давайте предположим, что если дочерний процесс изменяет код, это не повлияет на родительский процесс.

Некоторые дочерние процессы после их создания немедленно вызывают exec () . Системный вызов exec () заменяет процесс программой, указанной в его параметре. Тогда отдельное адресное пространство дочернего процесса бесполезно. Единственная альтернатива здесь - копирование при записи.

Функция копирования при записи позволяет родительскому и дочернему процессам совместно использовать одно и то же адресное пространство. Если какой-либо из процессов пишет на страницах в адресном пространстве, создается копия адресного пространства, чтобы оба процесса работали независимо.

Определение vfork ()

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

Как дочерний, так и родительский процесс совместно используют одно адресное пространство . Если какой-либо процесс изменяет код, он виден другому процессу, использующему те же самые страницы. Давайте предположим, что родительский процесс изменяет код; это отразится на коде дочернего процесса.

При использовании vfork () не создаются отдельные адресные пространства для дочерних и родительских процессов. Следовательно, он должен быть реализован там, где дочерний процесс вызывает exec () сразу после его создания. Таким образом, не будет потери адресного пространства, и это эффективный способ создания процесса. vfork не использует копирование при записи .

Ключевые различия между fork () и vfork ()

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

Заключение:

Системный вызов vfork () должен быть реализован, когда дочерний процесс вызывает exec () сразу после его создания с использованием fork (). Поскольку отдельное адресное пространство для дочернего и родительского процесса здесь будет бесполезно.

Top