Warum untergeordnete Unix-Prozesse [die meisten] Attribute von übergeordneten Prozessen erben

658
Lance Pollard

Erfahren Sie, wie Unix-Prozesse funktionieren, und haben Sie festgestellt, dass untergeordnete Prozesse die meisten Attribute (einschließlich Dateideskriptoren) vom übergeordneten Prozess erben. Ich habe auch gerade etwas über exec gelernt und wie es die untergeordneten Prozessattribute durch völlig neue ersetzt (neuer Speicherplatz usw.), aber die ursprüngliche Prozess-ID beibehalten.

Dann kenne ich Sandbox-Umgebungen in Node.js, in denen Sie eine im Wesentlichen leere Schiefertafel erhalten, und Sie fügen dem Kontext des untergeordneten Prozesses Variablen und "Features" hinzu.

Was ich mich frage, ist, welche unterschiedlichen Konfigurationen für die Attribute eines untergeordneten Prozesses vorhanden sind und warum der untergeordnete Prozess in Unix "Standard" für das Erben aller übergeordneten Attribute ist. Ich frage mich, warum es nicht stattdessen einen eigenen Speicherplatz hat und so weiter.

Ich frage mich auch, ob es in diesen beiden Fällen alternative Konfigurationen für "untergeordnete Prozessattribute" gibt (alle Elternattribute erben oder keine erben). Möglicherweise möchte er die Hälfte des übergeordneten Adressraums erben oder einen bestimmten Adressraum aus einem gleichgeordneten Prozess verwenden oder einige Dateideskriptoren des übergeordneten Elements sowie einige seiner eigenen verwenden. Möglicherweise sagen Sie, es kann auf einige zugreifen Gerätetreiber und andere nicht usw.

Ich würde gerne wissen, ob es eine Möglichkeit gibt, solche "Konfigurationsfunktionen" zu übergeben, wenn ein untergeordneter Prozess erstellt wird, entweder unter Unix oder auf einem anderen Betriebssystem. Beispiel: "Erstellen Sie einen untergeordneten Prozess, verwenden Sie die Hälfte des übergeordneten Adressraums, 1/4 des Adressraums von Geschwister 2, 1/8 des Adressraums von Geschwister 1, und der verbleibende 1/8 verwendet meinen eigenen lokalen Adressraum." a, b und c Gerätetreiber und erlauben sonst keinen Netzwerkzugriff. " Etwas Willkürliches, bei dem es im Grunde genommen darum geht, den "Merkmalssatz" des untergeordneten Prozesses auf eine feine Detailebene zu konfigurieren.

Frage mich, ob so etwas bei Unix oder anderen Betriebssystemen vorkommt und wenn nicht, warum nicht. Ich verstehe nicht, warum die Entscheidung getroffen wurde, diese beiden Fälle von Genehmigungs- / Regulierungsprozessen zu haben.

Es scheint, als ob sich das mit dem Schutzringkonzept irgendwie überschneidet . Sie verhindern, dass Userland-Prozesse (untergeordnete Prozesse) auf bestimmte Funktionen zugreifen. Ich frage mich, warum es auf einem hohen Niveau nicht mehr konfigurierbar ist.

1
Untergeordnete Prozesse erhalten ihren eigenen Speicherplatz (COW) und gemeinsame Threads. Das "Feature-Set" eines untergeordneten Objekts wird vom übergeordneten Prozess nach "fork ()" und vor "exec .. ()" konfiguriert. dsstorefile1 vor 5 Jahren 0
Fragen Sie nach Unix-Prozessen, nach Linux-Prozessen, nach FreeBSD-Prozessen ...? Es gibt eine große Kluft zwischen dem traditionellen Unix Fork / Vfork und zB Linux Clone / Unshare oder FreeBSD Rfork. grawity vor 5 Jahren 1
Das Problem mit dieser Frage - [worauf sich die Antwort hier bezieht "(https://superuser.com/a/1351411/167207) - setzt voraus, dass" Eltern "und" Kind "in einem System nur universell sind und ein Knoten .js "Kind" -Prozess ähnelt einem "Kind" -Prozess auf Betriebssystemebene. Es ist nicht Node.js ist einfach eine Programmiersprache, die auf einem Betriebssystem vorhanden ist und innerhalb seiner eigenen Prozessstruktur arbeitet. OS-Items sind ein ganz anderes Tier. Diese Frage riecht auch ein bisschen wie ein „[XY-Problem] (https://en.wikipedia.org/wiki/XY_problem)“, daher möchte ich das Originalposter dazu ermutigen, zu klären, ob es sich wirklich um das eigentliche Problem handelt. JakeGould vor 5 Jahren 1

1 Antwort auf die Frage

-1
Mike Robinson

Sie mischen hier Äpfel und Orangen und Grapefruits.

  • "node.js" ist beispielsweise die JavaScript -Hochsprache, die nichts mit Betriebssystemprozessen zu tun hat. (Das gesamte JavaScript wird in einem vom Host bereitgestellten Prozess oder Thread ausgeführt.)

  • "Ringe" oder allgemein "CPU-Privilegien" sind physikalische Merkmale des Mikroprozessorchips, mit denen bestimmt wird, welche CPU-Anweisungen ein Programm ausgeben darf und auf welche Ressourcen es zugreifen kann.

  • Die Unix / Linux- Softwarearchitektur, die für diese Betriebssysteme ziemlich spezifisch ist, ist eng mit dem Begriff "forking" verbunden, der folgendermaßen aussieht:

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

Damit diese nette Idee funktioniert, muss der Großteil des Kontextes des übergeordneten Elements in das untergeordnete Element kopiert werden.

Der exec()Systemaufruf kann (von einem untergeordneten Element) verwendet werden, um seinen gesamten Kontext durch das eines neuen Prozesses zu ersetzen, wodurch alle "Vererbung" vom übergeordneten Element getrennt wird.

`exec ()` entfernt nicht alle Vererbung. Es ersetzt meistens nur den Prozessspeicher, aber andere Ressourcen bleiben erhalten. Beispielsweise werden Dateibeschreibungen beibehalten, sofern sie nicht das 'close-on-exec'-Flag gesetzt haben. Dadurch kann die Shell eine E / A-Umleitung durchführen, bevor ein externes Programm ausgeführt wird. Barmar vor 5 Jahren 1