UNIXカーネルの役割
UNIXカーネルは、アプリケーションが動作するための実行環境を提供します。そのため、カーネルは一連のサービスと、それに対応するインターフェースを実装しなければなりません。アプリケーションは通常、ハードウェア資源を直接操作せず、これらのインターフェースを介してシステムリソースへアクセスします。
プロセス/カーネルモデル
CPUはユーザーモードとカーネルモードのいずれかで動作します。一部のCPUアーキテクチャでは、これ以外にも複数の実行モードを持つものがあります。例えば、Intel 80x86 プロセッサは4つの異なる特権レベル(リング0〜3)を備えていますが、標準的なUNIXカーネルは通常、リング0(カーネルモード)とリング3(ユーザーモード)のみを利用します。
ユーザーモードで実行されているプログラムは、カーネルのデータやコードに直接アクセスすることはできません。しかし、カーネルモードで実行されているコードにはこの制限はありません。ユーザーモードとカーネルモードを切り替えるための特別な命令が各CPUアーキテクチャに用意されており、プログラムがカーネルのサービスを要求する際にこの切り替えが発生します。カーネルはサービスを実行した後、プログラムをユーザーモードに戻します。
プロセスは動的に生成・消滅し、通常はシステム内で限られた寿命を持ちます。プロセスの生成・終了、プロセス間の同期といった管理は、カーネル内のルーチンが担当します。
カーネルの役割とシステムコール
カーネル自身はプロセスではなく、プロセスを管理する存在です。プロセスがカーネルのサービスを利用するには、システムコールと呼ばれる特別なインターフェースを使用する必要があります。各システムコールは、プロセスからの要求を識別する特定の関数を提供し、その後、ユーザーモードからカーネルモードへ切り替えるためのハードウェア依存のCPU命令を実行します。
UNIXシステムには、通常のユーザープロセスのほかに、カーネルスレッドと呼ばれる特権プロセスが存在します。その特徴は次のとおりです。
- カーネルアドレス空間でカーネルモードで動作する
- ユーザーとの直接的なやり取りがない(端末デバイスを必要としない)
- システム起動時に生成され、システムがシャットダウンされるまで動作し続ける
カーネルの駆動要因
UNIXカーネルは、単にシステムコールを処理するだけでなく、さまざまな要因によって動作します。代表的なものは以下のとおりです。
-
プロセスによるシステムコールの発行
- ユーザープロセスがカーネルの機能を呼び出すために実行します。
-
CPUによる例外の発生
- CPUが異常な状態(例:ゼロ除算、無効なメモリアクセスなど)を検出した際に発生します。
- 例外が発生すると、カーネルが割り込みを受けて適切に処理します。
-
周辺デバイスからの割り込み
- I/Oデバイスがデータの到着や処理の完了を通知するためにCPUへ信号を送ります。
- 各割り込みは、割り込みハンドラと呼ばれるカーネルルーチンによって処理されます。
- 割り込みは非同期に発生し、実行中のプロセスとは無関係なタイミングで発生することがあります。
-
カーネルスレッドの実行
- カーネルモードで動作し、スケジューリングやデバイス管理などのシステムタスクを担当します。
- ユーザープロセスとは異なり、カーネルの内部処理として実行されます。
単一プロセッサシステムにおけるカーネルとプロセスの実行
単一プロセッサのシステムでは、任意の時点で1つのプロセスのみが実行されます。プロセスがユーザーモードで動作している場合もあれば、カーネルモードで動作している場合もあります。カーネルモードで実行されている場合、プロセッサは何らかのカーネルルーチンを実行していることになります。
免責事項
本記事は、筆者の理解に基づいて執筆したものです。正確性には十分配慮していますが、内容の誤りや最新の情報と異なる可能性があります。
本記事の内容を参考にしたことによるいかなる損害についても、筆者は責任を負いかねますのでご了承ください。
正確な情報や書籍に書かれている根拠等はサポートしませんので、ご自身で公式ドキュメントをお調べください。
よって、この内容をAIの学習データに活用することはおすすめしません。