図1●OSの基礎プログラム「カーネル」を保護する特権モードとユーザーモード
特権モードで動作するプログラムとユーザーモードで動作するプログラムとでは,バグがあった際の安全性に差が出る。
図2●主なOSが採用してきたカーネル・アーキテクチャの推移
特権モードで動作するプログラムが少ない「マイクロカーネル」と,特権モードで動作するプログラムが多い「モノリシック・カーネル」の二つに大別できる。
図3●マイクロカーネルとモノリシック・カーネルのオーバーヘッドの違い
アプリケーションからカーネル,カーネルからシステム・サービスといった具合に,ユーザーモードと特権モードをまたいだプロセスの切り替え(コンテキスト・スイッチ)の回数に差が出る。
 WindowsやMacintoshのユーザーであれば,誰しも一度は「回復不能なエラーが発生しました」というエラーや「爆弾マーク」を目にしたことがあるはずだ。アプリケーションを利用しているときにまったく操作を受け付けなくなってしまい,途方に暮れたこともあるだろう。

 ハングアップするのはバグがあるからだ。ただWindows 2000/XPやMac OS Xといった最近のOSでは,アプリケーションのバグによってハングアップする可能性は少なくなった。OSがアプリケーションに直接ハードウェア資源を触らせないからだ。例えばアプリケーションはOSから割り当てられたメモリー空間にしかアクセスできない。だから間違って他のアプリケーションのデータを壊したり,システム・データを破壊してOSの動作をおかしくするようなことはない。

アプリとカーネルの動作モードを変える

 こういったメモリーなど,システムの資源をうまく管理するのがOSの主要な役目である。なかでもCPUとメモリーがコンピュータにおける最も重要な資源である。これを管理するのが「カーネル」だ。カーネルとアプリケーションは実行する動作モードが明確に異なる。

 ほとんどのCPUは複数の動作モードを備えている(図1[拡大表示])。一般にCPUには,「カーネルモード」や「スーパバイザ・モード」と呼ぶ特権モードと,通常のプログラムが動作する「ユーザーモード」がある。ユーザーモードで動作するプログラムは一種の「枠」がはめられている。ユーザーモードで動作するアプリケーション・ソフトに障害が発生しても,OS全体を巻き込むことはない。

システム・サービスがどこで動くか

 ところでOSが管理しなければならない資源はメモリーとCPUだけではない。アプリケーションに対してネットワーク・アクセスやファイル管理といったさまざまなサービス「システム・サービス」も提供する。アプリケーションだけでなく,ほかのハードウェア資源の管理やシステム・サービスをユーザーモードで動作させれば安全性は向上する。

 この考えに基づき,カーネルの機能を最小限に絞ったのが「マイクロカーネル」だ*1。具体的には,プロセス間の通信や,CPU実行時間の割り当て(スケジューリング)といった最小限の機能だけを提供する。プロセスとはCPUやメモリーといった資源を割り当てる単位である。マイクロカーネルでは,ほとんどのシステム・サービスがユーザーモードで動作する。個々のシステム・サービスがカーネルや他のシステム・サービスを破壊することがないため,OS全体が停止する可能性を低くできる(図1)。

 これに対し,システム・サービスとカーネルがともにカーネルモードで動作するOSのカーネルを「モノリシック・カーネル」と呼ぶ。モノリシック・カーネルでは,カーネルが動作するメモリー空間に数多くのシステム・サービスが存在するため,あるサービスのプログラムが別のサービスが使用しているメモリー上のデータを破壊する恐れがある。安全性の面で言えば,カーネルが他のプログラムから隔離されているマイクロカーネルが優れている*2

性能追求と相容れぬマイクロカーネル

 ところが現在のところ,商用OSで純粋なマイクロカーネルを採用する製品はない(図2[拡大表示])。米Microsoft社のWindows NT 4.0やWindows 2000はマイクロカーネルをベースにしているが,モノリシック・カーネルに近い構造である。米カーネギーメロン大学が開発したマイクロカーネルの代名詞となる「Mach」を採用した米Apple Computer社の「Mac OS X」も,モノリシック・カーネルだ。「純粋なマイクロカーネルは商用OSでは成り立たない」(アップルコンピュータ プロダクトマーケティングの櫻場浩課長)。その主な理由はモジュール同士が連携するためのオーバーヘッドの大きさにある。

 マイクロカーネルの場合,アプリケーションがOSのシステム・サービスを呼び出すのにマイクロカーネルが介在する。あるアプリケーションがOSのシステム・サービスに処理を依頼したとすると,ユーザーモードと特権モードをまたいだプロセスの切り替え(コンテキスト・スイッチ)が4回発生する(図3[拡大表示])。コンテキストとは,プロセスの状態のこと。コンテキスト・スイッチが起こると,CPUはレジスタのデータを保存し,次に実行するプロセスのデータをレジスタに読み込む。この処理は結構時間がかかる。

 モノリシック・カーネルの場合は,アプリケーションが特権モードのシステム・サービスを呼び出しても,カーネル内で処理が完結するためコンテキスト・スイッチの数は2回で済む。マイクロカーネルに比べてシステム・サービスを呼び出すオーバーヘッドは少ない。そのため,パフォーマンスの面ではモノリシック・カーネルに分がある。

(高橋 秀和)