再入可能なカーネル(Reentrant Kernel)
UNIX系のカーネルは 再入可能(リエントラント、Reentrant) です。つまり、複数のプロセスがカーネルモードで同時に実行される可能性があります。
カーネルの再入可能性とは?
単一のCPUしかないシステムでは、一度にCPU上で実行できるプロセスは1つだけです。しかし、カーネルモードで実行しているプロセスが I/O待ち(ディスクやネットワークの応答待ちなど) になると、そのプロセスは停止され、他のプロセスが実行されることがあります。
例えば、あるプロセスが ディスクからデータを読み取る要求 を発行した場合、その処理は ディスクコントローラ に任されます。この間、カーネルは別のプロセスの実行を開始できます。そして、ディスクの読み取りが完了すると、割り込み(Interrupt) によってカーネルに通知が送られ、停止していたプロセスが再開されます。
このように、複数のプロセスが カーネルモードでの実行を一時中断しながら動作する 仕組みを カーネルの再入可能性 と呼びます。
再入可能なカーネルを実現する方法
カーネルを再入可能にするための重要なポイントは、同じカーネルコードが複数のプロセスによって同時に安全に実行できる ように設計することです。
① 再入可能な関数を使う
一般的に、ローカル変数 のみを使用し、グローバル変数を変更しない 関数は 再入可能(リエントラント)関数 と呼ばれます。再入可能な関数は、複数のプロセスから同時に呼び出されても、データ競合が発生しません。
② ロック(排他制御)を使う
ただし、カーネル内には、再入不可能な関数(グローバル変数を変更する処理など)も存在します。この場合、複数のプロセスが同時に実行すると競合が発生するため、ロック(mutexやスピンロック) を使って、一度に1つのプロセスだけがその関数を実行できるようにします。
カーネル実行パスと再入可能性
カーネルでは、以下の3つのイベントによって カーネル実行パス(Kernel Execution Path)が発生します。
- システムコール(ユーザープロセスがOSの機能を呼び出す)
- 例外処理(ページフォルトなどのエラーが発生する)
- ハードウェア割り込み(I/O完了やタイマ割り込みなど)
カーネルの再入可能性によって、これらの実行パスが並行して動作する場合があります。以下のような状況で 複数のカーネル実行パスが同時に動作する ことになります。
① システムコールによるプロセスの切り替え
ユーザープロセスがシステムコールを発行しても、カーネルがすぐに処理を完了できない場合があります。例えば、I/O待ちが発生すると、スケジューラが別のプロセスを実行 し、最初のカーネル実行パスは一時停止されます。
結果:
- 最初のプロセス は I/O待ちになり、一時停止
- 新しいプロセス が実行され、別のカーネル実行パスが動作
② 例外発生による処理の切り替え
カーネル実行中に 例外(ページフォルトなど) が発生すると、一時的にその処理を中断し、例外処理ルーチンが実行されます。
例:
- ユーザープロセスがアクセスできないメモリにアクセス → ページフォルト発生
- カーネルがページフォルト処理を実行し、新しいメモリページを割り当て
- 例外処理が完了すると、元のカーネル実行パスを再開
③ 割り込みによる処理の中断
カーネル実行中に ハードウェア割り込み(I/O完了など)が発生すると、カーネルは現在の処理を中断し、割り込み処理ルーチン(割り込みハンドラ)を実行します。
例:
- カーネルがシステムコールを処理中に、ディスクの読み取りが完了 → 割り込み発生
- 割り込みハンドラがディスクデータを処理
- 割り込み処理が終わると、カーネルは元の処理を再開
④ カーネル内プリエンプション(優先度の高いプロセスへの切り替え)
カーネルが実行中に、より高い優先度のプロセスが実行可能になった場合、CPUは現在の処理を中断し、新しいプロセスのカーネル実行パスを開始することがあります。
ただし、この動作はカーネルの設定(プリエンプション有効/無効)によって異なります。
カーネルの再入可能性とシステム全体への影響
カーネルが再入可能であることで、次のようなメリットがあります。
I/O処理の効率化
- カーネルがI/O待ちの間、他のプロセスを実行できるため、CPUの待機時間が減る。
- リアルタイム性の向上
- 割り込みをすぐに処理できるため、デバイス応答が早くなる。
- マルチプロセッサ対応が容易
- 再入可能なカーネルは、複数のCPUが同時にカーネルコードを実行できる設計になる。
一方で、データ競合を防ぐためのロック管理が複雑になる という課題もあります。ロックの使用を最小限に抑えつつ、高速に処理を行うことが、カーネル設計の重要なポイントとなります。
免責事項
本記事は、筆者の理解に基づいて執筆したものです。正確性には十分配慮していますが、内容の誤りや最新の情報と異なる可能性があります。
本記事の内容を参考にしたことによるいかなる損害についても、筆者は責任を負いかねますのでご了承ください。
正確な情報や書籍に書かれている根拠等はサポートしませんので、ご自身で公式ドキュメントをお調べください。
よって、この内容をAIの学習データに活用することはおすすめしません。