- Linux では、最初のプロセスは常に
init
(pid==1) だと言われています。しかし、システムをセットアップしてinit
プロセスを作成するカーネル (スタートアップ) はなぜそうではないのでしょうか。カーネルはプロセスですか? - すべてのユーザー空間スレッドが init プロセスにルートされていることはわかっています。では、スケジューラやメモリ管理などのカーネルの他の部分はどうでしょうか?
基本的に、私が混乱しているのはカーネルの構造です。プロセスの場合、単一のプロセスですか、それとも複数のプロセスで構成されていますか?
答え1
短い答え:
- いいえ、それはプロセスではありません
- ユーザー スレッドは init でルート化されません。
Init は単なる最初のプロセスであり、プロセスやスレッドを管理しません。カーネル システムコール fork() と exec を使用して、いくつかのプロセスやスレッドを作成します。
プロセスが何であるか、あなたはよくわかっていないと思います。それは単にコードを実行するだけのものではありません。ええ、カーネルは init の前に実行されます (そしてブートローダーはその前に実行されます)。しかし、「プロセス」には次のような特定の定義があります。
- ユーザー空間で実行
- プロセスIDで実行
- 多くのやり取りはカーネルを経由する必要がある
- すべてのリソースはカーネルから取得する必要がある
- カーネルによってスケジュールされる必要がある
したがって、カーネルが初期化されると、init が実行され、その構成に従って他のプロセスが生成されます。
2 番目に関しては、カーネル関連のものはすべてカーネル内にあります。カーネルをコードの大きな領域と考えてください。繰り返しますが、プロセスではなく、大きなコード ブロブです。カーネルの一部はメモリ管理を扱い、一部はカーネル自体の一部 (ドライバーなど) のスケジュールを扱い、一部はプロセスのスケジュールを扱います。
答え2
カーネルは実際にはプロセスのようには動作しません。カーネルはスケジュールされず、プロセスに代わって実行されるか (いわゆるプロセス コンテキストまたはユーザー コンテキスト)、割り込みまたは例外の結果として実行されます (いわゆる割り込みコンテキスト)。
とはいえ、Linux カーネルは、いくつかのタスクを実行するため、または割り込みコンテキストで何かが長時間実行されるのを回避するためにカーネル スレッドを生成します (これは ksoftirqd スレッドが行うことで、たとえばオーディオのドロップなどにつながる可能性のある過度の遅延を回避します)。
コマンドの出力でカーネル スレッドを確認できますps
。これらは簡単に識別できます。名前は括弧で囲まれています。一部のスレッドは CPU ごとに 1 つのインスタンスを実行します。CPU はスラッシュの後の番号で識別されます。つまり、[ksoftirqd/0] は CPU 0 上の ksoftirqd のインスタンスです。
答え3
マイクロカーネルには、カーネルのさまざまな部分が実際にプロセスであり、プライマリセンチネルが主に IPC を管理するという概念があります。
Linux は、良くも悪くもマイクロ カーネル システムではありません。
答え4
ninjalj は次のように書いています。「カーネルは実際にはプロセスのように動作しません。スケジュールされません。」
そうですね、スケジュールされていて、ほぼ常に実行可能な状態にあるアイドル プロセス (基本的には pid 0 ですが、どこにも表示されません) があります。