3. モノリシックカーネルについて

(OHP 5)
------------------------
Basic Design
- Monolithic kernel vs Micro kernel
- Non pre-emptible
- Portability
-----------------------

コンピュータサイエンスを勉強している人は御存知だと思うけど、最近の新し いカーネルはほとんどマイクロカーネルを採用している。しかし、マイクロカー ネルに比べてモノリシックカーネルはずっと簡単に書けるし、保守もしやすい。 だから、Linux はモノリシックカーネルになっている。

マイクロカーネルは多少良い点はあるものの、遅くて書くのも大変だという問 題点がある。このあたりについては多くの議論があるところだけどね。

マイクロカーネルの特徴は、システムは多数の小さなモジュールからできてそ れらが互いに通信しながら OS の基本的な機能を果していることだ。一方、 Linux では一つのモノリシックなカーネルが全ての機能を果しているので、プ ログラムはずっと書きやすくなる。もっとも、僕を含めた Linux の開発者た ちは、カーネルをできるだけ「モジュール化」しようとしており、ソースレベ ルでは機種に依存する部分はそれぞれ別のディレクトリに分かれているし、概 念的に区分されるドライバ類も別々のファイル、別々のディレクトリに分かれ ている。

もう一つ、カーネルの基本的なデザイン上の特徴は、Linux カーネルは non pre-emptibleだ、ということだ。すなわち、一つのプログラムだけがカーネル モードにあり、その他のプログラムはカーネルモードプロセスにならない。こ のようにしておけばプログラムはずっと簡単になる。競合状態やデッドロック のような状態は non pre-emptible カーネルの方がずっと処理しやすい。

別の例で説明すると、例えば "10 goto 10" みたいな Basic のプログラムが あって、無限ループしているとしても、このプロセスはカーネルモードにない から簡単に kill できる。カーネルモードにいるプロセスだけがマシンを完全 にコントロールしてしまうわけだ。

昨年あたりからは「移植性」についても考慮しはじめた。もともとの Linux は 80[345]86 が動いている PC しか対象に考えていなかったけど、1 年半前 に DEC が僕に Alpha マシンをくれたので、それ以来 Linux を異なる機種に 移植する、という問題が重要になってきた。

現在では、CPU に依存している部分はきれいに整理されて、僕も家では主に Alpha マシンを使ってる。僕の持ってるマシンの中では、Alpha マシンがもっ とも速いからね。

でも、現在の Linux では、ソースコードの約半分はデバイスドライバが占め ている。これらのデバイスドライバは機種にきわめて依存しているので移植が 困難だけど、DEC Alpha の場合、IBM-PC と同じ PCI バスを使っているので、 移植はそれほど難しくない。一方、sparc や 68k マシンの場合、デバイスド ライバは 0 から書き直さなければならない。

(OHP 7)
---------------
kernel とそれを取りまく gcc, X11R6 といった基本アプリ、ユーザープログ
ラムを図示したもの
--------------

さて、このあたりで、僕が Linux の開発で果している役割は、本当はずいぶ ん小さいものだ、ということを白状しておこう。この図は「Linux とは何か」 を示したもので、カーネルはこの円の中のブルーと赤の部分になる。それ以外 にも、多くの shell utility や daemon 類、X11R6 といったプログラム、そ の他無数の "end user program" がある。この中で僕がやってるのは、この中 心のごくわずかな部分だけだ。

例えば日本語の問題一つとってみても、たくさんの人々がカーネルの外側で日 本語を使えるようにコードを書いてる。でも、正直いって僕にとっては日本語 処理の問題点が何かすら理解できていない。だから、僕がやってるのは、本当 にシステム全体のうち、中心のごく一部だけなんだ。何千もの人が Linux 用 に、あるいは Unix 用にプログラムを書いてくれている。こんな人々のおかげ で、Linux は今日のように使いやすいシステムになったと言える。

次に Linux の開発方針について説明しよう。