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

Автор: Laura McKinney
Дата создания: 2 Апрель 2021
Дата обновления: 10 Май 2024
Anonim
fork vfork
Видео: fork vfork

Содержание


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

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

  1. Сравнительная таблица
  2. Определение
  3. Ключевые отличия
  4. Заключение

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

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


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

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

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

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


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

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

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

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

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

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

Заключение:

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