私は常に、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]
承認された回答:
まず、「祖先」は「親」と同じものではありません。祖先は親の親…親の親になることができ、カーネルは1つのレベルのみを追跡します。
ただし、プロセスが終了すると、その子はinitに採用されるため、親が一般的なシステムでは1。
最近のLinuxシステムには、カーネルコードを実行するプロセスがいくつかありますが、スケジューリングに関する限り、ユーザープロセスとして管理されます。 (カーネルコードを実行しているため、通常のメモリ管理ルールには従いません。)これらのプロセスはすべてkthreadd
によって生成されます。 (これはカーネルスレッドの初期化です)。それらは、親プロセスID(2)によって、または通常はps
という事実によって認識できます。 角かっこで囲まれた名前で、または/proc/2/exe
という事実によってそれらをリストします (通常、プロセス実行可能ファイルへのシンボリックリンク)を読み取ることはできません。
プロセス1(init
)および2(kthreadd
)は起動時にカーネルによって直接作成されるため、親はありません。値0は、そのことを示すためにppidフィールドで使用されます。ここでは、0を「カーネル自体」を意味すると考えてください。
Linuxには、特定の状況でsysctlパラメーターを介して場所が示されるユーザープロセスをカーネルが開始するための機能もいくつかあります。たとえば、カーネルは、kernel.modprobe
でプログラムを呼び出すことにより、モジュールの読み込みイベント(たとえば、新しいハードウェアが検出されたとき、または一部のネットワークプロトコルが最初に使用されたとき)をトリガーできます。 sysctl値。プログラムがコアをダンプすると、カーネルはkernel.core_pattern
で示されるプログラムを呼び出します。 もしあれば。