Как запустить новый процесс с другой программой в Unix? - PullRequest
0 голосов
/ 25 сентября 2011

Я слышал, что Unix fork будет копировать текущий процесс.Означает ли это, что та же самая программа и состояние будут порождены в новом дочернем процессе?Я не могу понять, почему это так работает.Потому что это выглядит неэффективно.

  1. Что копируется?
  2. И почему это так работает?
  3. Нет ли другого способа порождать новый дочерний процесс?(или отдельный процесс)

Ответы [ 5 ]

3 голосов
/ 25 сентября 2011

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

Существуют ли другиеспособы сделать дочерние процессы?Конечно, другие операционные системы делают вещи по-другому.Способ UNIX на самом деле является очень эффективным способом сделать так, чтобы дочерний процесс мог наследовать дескрипторы открытых файлов, переменные среды и другую системную информацию от своего родителя: он фактически приводит к меньшей работе, а не к большей!

2 голосов
/ 25 сентября 2011

fork очень эффективен в современных операционных системах.Он копирует только требуемые страницы с помощью Копировать при записи или аналогичных методов.

В разных операционных системах существуют разные способы запуска других процессов.В Linux есть системный вызов clonefork основан на этом), который дает большой контроль над тем, что именно новый процесс наследует от своего родителя.

Почему работаеттаким образом, я не знаю.Он эффективен, широко распространен и достаточно прост в использовании и понимании (как только вы прочитаете справочные страницы и посмотрите на примеры).

1 голос
/ 25 сентября 2011

Означает ли это, что точно такая же программа и состояние будут порождаться в новом дочернем процессе?

Не совсем то же самое состояние. Существует небольшая разница: возвращаемое значение разветвления будет отличаться в зависимости от того, родительский или дочерний процесс. Конечно, пиджи тоже будут отличаться.

Кроме того, запуск нового процесса не обязательно должен выполняться с помощью fork. posix_spawn был стандартизирован как альтернатива, когда fork оказывается слишком сложным для реализации.

http://pubs.opengroup.org/onlinepubs/009695399/functions/posix_spawn.html

1 голос
/ 25 сентября 2011

при вызове fork () подумайте о клонировании (у вас есть изображение одного, но вы ждете, что они одинаковые - какой является первым, а какой - вторым / клонированным?), Под основным становится дочерний поток нить (родитель / ребенок). Разветвление - это системный вызов, но накладные расходы минимальны, если вы не последуете вызову exec. Таким образом, разветвление / освобождение действительно стоит вам много в Unix.

fork: дочерний процесс принимает атрибуты родительского элемента, поэтому в одном и том же пространстве памяти есть две отдельные секции исполняемого кода (один родительский и один дочерний). Чтобы разделить два последующих действия вызовом 'exec', теперь секция дочернего кода становится отдельным исполняемым процессом и имеет идентификатор родителя от своего родительского процесса. Если вам нужно было использовать только fork (), то вам придется управлять отдельными разделами кода: кто родитель, кто ребенок.

Вызов exec - это издержки ядра, а не разветвление.

0 голосов
/ 25 сентября 2011

О, если вы можете объяснить, как процесс init или swapper 'init' создаются в unix, тогда вы понимаете концепции создания процесса unix: fork / exec. Прекрасная вещь!

...