init process: Vorfahr aller Prozesse?

26

Ich habe immer gelernt, dass der Init-Prozess der Vorfahr aller Prozesse ist. Warum hat Prozess 2 eine PPID von 0?

$ ps -ef | head -n 3
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 May14 ?        00:00:01 /sbin/init
root         2     0  0 May14 ?        00:00:00 [kthreadd]
Mathieu Larose
quelle

Antworten:

32

Erstens ist "Vorfahr" nicht dasselbe wie "Eltern". Der Vorfahr kann der Elternteil des Elternteils sein, und der Kernel verfolgt nur eine Ebene. Wenn ein Prozess jedoch stirbt, werden seine untergeordneten Elemente von init übernommen, sodass auf einem typischen System viele Prozesse angezeigt werden, deren übergeordnetes Element 1 ist.

Moderne Linux-Systeme verfügen zusätzlich über einige Prozesse, die Kernel-Code ausführen, aber hinsichtlich der Zeitplanung als Benutzerprozesse verwaltet werden. (Sie halten sich nicht an die üblichen Regeln für die Speicherverwaltung, da sie Kernel-Code ausführen.) Diese Prozesse werden alle von kthreadd(dem Init von Kernel-Threads) erzeugt. Sie erkennen sie an ihrer übergeordneten Prozess-ID (2) oder in der Regel daran, dass pssie mit einem Namen in eckigen Klammern aufgeführt sind oder dass /proc/2/exe(normalerweise ein symbolischer Link zur ausführbaren Prozessdatei) nicht gelesen werden kann.

Die Prozesse 1 ( init) und 2 ( kthreadd) werden beim Booten direkt vom Kernel erstellt, sodass sie kein übergeordnetes Element haben. Der Wert 0 wird in ihrem ppid-Feld verwendet, um dies anzuzeigen. Stellen Sie sich 0 hier als "den Kernel selbst" vor.

Linux verfügt auch über einige Funktionen, mit denen der Kernel Benutzerprozesse starten kann, deren Speicherort unter bestimmten Umständen über einen sysctl-Parameter angegeben wird . Beispielsweise kann der Kernel Ereignisse zum Laden von Modulen auslösen (z. B. wenn neue Hardware entdeckt wird oder wenn einige Netzwerkprotokolle zum ersten Mal verwendet werden), indem er das Programm im kernel.modprobeWert sysctl aufruft . Wenn ein Programm einen Speicherauszug erstellt, ruft der Kernel das Programm auf, das durch angegeben kernel.core_patternist.

Gilles 'SO - hör auf böse zu sein'
quelle
1
Ist initalso der "Vorfahr" von allen user threads, während [kthreadd ]der "Elternteil" von allen ist kernel threads, richtig? Danke!
Nan Xiao
1
@ NanXiao Meistens ja. Wie ich in meinem letzten Absatz erwähne, gibt es einige andere Möglichkeiten, wie Benutzerprozesse vom Kernel gestartet werden können, z kernel.core_pattern. Auf einem typischen System werden sie nicht angezeigt, da diese Prozesse ihre Arbeit in der Regel schnell erledigen und dann beendet werden.
Gilles 'SO- hör auf böse zu sein'