initプロセス:すべてのプロセスの祖先?


26

initプロセスはすべてのプロセスの祖先であることを常に学びました。プロセス2のPPIDが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]

回答:


32

まず、「祖先」は「親」と同じものではありません。祖先は親の親の…親の親になることができ、カーネルは1つのレベルのみを追跡します。ただし、プロセスが停止すると、その子はinitによって採用されるため、典型的なシステムでは親が1である多くのプロセスが表示されます。

さらに、最新のLinuxシステムには、カーネルコードを実行するプロセスがいくつかありますが、スケジューリングに関してはユーザープロセスとして管理されます。(カーネルコードを実行しているため、通常のメモリ管理ルールに従いません。)これらのプロセスはすべてkthreadd(カーネルスレッドの初期化)によって生成されます。親プロセスID(2)によって、または通常、ps角括弧で囲まれた名前でそれらをリストするという事実、または/proc/2/exe(通常はプロセス実行可能ファイルへのシンボリックリンク)が読み取れないという事実によって、それらを認識できます。

プロセス1(init)および2(kthreadd)は、ブート時にカーネルによって直接作成されるため、親はありません。値0は、それを示すためにppidフィールドで使用されます。ここで、0は「カーネル自体」を意味すると考えてください。

Linuxには、特定の状況でsysctlパラメーターを介して位置が示されるユーザープロセスを起動するカーネルの機能もあります。たとえば、カーネルはkernel.modprobesysctl値でプログラムを呼び出すことにより、モジュールの読み込みイベントをトリガーできます(たとえば、新しいハードウェアが検出されたとき、またはいくつかのネットワークプロトコルが最初に使用されたとき)。プログラムがコアをダンプすると、カーネルは、存在するkernel.core_pattern場合に示されるプログラムを呼び出します。


1
だから、initすべての「祖先」でありuser threadsながら、[kthreadd ]すべての「親」はkernel threads右、?THX!
ナン暁

1
@NanXiaoほとんど、はい。最後の段落で述べたように、カーネルがユーザープロセスを開始する方法は他にもいくつかあります。たとえば、プログラムがkernel.core_patternコアをダンプするときにリストされるプログラムです。通常のシステムでは、これらのプロセスはすぐにジョブを実行して終了する傾向があるため、それらは表示されません。
ジル 'SO-悪であるのをやめる'
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.