回答:
まず、「祖先」は「親」と同じものではありません。祖先は親の親の…親の親になることができ、カーネルは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
場合に示されるプログラムを呼び出します。
kernel.core_pattern
コアをダンプするときにリストされるプログラムです。通常のシステムでは、これらのプロセスはすぐにジョブを実行して終了する傾向があるため、それらは表示されません。
init
すべての「祖先」でありuser threads
ながら、[kthreadd ]
すべての「親」はkernel threads
右、?THX!