モノリシックカーネル

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動: 案内検索
モノリシックカーネルの概念図

モノリシックカーネル: monolithic kernel)とは、オペレーティングシステム(以下、OSと略記)におけるカーネルの構造、および設計思想を指す。「入出力機能やネットワーク機能、デバイスのサポートなどOSの一般的な機能」をカーネルと同一のメモリ空間に実装・実行する手法を言う。

代表的なモノリシックカーネルOSとしては、古典的なUNIXその派生OSがあげられる。

モノリシックカーネルというタームが登場した頃、このタームを誤って表記した雑誌記事等による刷り込みにより、日本国内においてはしばしばモノシリックカーネルと誤用・誤表記するユーザーやライター等が今なお見られる。

モノリシックカーネルとマイクロカーネル[編集]

OSの構成要素を単一のメモリ空間で実行するモノリシックカーネルに対し、OSを構成する幾つかの要素・機能をカーネル空間から切り離し、外部モジュール化する等で実装する手法をマイクロカーネルと呼ぶ。

モノリシックカーネルの設計思想および概念それ自体は旧来より存在するが、モノリシックカーネルというタームの成立は、このマイクロカーネルという概念・実装の登場(による対概念として要請され、命名されたこと)による。

カーネル実装方式とその議論[編集]

モノリシックカーネル方式は、より近代的な設計手法とされるマイクロカーネル方式のOSに比べ、OSの機能のほとんどすべてが単一のメモリ空間で行なわれる故、同一の処理を行う際に費やされるコンテキストスイッチプロセス間通信等によるオーバーヘッドは相対的に少ないものとなり、実効パフォーマンスにおいて有利であるといった見解がある。実際にプロセッサの動作クロックが数MHz〜数十MHz程度に留まっていた時代には、乱発されるコンテキストスイッチ等の実行コストの問題は深刻なものであった。

1980年代にデビューした商用UNIXは、そのほとんどがモノリシックカーネル方式を採用している。

しかし、プロセッサの動作クロックは20世紀末から21世紀初頭にかけて長足の進歩を遂げ、処理能力に至ってはさらにその何倍にも向上していることは今更言うまでもない。このような実行環境側の進歩に加え、L4プロジェクトにおけるプロセス間通信のチューニング等、マイクロカーネル側の実装における高速化技法の進展、また必要に応じてマイクロカーネル的な構造を基調としながら一部パフォーマンスを要求されるサブシステムのみカーネル空間に取り込む実装や、モノリシックカーネルを基調としながらも柔軟性や堅牢性を要求される部分にマイクロカーネル的な設計手法を導入するといった、より現実的なハイブリッドカーネルとでも呼ぶべき設計手法も登場し、モノリシックカーネルのパフォーマンスにおける原理上の優位性や、両者の厳密な区別については、いまや必ずしも絶対的なものとは言えなくなった。

2005年現在では、純然たるモノリシックカーネル方式で開発する利点は少ないとする意見に収束して来ている。しかし、同等の機能を実装した場合にその原理上実行時の(コンピュータのメモリ上の)OSカーネルのフットプリントを比較的小さなものに留めておきやすいこと、ノンプリエンプティブ (non-preemptive) 制約を付加すれば、サービス実装を行う時に考慮するべきことが減り、開発が楽になること等が利点として挙げられる。

一方、モノリシックなカーネルに様々な機能を取り込むことで巨大化することによる欠点・弊害としては、OSの機能を動的に切り替えたり更新したりすることが(マイクロカーネルと比較した場合に)困難なものになりやすいこと等が挙げられる。

研究開発の世界では、カーネルの機能を最小限にとどめるマイクロカーネルが主流になった1990年代当初、モノリシックカーネルは時代遅れとされてきた。しかし、実装レベルでの差が動作上の致命的な設計問題であるはずもなく、現在では必要な機能を必要な性能レベルで提供できれば問題ないという形での議論終結が図られている。

Solaris / HP-UX / AIXや日本の国産UNIXの系統も全てモノリシックカーネルを基礎とするカーネルを使用している。また、x86系PCでのUNIX互換機能提供を目指して作られたLinux[1]では基本的にモノリシックカーネルを採用しているが、実行時に読み込むカーネルモジュールを設ける等、実行時の柔軟性を高めている。

Windows NTは、当初よりマイクロカーネル方式での実装を模索していたが、オーバーヘッドを削減するためにNT 4.0でWindowsサブシステムとグラフィクスデバイスドライバがカーネル空間から直接見える様に修正された。さらにWindows 2000以降では、ハードウェア管理機能の一部をマイクロカーネル直轄のモジュールとしての外部モジュールからカーネル制御部本体による制御方式に切り替えており、純粋なマイクロカーネルから外れた実装になっている。NT4.0では800キロバイト弱だったNTOSKRNL(Windows NT系のカーネルシステム)のフットプリントは、WindowsXPでは2メガバイト強にまで肥大している(但しWindows Vistaにおいては、動作の安定性やシステム全体の堅牢性に対する配慮から一部「先祖返り」を起こしている)。 マイクロカーネルとしての構造は依然残されているため、マイクロカーネルとモノリシックカーネルの折衷をとったハイブリッドカーネルとでも呼ぶべき実装になっている。

また Machから派生したMac OS Xも、BSDサブシステムやファイルシステム、ネットワークなどをカーネル空間に統合しており、純粋なマイクロカーネルから離れた実装になっている。Windowsと同様、マイクロカーネルとモノリシックカーネル両方の利点を活かした設計である。

有名な論争[編集]

モノリシックカーネルとマイクロカーネルについては、Linuxの作者リーナス・トーバルズMinix(ミニックス)の作者アンドリュー・タネンバウム1992年論争が有名である。

モノリシックカーネルの採用例[編集]

呼称[編集]

「モノリシック」という語は、映画「2001年宇宙の旅」に出てくる物体「モノリス」からとったもので、「モノリスのような一枚岩の」という意味である。

注記[編集]

  1. ^ 初期のLinuxは、モジュールとなるコードをオブジェクトファイルの形でカーネルから分離する事ができる。ただし、カーネル側に受け皿となるインターフェースがモジュール毎に用意されている必要がある。現在はモジュールのインターフェースに対する抽象化が行われ、モジュールをカーネルの構築状態に依存する事なく追加できる。

外部リンク[編集]