コンピューターというハードウェアを活用するために欠かせないのが、OS(Operating System:オペレーティングシステム)の存在です。我々が何げなく使っているWindows OSやOS XだけがOSではありません。世界には栄枯衰退のごとく消えていったOSや、冒険心をふんだんに持ちながら、ひのき舞台に上ることなく忘れられてしまったOSが数多く存在するのをご存じでしょうか。「世界のOSたち」では、今でもその存在を確認できる世界各国のOSに注目し、その特徴を紹介します。前回に引き続き、現在のWindows OSに連なるワークステーション向けOS「Windows NT 3.x」を取り上げましょう。

完成に5年の月日を要したWindows NT 3.1

前回述べたように、Windows NTの開発は苦難の連続でした。この時点でもメモリー消費量やパフォーマンス面に大きな問題があったWindows NTですが、当時既にMicrosoft Researchの所長として同研究所を設立したRichard "Rick" Rashid(リチャード・ラシッド)氏らがカーネルの一部を改良し、メモリーの一部をストレージに逃がすページング方式(正しくは記憶領域をページ単位で区切り、割り当てを行うアルゴリズム)を追加しています。

ページング方式の概念は1960年代に確立しているため、David Neil Cutler(デヴィッド・ニール・カトラー)氏も当初はアイディアの一つとしてWindows NTに組み込むことを考えていました。しかし、カーネル上でページング方式を利用するのは危険と判断し、実装を見送っていましたが、Rashid氏の提案はその考えを覆すようなものです。そのためCutler氏は苛立(いらだ)ち、提案を拒否しましたが、最終的にはRashid氏が提案した内容の一部を受け入れました。ただし、Microsoft Researchが書いたコードは採用せず、自身でコードを書き直したそうです。

図01 1993年7月27日にリリースされたWindows NT 3.1。ビルド番号は3.10.528でした

基本的な部分はある程度完成しましたが、次から次へと現れるバグにCutler氏は「品質の高いコードを書け」と開発メンバーを叱り、その結果は多くのベータ版に反映されました。1992年10月にファーストベータ版(ビルド番号は3.10.3xx)、1993年3月には1万5,000人のユーザーに配布したセカンドベータ版(3.10.404)をリリース。さらに500箇所にも及ぶバグが発見されたため、それらを修正したサードベータ版(3.10.438)を1993年4月に配布し、そして発売日が定まったことからさらにバグフィックスした最終ベータ版(3.10.475)を1993年6月に配布しました。1993年7月1日にはRC版(Release Candidate version:出荷候補版)、同月12日にはRC2版をリリース。最終的には250名を超える開発陣が5年の月日をかけて560万行にも及ぶコードを書き上げたWindows NT 3.1は、同月26日に開発チームの手を離れ、1993年7月27日のリリースに至ったのです(図01)。

ここでWindows NT 3.1のシステム要件を紹介しましょう。CPUはx86/MIPSアーキテクチャ、そして数週間後にDEC Alphaアーキテクチャをサポートしました。x86系CPUは80386 25MHz以上で動作するプロセッサに加え、12メガバイト以上のメモリーと、75メガバイト以上のHDD(ハードディスクドライブ)空き容量、VGA以上の描画機能を持つビデオ機能となっています。もっともこれは最小構成であり、標準環境としては80486以上のCPUに加え、メモリーは12から16メガバイト、HDDの空き容量は200から300メガバイト。ハイエンド環境は80486を2基搭載するか、RISC系プロセッサを推奨し、メモリも16メガバイト以上、HDD空き容量は300メガバイト以上でした。

当時の国内コンピューター雑誌を見直しますと、DELLの「OptiPlex XPS4100/MXV」というコンピューターは、Intel 486DX4/100MHzを搭載し、メモリーは8メガバイト(最大64メガバイト)、HDDも320メガバイトという構成で38万6,000円でした。OptiPlexは法人向けブランドのため若干割高ですが、それでもWindows NT 3.1の最小システム要件を(メモリー搭載容量が)満たしていません。

同コンピューターのメモリーソケットは4箇所でしたので、64メガバイトを確保するには16メガバイトのSIMMを増設しなければなりません。その半分なら8メガバイトSIMMが4本必要ですが、当時の増設メモリーは高価でした。そのためWindows NT 3.1を動かすには、高価なデバイスを用意する必要でした。いずれにせよWindows NT 3.1が過度なハードウェアスペックを求めるOSであったことは事実であり、突貫工事とも言える開発状況からOS全体の最適化には至りませんでした。Windows NT 3.1が「Memory Eater(メモリーイーター)」と邪揄(やゆ)されたのも仕方ないでしょう。

Windows NT 3.1を語る上で重要なのがHAL(Hardware Abstract Layer)の存在です。簡単に述べるとハードウェアを抽象化するための存在であり、異なるアーキテクチャ上で同じOSを実行するために用意された機能の一つ。そもそもアーキテクチャによってCPUに対する命令は異なり、従来のOSは対象となるCPUに即したアセンブリ言語でコードが書かれていました。Windows NTは「移植性」を実現するためにHALを導入。executiveサービスレベルで動作し、ハードウェアの相違点を抽象化することで、ソフトウェア開発者はアプリケーションやデバイスドライバーのコードを書く際も、ハードウェア固有の情報を認識せずにする必要がなくなります(図02)。

図02 Windows NTカーネルの主な構成です

MicrosoftはWindows NTを、UNIXなどハイエンドOS市場の席巻(せっけん)を目指すOSと位置付けていました。そのため、自身がシステムでありながら同時に他のシステムの一部でもあるような動作を実現する「サブシステム」を実装しています。このロジックを利用することで、OS/2やPOSIX(各種UNIXに代表されるOSの共通API)に準拠したOSのアプリケーションを実行することが可能でした。後に登場したWindows 3.1にはサブセット版となるWin32s(Subset)が、Windows 9x系には互換性を維持するためのWin32c(Compatibility)が提供されています。OS/2サブシステムはセキュリティホールを理由にWindows XP以降はサポートを見送っていますが、POSIXサブシステムはUNIXに似たUI(ユーザーインターフェース)を実現する「Services for UNIX」提供に伴い、INTERIXサブシステムに置き換わりました。ただし、最新のWindows OSには提供されていません(図03)。

図03 Windows NTのサブシステムに関する主な構成です

それまでのWindows OSは、あくまでも特定のハードウェア(PC/AT互換機など)を対象に開発すれば済む話でしたが、移植性を重要視したWindows NTは、MS-DOSなどハードウェア構造の知識を必要としたソフトウェア開発、デバイスドライバー開発を容易にしたのです。