родительский и дочерний процессы имеют одинаковый стек - PullRequest
2 голосов
/ 17 августа 2011

http://www.steve.org.uk/Reference/Unix/faq_2.html

по приведенной выше ссылке, ребенок получает копию стека, памяти и т. Д. От родителя. это правильно?

Ответы [ 3 ]

4 голосов
/ 17 августа 2011

Ваша ссылка верна. Память не разделяется процессами, только потоками в одном и том же процессе (и даже тогда потоки имеют свои собственные стеки).

В современных Unices, однако, задействованные страницы памяти обычно copy-on-write : копия выполняется только в адресном пространстве дочернего процесса, когда этот процесс (или его родитель) изменяет один из эти страницы.

Следовательно, фактический объем памяти дочерних процессов может оставаться довольно низким, даже если их родители занимают много места.

2 голосов
/ 19 августа 2011

Сразу после того, как программа вызывает fork (), вновь созданный дочерний процесс идентичен (кучи, стек и даже файловые дескрипторы).Это фундаментальная часть того, как работает Unix;это то, как программа, запущенная вашей оболочкой, получает возможность записи в тот же терминал, что и оболочка.Программа не знает, в каком xterm она запускается;он просто наследует свои дескрипторы файлов stdin и stdout от своего родительского процесса.

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

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

Насколько работает механизм «копирования», это зависит от системы.Некоторые (более старые) системы реализуют это полное копирование, но большинство (более новых) систем реализуют его как копирование при записи.То есть в точке fork () родительский и дочерний элементы совместно используют одни и те же страницы памяти.Когда родительский или дочерний объект изменяет содержимое памяти, кто бы это ни сделал, он получает личную копию измененной памяти (изменения не передаются совместно);другой процесс сохраняет «старую» копию для себя.Если все, что они делают, это чтение, дополнительная память не используется.

Механизм копирования при записи полностью прозрачен для программы.Подсистема виртуальной памяти делает все это за кадром;даже адреса памяти не меняются.

0 голосов
/ 17 августа 2011

Из статьи, на которую вы ссылаетесь:

Помогает при этом знать, что есть, а что не наследуется ребенком. [...] Обратите внимание, что ребенок получает копии этих вещей, не настоящие :

  • [...]
  • стек
  • [...]

Я немного размышляю об этом, но я думаю, что процессы получают свои собственные элементы памяти; это то, что отличает их от потоков , которые разделяют все эти вещи.

С статья в Википедии о Темах :

Несколько потоков могут существовать в одном процессе и совместно использовать ресурсы, например память, в то время как разные процессы не разделяют эти ресурсы.

...