GNU/Linux >> Linux の 問題 >  >> Linux

Linux – Initプロセス:すべてのプロセスの祖先?

私は常に、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で示されるプログラムを呼び出します。 もしあれば。


Linux
  1. システム管理者向けの30のLinuxプロセス演習

  2. UNIX / Linux:プロセスにシグナルを送信する 3 つの方法

  3. すべての子プロセスを見つける方法は?

  1. Linux –「サブリーパー」プロセス?

  2. Linuxでプロセスとそのすべての子プロセスのCPU使用率を計算する方法は?

  3. Linux カーネル スレッドは本当にカーネル プロセスですか?

  1. Linux –カーネルがInitを実行できないのはなぜですか?

  2. UNIX / Linux プロセス:C fork() 関数

  3. Ubuntu Linux でのプロセスの管理