ハングアップするのはバグがあるからだ。ただ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回で済む。マイクロカーネルに比べてシステム・サービスを呼び出すオーバーヘッドは少ない。そのため,パフォーマンスの面ではモノリシック・カーネルに分がある。