図1●仮想化の紀元と展開<BR>図中,黒文字は製品関連,青文字は一般用語を示す。
図1●仮想化の紀元と展開<BR>図中,黒文字は製品関連,青文字は一般用語を示す。
[画像のクリックで拡大表示]
写真●System/360 Model 67
写真●System/360 Model 67
[画像のクリックで拡大表示]
図2●CP-67/CMSの論理構成
図2●CP-67/CMSの論理構成
[画像のクリックで拡大表示]
図3●CP-67/CMSの物理構成のイメージ
図3●CP-67/CMSの物理構成のイメージ
[画像のクリックで拡大表示]
図4●サービスVM
図4●サービスVM
[画像のクリックで拡大表示]

 物事を常に抽象化して論理的にとらえるコンピュータの技術史は,基本的に仮想化の歴史である。あらゆる機構が仮想化にかかわっていると言えるが,仮想化技術の範囲をコンピュータ資源管理や運用管理の技術として見たとき,起源はどこまで遡ることができるのであろうか。

CP-67/CMSが紀元

 仮想マシン(Virtual Machine)の紀元が米IBM社の「Control Program-67/Cambridge Monitor System (CP-67/CMS)」にあることは,黎明期からメインフレームにかかわってきたメインフレーマの世代では広く知られた事実である(図1[拡大表示])。

 商用機として最初に導入されたのは,米マサチューセッツ工科大学(MIT)のリンカーン研究所で,1967年4月のことだ。その年の9月には,既に数十台の端末からの同時使用が可能となっていた。CP-67/CMSが初めて動作したハードウェアは,メモリーを仮想化する「DAT(Dynamic Address Translation)」機構を実装した「IBM System/360 Model 67」だった(写真)。構築したのは,米マサチューセッツ州ケンブリッジにあるIBMケンブリッジ・サイエンティフィック・センターである。

 ここで「起源」という言葉を使わずに「紀元」と呼んでいるのは,CP-67/CMSが商用機として仮想マシンの価値を実証した最初のコンピュータであることを明示するためである。これ以前にも,仮想マシンに対する実験的なアプローチはあった。例えばCP-67/CMSの機能自体は,1965年にスタートした実験プロジェクトで,System/360 Model 40(以下S/360)に連想メモリー*1を実装して動的アドレス変換を可能にした修正版「CP-40」でほぼ実現されていた。仮想マシンの用語自体も,IBM 7044の修正版実験機で使われたのが最初である。

 紀元前の神話の世界で育まれてきた仮想マシンの技術は,CP-67/CMSで商用化の途につき,今ではコモディティなコンピュータにまで搭載されるようになった。 

 仮想化技術に挑戦した時代背景については次の二つがあった。(1)タイム・シェアリングと,(2)柔軟な互換性の実現である。

 まずタイム・シェアリングについて述べる。1960年前後は,コンピュータの発明を受けて多くの応用技術が開花し,実績も重ねた時代である。世代区分では第2世代に当たる*2。しかしコンピュータは高価なしろものである。個人で占有できるものではなかった。当然,皆でコンピュータが鎮座する計算センターを共用するのが常であった。

 そこでコンピュータ資源の共用(シェア)を効率的に行うためにモニタやバッチ処理が発明された。これらはセットアップ時間や引き継ぎ時間のロスなどをなくした,コンピュータ史上画期的な仕組みの出現だった。とはいえ,自分が必要な時間に占有できるコンピュータが欲しいユーザーが満足できるわけもない。例えばLISPの発案者であるJohn McCarthy(ジョン・マッカシー)のようなコンピュータ技術の先駆者たちは,自らのアイディアを具現化する専用マシンを欲していた。

 バッチ処理は一般ユーザには偉大な発明であったが,試行錯誤を繰り返す研究開発者にとっては苦痛以外のなにものでもなかった。プログラムの1カ所のほんのわずかなミスで1日が無駄になるなど,許せることではなかったのだ。

 彼らは当時のコンピュータ・コミュニティを構成していた有力ユーザーである。その声の大きさを生かし,マッカシーは複数のユーザが対話型でプログラミングとデバッグを1台のコンピュータで実現するタイム・シェアリングの必要性を訴えた。

 この結果生まれたのが第1世代のタイム・シェアリング・システム(TSS)として名高い「CTSS(Compatible Time-Sharing Systems)」である。CTSSは1961年からIBM 709(その後7090)でタイム・シェアリングを可能にしていた。さらに本格的なタイム・シェアリングシステムを実現するために,MITでMULTICS (Multiplexed Information and Computing Service)プロジェクトがスタートした。

