Каково различие между ветвлением () и vfork ()?

Выполнение ifconfig даст Вам информацию, в которой Вы нуждаетесь.

Активный интерфейс будет иметь inet addr и покажет запись переданных данных, как так:

RX bytes:1930741 (1.8 Mb)  TX bytes:204768 (199.9 Kb)

Можно также использовать ip addr команда и любые неактивные интерфейсы будут определяться как наличие: NO-CARRIER.

13
12.06.2011, 14:52
2 ответа

Страницы справочника являются обычно краткими справочными документами. Википедия является лучшим местом для превращения к для концептуальных объяснений.

Ветвление копирует процесс: это создает дочерний процесс, который почти идентичен родительскому процессу (наиболее заметное отличие - то, что новый процесс имеет другой идентификатор процесса). В частности, ветвление (концептуально) должно скопировать память всего родительского процесса.

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

if (fork()) {
    # parent process …
} else {
    # child process (with a new copy of the process memory)
    execve("/bin/sh", …);  # discard the process memory
}

execve нагрузки по вызовам новая исполняемая программа, и это заменяет код процесса и память данных кодом нового исполняемого файла и новую память данных. Так целая копия памяти, созданная fork было все ни для чего.

Таким образом vfork вызов был изобретен. Это не делает копию памяти. Поэтому vfork является дешевым, но трудно использовать, так как необходимо удостовериться, что Вы не получаете доступ ни к одному стековому пространству процесса или пространству "кучи" в дочернем процессе. Обратите внимание, что даже чтение могло быть проблемой, потому что родительский процесс продолжает выполняться. Например, этот код взломан (он может или не может работать в зависимости от того, получают ли ребенок или родитель интервал времени сначала):

if (vfork()) {
    # parent process
    cmd = NULL; # modify the only copy of cmd
} else {
    # child process
    execve("/bin/sh", "sh", "-c", cmd, (char*)NULL);  # read the only copy of cmd
}

Начиная с изобретения vfork была изобретена лучшая оптимизация. Большинство современных систем, включая Linux, использует форму копии на записи, где страницы в памяти процесса не копируются во время fork звоните, но позже когда родитель или ребенок сначала запишут в страницу. Таким образом, каждая страница начинается, как совместно использовано и остается общей, пока любой процесс не пишет в ту страницу; процесс, который записи получают новую физическую страницу (с тем же виртуальным адресом). Копия на записи делает vfork главным образом бесполезный с тех пор fork не сделает копии в случаях где vfork было бы применимо.

Linux действительно сохраняет vfork. fork системный вызов должен все еще сделать копию таблицы виртуальной памяти процесса, даже если это не копирует фактическую память; vfork не должен даже делать этого. Повышение производительности незначительно в большинстве приложений.

24
27.01.2020, 19:52
  • 1
    Спасибо за этот блестящий ответ.. При выполнении ветвления (), ребенок так или иначе собирается получить новый идентификатор процесса и его связанное Виртуальное пространство, затем почему оно должно все еще сделать копию таблицы виртуальной памяти процесса? Я не ясен в той части. –  Sen 03.01.2011, 10:11
  • 2
    @Sen: fork потребности создать отдельное отображение виртуальной памяти так, чтобы последующие копии копии на записи влияли на только один из двух процессов. отсутствия страницы –  Gilles 'SO- stop being evil' 03.01.2011, 21:10
  • 3
    , является Вами уверенный, что родительский процесс работает? –  qbolec 23.10.2014, 14:48

Системные вызовы fork () и vfork () различаются.

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

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

Для получения дополнительной информации щелкните здесь

2
27.01.2020, 19:52

Теги

Похожие вопросы