Почему дочерние процессы Unix наследуют [большинство] атрибутов родительских процессов

553
Lance Pollard

Узнайте о том, как работают процессы Unix, и заметили, что дочерние процессы наследуют большинство атрибутов (включая дескрипторы файлов) от родительского процесса. Я также только что узнал о exec и о том, как он заменяет атрибуты дочернего процесса на совершенно новые (новое пространство памяти и т. Д.), Но сохраняет исходный идентификатор процесса.

Затем я узнаю о средах песочницы в Node.js, в которых он предоставляет вам практически пустой лист, и вы добавляете переменные и «функции» в контекст дочернего процесса.

Что мне интересно, так это то, что существуют различные типы конфигураций для атрибутов, которые получает дочерний процесс, и почему дочерний процесс в Unix «по умолчанию» наследует все родительские атрибуты. Интересно, почему у него не было бы собственного пространства памяти и прочего?

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

Было бы интересно узнать, есть ли способ передать такие «функции конфигурации» при создании дочернего процесса, либо в Unix, либо в любой другой операционной системе. Например, «создать дочерний процесс, используя половину родительского адресного пространства, 1/4 от адресного пространства родного брата 2, 1/8 от адресного пространства родного брата 1, а оставшиеся 1/8 используют мое собственное локальное адресное пространство. Также предоставьте доступ к драйверам устройств a, b и c и в противном случае не разрешать доступ к сети ". Что-то произвольное, когда он в основном настраивает «набор функций» дочернего процесса на мелкий уровень детализации.

Хотите знать, если что-то подобное происходит в Unix или других операционных системах, и если нет, то почему бы и нет. Я не понимаю, почему было принято решение просто иметь эти 2 случая процессов разрешения / регулирования.

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

1
Дочерние процессы получают свое собственное (COW) пространство памяти и разделяют потоки. «Набор функций» дочернего элемента настраивается родительским процессом после `fork ()` и до `exec .. ()`. dsstorefile1 6 лет назад 0
Вы спрашиваете о процессах Unix, о процессах Linux, о процессах FreeBSD ...? Существует огромный разрыв между традиционной Unix-форк / vfork и, например, Linux clone / unshare или FreeBSD rfork. grawity 6 лет назад 1
Проблема с этим вопросом - [к которому относится ответ здесь] (https://superuser.com/a/1351411/167207) - заключается в том, что он предполагает, что «родитель» и «ребенок» просто универсальны в системе и что узел «Дочерний» процесс .js похож на «дочерний» процесс уровня ОС. Это не так. Node.js - это просто язык программирования, который существует в ОС и работает в рамках своей собственной структуры процесса. Элементы ОС - это совершенно другое животное. Кроме того, этот вопрос несколько напоминает «[проблема XY] (https://en.wikipedia.org/wiki/XY_problem)», поэтому я рекомендую оригинальному постеру уточнить, если это необходимо, в чем заключается реальная проблема. JakeGould 6 лет назад 1

1 ответ на вопрос

-1
Mike Robinson

Вы смешиваете здесь яблоки, апельсины и грейпфруты.

  • Например, «node.js» - это язык высокого уровня JavaScript , который не имеет ничего общего с процессами операционной системы. (Весь JavaScript выполняется внутри процесса или потока, предоставляемых его хостом.)

  • «Кольца», или, в более общем смысле, «уровни привилегий ЦП» - это физические характеристики микропроцессорного чипа, используемые для определения того, какие инструкции ЦП разрешено выдавать программе и к каким ресурсам она может получить доступ.

  • Архитектура программного обеспечения Unix / Linux, которая весьма специфична для этих операционных систем, тесно связана с понятием «разветвления», которое выглядит следующим образом:

    if (pid = fork()) { ... you are the parent, and 'pid' is the child's process-id ... } else { ... 'pid' is zero, so you are the child ... } 

Чтобы эта аккуратная идея сработала, большая часть контекста родителя должна быть скопирована на потомка.

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

`exec ()` не удаляет все наследование. В основном он просто заменяет память процесса, но другие ресурсы сохраняются. Например, файловые дескрипторы сохраняются, если у них не установлен флаг `close-on-exec`; это позволяет оболочке выполнять перенаправление ввода / вывода перед выполнением внешней программы. Barmar 6 лет назад 1

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