“Virtual Machine”の誕生

 このような背景のもとで誕生したCP-67/CMSは,タイム・シェアリングという用語を用いずにVirtual Machine(以下VM)の言葉を使用した。数学者であり1ユーザーであるマッカシーと違い,IBMケンブリッジ・サイエンティフィック・センターの技術者はコンピュータ業界でのもう一つの大きな設計要件を視野にいれていた。コンピュータの互換性である。コンピュータは第2世代になって数多くの機種が市場に出回るようになっていたが,最先端の技術であったことから,それぞれの機種にさまざま工夫が埋め込まれ,結果として互換性の欠如が大きな問題となっていた。

 1964年4月7日に発表された「S/360」は,命令セット・アーキテクチャを「ROS(Read Only Storage)」に実装したマイクロプログラム(Micro-program)で仮想化し,実装を隠蔽することにより互換性の課題を解決。大幅にハードウェアの性能差のあるファミリー・モデル間(最終的に13モデル)での互換性確立に成功した。S/360では同一世代のファミリー間だけでなく,1401などの旧世代の機種とも互換性を確保していた*3。マイクロプログラムによるエミュレータの実装である。

資源管理と対話プログラムを分離

 CP-67/CMSのアーキテクチャにおける最大の特徴は,その名が示すように,コンピュータ資源を管理するCP(Control Program)と,対話型処理を提供するCMS(Cambridge Monitor System,後にConversational Monitor Systemと改称)の二つの制御プログラムに構造が完全に分離されているところにある(図2[拡大表示])。例えばCMSは,CP-67が出来上がる前にすでにS/360の上で動く独立したOSとしてその動作が確認されていた。基本的には,現在存在する仮想マシンと同じである。

 当時の他のTSSにはこのような考え方を取り入れたものは皆無であった。これによりアーキテクチャは単純なものとなり,開発やテスト,実行環境の最適化などを簡潔化するのに大きく寄与した。この基本的な構造によりCP-67/CMSはTSSの商用機として大きな成功を勝ち取ることができた。

 CP-67/CMSの成功は,そのころ正体のよく分らないものと見なされていた仮想マシンの概念を,IBMとして継続して研究・開発する上で大きな実績となった。タイム・シェアリングの対話環境をCMSというVMで実現し,資源管理をCPがサポートするという考え方は,単なる対話環境だけに留まらずに一般的なソフトウェア環境(OS)をもVMとして実行するというアイデアに自然とつながっていった。

 CPは複数のS/360アーキテクチャ準拠のOSを仮想マシンとして完全にサポ ートし,ホストである物理S/360 Model 67の資源にマップする(図3[拡大表示])。VMはS/360アーキテクチャにおけるProblem Programモード(いわゆるユーザー・モード)で動くので,Supervisorモード(同カーネルモード)で許されるOS特権命令はCPによりトラップされエミュレートされる。S/360 Model 67におけるタイマーなどのすべての割り込みはCPが管理する*4

 CP上で動作する各VMは他のVMから論理的に完全に独立している。VMは制御テーブルで定義した任意のメモリー・サイズやI/Oデバイスを保持する。VMの仮想メモリーはDATの利用によって動的にS/360 Model 67の物理メモリーを共用する。

 DASD(Direct Access Storage Device)に関しては仮想DASDを可能にし,物理DASDを分割して複数のMini Disk*5で使う。カード・リーダーやプリンタ,通信制御などのI/O装置はVMで共用する。CPはコマンドを使うことで,VMすべてのオペレータ制御が可能になっている。例えば「ATTACH」「DETACH」のような拡張CPコマンドにより,VMの構成を動的に変更できる。

 一方のCMSは,個々のタイム・シェアリング・ユーザーと1対1での対話型オペレーションを可能にする,S/360アーキテクチャで動く一つのVM OSという位置付けである。CMSは対話専用のシングル・ユーザー用OSであり,自身では多重処理や複雑なメモリー管理などの資源管理は行わない。CMSはFORTRAN, PL/Iなどの言語処理系やデバッガ,エディタ,EXECプロシージャ(ストアド・プロシージャ),テキスト処理のスクリプト言語などを提供する。