init
(pid == 1)と言います。しかし、なぜシステムをセットアップしてinit
プロセスを作成するカーネル(スタートアップ)ではないのでしょうか。カーネルはプロセスですか?基本的に、私を混乱させるのはカーネルの構造です。プロセスの場合、それは単一のプロセスですか、それとも複数のプロセスで構成されていますか?
短い答え:
Initは最初のプロセスにすぎません。プロセスやスレッドは管理しません。カーネルのsyscalls fork()とexecを使用して、いくつかを作成します。
私はあなたがプロセスとは何かについて曖昧な考えを持っていると思います。コードを実行するという意味ではありません。ええ、カーネルはinit(およびその前のブートローダー)の前に実行されます。しかし、「プロセス」には以下の特定の定義があります。
そのため、カーネルが初期化されると、カーネルはinitを実行し、その構成が示す他のプロセスを生成します。
#2に関する限り、すべてのカーネル関連はまあカーネル内にあります。カーネルをコードの大きな領域と考えてください。この場合も、プロセスではなく、大きなコードBLOBです。カーネルの一部はメモリ管理を扱い、カーネルの一部はそれ自体のスケジューリング部分(ドライバなど)を扱い、その一部はスケジューリングプロセスを扱います。
カーネルは実際にはプロセスのようには動作しません。スケジュールされず、プロセスの代わりに実行されるか(いわゆるプロセスコンテキストまたはユーザーコンテキスト)、または割り込みまたは例外の結果として実行される(いわゆる割り込みコンテキスト)。
そうは言っても、Linuxカーネルはカーネルスレッドを生成して、いくつかのタスクを実行したり、割り込みコンテキストでの長時間実行を回避したりします(つまり、ksoftirqdスレッドが行うことで、オーディオのドロップなどにつながる可能性のある過度の待ち時間を回避します)。 。
ps
コマンドの出力でカーネルスレッドを確認できます。それらは簡単に識別できます。それらの名前は括弧内にあります。それらのいくつかはCPUごとに1つのインスタンスを実行します。CPUはスラッシュの後の番号で識別されるため、[ksoftirqd/0]はCPU 0上のksoftirqdのインスタンスです。
いいえ、そうではありません...カーネル(およびカーネル拡張)はメモリに直接読み込まれます。カーネルに安全でないコードがある場合、それと大きな問題の間に何も立っていません。
それはさておき、カーネルは基本的にプロセス間で実行/切り替えを行います。明らかに、実際にプロセスを実行するものは、プロセス自体ではありません。
(tl; dr 1. no 2.カーネルの一部/その拡張)
マイクロカーネルには、カーネルのさまざまな部分が実際にプロセスであるという概念があります。プライマリセンチネルは、主にIPCを管理するだけです。
Linuxは、良くも悪くも、マイクロカーネルシステムではありません。
コンテキストの切り替え
❖プロセスは、カーネルと呼ばれるOSコードの共有チャンクによって管理されます
▪ The kernel is not a separate process, but rather runs as part of a user process
Contextコンテキストスイッチは、あるプロセスから別のプロセスに制御フローを渡し、カーネルコードを使用して実行されます
出典: https://courses.cs.washington.edu/courses/cse351/19su/lectures/18/CSE351-L18-processes_19su.pdf 、36ページ
ninjaljは次のように書いています:「カーネルは実際にはプロセスのようには動作しません。スケジュールされません。
まあ、スケジュールされていて、常に実行可能な状態にあるアイドルプロセス(基本的にpid 0ですが、どこにも表示されていません)があります。