OSの世界にたちこめる暗雲と光明

オープンソースのOSのカーネルを読むことは誰にでもできる。ところがカーネルのソースを読むのは目的がなければただの苦行だ。カーネルの全体像が把握できるレベルになるまで、ひとつでもいいからOSのソースから学んでみるといい。カーネルのソースを読まずに「OSとは何か?」という議論に参加することは、食べたことのない料理の味について語るのとおなじだ。

1987年にアムステルダムのVrije Universiteitの教授Andrew S. Tanenbaum氏によって生み出されたMINIX 1.0は、同年に出版された彼の著作 “Operating Sytems: Design and Implementation” で伝えられている原則を実証した。

MINIX 1.0は教育目的という大義があったので、カーネルのソースもたったの4千行程度だ。

かつてTanenbaum氏とLinus Torvalds氏の間で、OSの設計に関した思想について論争があった。Torvalds氏は言わずと知れたLinuxの生みの親で、彼がLinuxを作るきっかけになったのはMinixである。

Linux is Obsolete.(Linus Tanenbaum Debate)

Linuxカーネルがモノリシックであることは、これまでの時代において許容されてきた。なぜならx86が台頭してきたからだ。このx86の台頭と各種OSのx86依存のどちらが先なのかは卵が先か鶏が先かという話になってしまうのだが、すくなくともIntelは経済的にも地位的にも大きな恩恵を受けた。

いまの時代になってようやく、Tanenbaum氏の思想が実践的に理解できる時代になりつつあると感じている。これはOSの設計思想の時代による変化というよりも、コンピューティングの本来あるべき進歩が経済的事情によってかかる圧力下にあったものが正常化してきていると僕は捉えている。皮肉なことにOSの価格を下げることにLinuxは大きな貢献をしている。Linuxコミュニティにおいてそれは明確な大義のひとつではあったが、それによってモノリシックなOSが否定される時代を呼ぶことは想定できなかったのではないだろうか。なぜならいまここで僕が想定していることは、英語・日本語の文献にはまだ現れていないからだ。

モノリシックなカーネルを伽藍のように構える大きな理由は、CPU独自の命令を有効活用することにある。それはつまり、ユーザーのハードウェアがもつポテンシャルを最大限に活用するという点がOSの存在意義に含まれるのかどうかという、設計ポリシーの問題になる。CPU独自の命令に合わせるということが、故意かどうかに関わらずCPUメーカーとOSの癒着を生むことはわたしたちは経験的に知っている。

時代は変わり、多くの情報処理において処理能力よりも重視されるポイントが増えた。すくなくともそのような需要はある。僕はここで、マルチタスクの概念をひとつのシステムに放り込むという行為がOSの歴史上どれだけワークアラウンド的であったかについて考えてみることを思いついた。

ノイマン型コンピュータにおいて並列処理はトリックであるという大前提がある。これに異議がある方はどうか教えてほしい。ひとつのCPUコアが処理する内容はストレートで単純な流れであることがCPUの観点からみれば最も最適化された処理ということになる。

そこで考えつくのが、マイクロカーネルで、かつシングルタスクなカーネルをもつシステムだ。さらにそれらを束ねるためのOSは別のハードウェア上に実現するのだ。

わたしたちはいま、SBCというおもちゃを手にしている。さらに、古い見捨てられたコンピュータが山ほど廃棄されたり放棄されたりしている現実があるのだ。

MIPS、Alpha、Pentium、PowerPC、68000、さらには386や486など、わたしたちが振り返ろうともしない古いCPUたちは、果たして本当にわたしたちの現代的なコンピューティングにとって役割を終えてしまったのだろうか。僕はそうは思わない。古いコンピュータにMINIXやMS-DOSをインストールすれば、それは今でも高速な演算処理を提供してくれる。そう、問題はOSの進化なのだ。

わたしたちの多くが使っているPCにはいま、Intel製のCPUが内蔵されている。そのCPUにはME(Management Engine)と呼ばれる機能が備わっており、Ring -3(マイナス3)というとんでもない特権で動作するようにできている。皮肉なことにこの機能で動作しているOSがMinixだというのだ。Tanenbaum氏はこれについて「Intelからの説明がなかった」と公式にコメントしている。事実は不明だ。

上記の記事によればMinixはRing -3のME上で動作し、ユーザーによるアクセスは不可能。さらにユーザーよりも高いレベルの特権でコンピューターを完全に制御することが可能になっている。

Googleによれば、Ring -3にはフルネットワークのスタック、ファイルシステム、USBやネットワークなどのドライバ、Webサーバーなどの機能が含まれているという。

Intelがどのような目的をもってこのような実装をしたのかはわからない。ただ、いま言えることは、わたしたちはより多くの選択肢を与えられるべきであるということだ。現在、IntelとAMD以外のCPUでわたしたちはPCやスマホを使うことができるだろうか。

マイクロカーネルは、それ自体がスタックされて高度な処理を行うことが可能となっている。vmwareもdockerもいらない。わたしたちはプログラムをハードウェア上で動かすために、余計なものをなるべく挟まずにコンピューティング能力を最大限に活用したいのだ。単純なものほど強固でもある。

これまでx86の台頭により、OSのポータビリティは無視され続けてきた。それでも有志たちによってポートは細々と続いてきたが、PowerPCをサポートしているOSは今あとどれだけあるだろう。Ubuntuは2021年で打ち切ると言っている。それでも今までよくサポートしてきたものだ。MotorolaやMIPSはどうだろうか。SPARCは?

明らかに時代は変化の兆しを見せている。僕はアムステルダムまで行く必要があるかもしれないと思っている。

Linuxの将来は明るくない。カーネル開発者の高齢化が止まらないのだ。大方の予想では、Linuxカーネル開発者が死に絶えるまでこの流れは止まらないだろうという。なぜLinuxカーネルを後継するエンジニアが育たないのか。

先月には、Linux FoundationがLinuxカーネル開発者を目指す人のためのオンラインコースの無料提供を開始した

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

しかし、プロセッサの処理速度は20世紀末から21世紀初頭にかけて長足の進歩を遂げた。また、マイクロカーネル側の実装における高速化技法の進展、必要に応じて一部パフォーマンスを要求されるサブシステムのみカーネル空間に取り込む実装も登場し、モノリシックカーネルのパフォーマンスにおける原理上の優位性は小さくなった。

モノリシックカーネルはその原理上、実行時にメモリ上のOSカーネルのフットプリントを小さくしやすい傾向にある。Non-preemptiveであれば、サービス実装において考慮するべきことが減り、開発が楽になるという利点はある。だがNon-preemptiveがマイクロカーネルにとって不利なのではなく、現状世の中にあるマイクロカーネルOSの使い方がまだ現代的ではないと僕は思う。

これは暗雲たちこめるOSの世界に射す一条の光だ。

WindowsやMac OSなどの中身が見えない商用OSのアップデートに一喜一憂する時代は長すぎた。わたしたちはコンピューティングを次の革新へと導く責任があり、そのためのアイデアがここにある。