Multics

Multics（マルティックス）は1960年代に開発されたタイムシェアリングオペレーティングシステムであり、後世に多大な影響を与えた。名前は「multiplexed information and computing service」に由来している。プロジェクトは1964年にマサチューセッツ州ケンブリッジで始まった。最後まで使われていたカナダ国防省のシステムは、2000年10月30日に退役した。 Multicsの元の計画と開発は1964年に、MIT（フェルナンド・J・コルバトら）を中心として、AT&Tベル研究所およびゼネラル・エレクトリック (GE) の独創的な共同プロジェクトとして始まった。しかし1969年にベル研が見切りをつけ脱落（これが結果としてUNIXを生んだ）、さらに翌年GEのコンピューター部門がハネウェルにMulticsもろとも買収されている。 MulticsはGEが商品化しようとしており、結果としてハネウェルが商品化したが、あまり成功しなかった。しかし、コンピュータ市場に与えた影響は大きく、様々な斬新で貴重なアイデアが盛り込まれている。 高可用性を目指して様々な機能が盛り込まれ、電話や電力サービスのような「コンピュータ・ユーティリティ」を目標としていた。そのためソフトウェア構造のモジュール化だけでなく、ハードウェアもモジュール化され、必要なリソース(計算機能、主記憶、ディスク装置など)を追加するだけで拡張可能な構造を目指した。ファイル毎のアクセス制御リストによって柔軟な情報共有が可能だが、必要に応じて完全なプライバシーも提供できる。技術者がシステムの性能を分析できる機構も標準で組み込んでいて、様々な性能最適化機構も組み込まれた。 Multicsは単一レベル記憶と呼ばれるデータアクセス法を実装した。これは、（Multicsではセグメントと呼ばれる）ファイルとプロセスのアドレス空間の明確な区別をなくした考え方である。プロセスのメモリはセグメントをそのアドレス空間にマップすることで構成される。その読み書きにはプロセスは通常のCPUの命令を使い、オペレーティングシステムがその更新内容がディスクに反映されるよう働く。POSIXの用語で言えば、これは全てのファイルがmmap()で扱われることと同じである。しかし、MulticsにはUNIXなどにあるようなファイルをマッピングする以外のプロセスのメモリという概念がなかった。「全て」のメモリが何らかのセグメント（ファイル）の一部であり、ファイルシステムに対応する場所が存在する。これはプロセスやカーネルのスタックなどに使われるメモリでも同様である。 この方式の問題点は基本概念の問題ではなく、それが動作していたマシンのアーキテクチャの問題であった。セグメント(ファイル)のサイズが256K×36ビットワード(約1Mバイト)で制限された。従って、それ以上のサイズのファイルを扱うには特別な処理が必要で、これをマルチセグメントファイルと呼んだ。もっとも、巨大なデータベースやグラフィックが使われる以前だったため、この制限にひっかかることはほとんどなかった。 これが動的リンクを生み出した。動作中のプロセスは新たなセグメントをそのアドレス空間に追加するよう要求でき、そのセグメントにはコードが入っていて実行できる。これにより、アプリケーションは最新版のルーチンを自動的に使用可能となり、各ルーチンは別々のセグメントとなっていて、最初にそのルーチンを呼び出そうとしたときに読み込まれるようになった。異なるユーザーが実行させている異なるプロセスの間では、このようなライブラリセグメントの検索ルールを個別に設定でき、ユーザー毎に異なるバージョンのルーチンを自動的に使用することができた。Multicsのセキュリティ機能を適切に設定すると、あるセグメント内のコードが別のプロセス内のデータ構造にアクセスできるという重要な機能もあった。 従って、デーモンとして動作しているアプリケーションがあったとき、別のユーザープロセスが単純に普通の手続き呼び出しを行うと、そのデーモンにアクセスするコードセグメントが動的にリンクされて実行されるといった仕掛けが可能であった。そのようなコードセグメントはデーモンの持つデータ構造を更新することもできる。要求を登録完了したら、制御は元のユーザープロセスのコードに戻される。 Multicsはまた、積極的なオンライン構成変更をサポートした。CPUもメモリバンクもディスクドライブもシステム動作中に追加したり削除したりすることが可能だった。MITのシステムではこれが普通に行われていた。ソフトウェアの開発においてマルチプロセッサシステムを二つに論理的に分割し、一方を新たなOSの評価に使用する。このとき、段階的にリソースを削除していって、通常のタイムシェアリングシステムの構成を小さくし、削除したリソースで2台目のシステムを構成する。この間、タイムシェアリングシステムはそのまま動作し続けていた。これは初期のマルチプロセッサシステムの1つでもあり、今日大型のサーバなどで行われているパーティショニング機能の先駆けでもある。 Multicsはコンピュータセキュリティを考慮して設計された最初のオペレーティングシステムの1つである。しかし、初期のMulticsは何度も侵入されている。そのためさらなるセキュリティ強化が行われた。第二世代のハードウェアではリングプロテクションが導入され、侵入はほとんどなくなった。 階層型ファイルシステムを初めて採用しただけでなく、ファイル名を任意の長さで自由に設定できるようにもなっている。ファイルやディレクトリは複数の名前を持ち(長い名前と短い名前)、ディレクトリ間のシンボリックリンクもサポートされた。今日では一般的なカーネル内でのプロセス毎のスタックも初めて採用され、セキュリティリング毎にスタックが分離された。Multicsの主力開発言語は高級言語のPL/1である。当時高級言語を用いてOSを記述した例はほとんどなく、それはUNIXの初期の実装がアセンブラ上で行われていたことからも窺える。ただし、バロース B5000システムはMulticsに先行してALGOLを使用している。 Multicsは当初GE-645メインフレーム（36ビットシステム）上で開発された。後にハネウェル6180シリーズ上で動作している。UNIX初期の歴史についての重要な著作がある Peter H. Salus は、「彼らはMulticsをもっと多用途で柔軟なオペレーティングシステムにしようとしたが、それはみじめに失敗した」と述べている。しかしそのような見方は、Multicsでの技術革新の多くが現代の商用システムで採用されている現状から見て的を射ていないとされている。 ベル研究所は1969年にプロジェクトから撤退した。当時Multicsに関わっていた人々の一部がUNIXシステムの開発に移行した。Multicsの開発はMITとGEで続けられた。 1970年、ハネウェルはGEのコンピュータ部門を買い取り、1985年ごろまでGEの設計に基づいたシステムを開発し続けた。約80ヶ所の大学や研究所や政府機関でMulticsシステムが稼動した。（Bullとハネウェルの関係で）フランスの大学で1980年代初期にいくつか導入されている。ハネウェルが Multics のサポートをやめると、ユーザーはUNIXなど他のシステムに移行していった。最後まで使われていたカナダ国防省のシステムは、2000年10月30日に退役した。 1985年、NSAのNCSC（国立コンピュータ保安センター）の策定したセキュリティ評価基準 Trusted Computer System Evaluation Criteria（通称オレンジブック）のB2レベルのセキュリティを実装したOSであると認証された。このレベルの認証を受けたのはMulticsが最初である。 Bullは1975年から2000年までヨーロッパでMulticsを販売し、Bull HN Information Systems Inc. がアメリカで販売した。2006年、Bull SAS がMulticsのいくつかのバージョンをオープンソース化した。 当時としては巨大と思われたMulticsのカーネルは、135Kバイト以上のコードで構成されていた。MITに最初に設置されたGE-645の主記憶容量は 512Kワードであり(約2Mバイト)、Multicsはその約10分の1を占めていたに過ぎない。 他の方法で測定すると、OS以外のPL/1コンパイラやユーザーコマンドやライブラリを含めた全コードは1500個のソースモジュールから構成されている。各モジュールが約200行と仮定すると、コンパイルによって生成されるコードは約4.5Mバイトとなる。これは2006年現在の感覚では小さいが、当時としては巨大だった。 Multics のコンパイラはCPU性能を引き出すことよりもコードサイズを小さくするよう最適化されていた。例えば、「オペレータ」と呼ばれる小さなサブルーチンを多用している。コードサイズを小さくするという選択は Multics のような主記憶が高価なマルチユーザーシステムでは良い選択であった。 UNIXに2038年問題があるが、Multicsには1900年1月1日午前0時からのマイクロ秒を刻む52ビットのカウンタがあり、1971年5月11日にMSBが0から1になった。 「Multicsは完成せず出荷されなかった」というのが一般通説だが、これは事実ではない。実際にはGE及びハネウェルから商用製品として販売されており、一定の成果を挙げたようである。 またUNIXとの対比で常に挙げられるパフォーマンスの悪さは、後に1970年半ばから1980年代に至ってハードウェア性能の向上により実使用への影響は小さくなっている。Multicsは新奇なアイデアを貪欲に取り込んだ当時としては先進的なOSであり、現実解で立ち上がった後に肥大したUNIXとの比較はそれほど簡単ではない。 GEのGECOS、ハネウェルのGCOS、日本電気のACOS-6は、Multicsの系統といえるOSである。 Multicsプロジェクトで仕事をしていたケン・トンプソンとデニス・リッチーが最初に開発したUNIXは、コマンドの命名法まで含めた多くの領域でMulticsの影響を示している。例えば、lsコマンドは "list segments" の略であり、Multicsのセグメントを一覧表示するものとして命名された。 最初のUNIXはDECのPDP-7上で実装された。このPDP-7はメモリが8キロワードしかなく、2メガバイトのメモリを有するGE-645にくらべると極めて貧弱な環境であった。このハードウエアー制約のため、UNIXはMulticsで予定されていた機能の大部分を削り、最小限度のシンプルなものにならざるを得なかった。 当初のUNIXはMulticsのようなマルチタスクオペレーティングシステムではなく、一度に一つのプログラムしか実行できないシングルタスクのオペレーティングシステムであった。この特徴から、このOSはカーニハンによって、MulticsのMultiをUniに変えてUnicsと名付けられた。後につづりがUNIXへと変更された。 「UNIXはMuticsを否定するものである」あるいは「正反対の設計思想に基づいて作られた」といわれることがあるが、トンプソンやリッチーはそのような発言をしていない。むしろ、「Multicsで得られた利便性を失いたくなかった」と述べており、Multicsを一部でも取り戻そうとしようとしていたことがわかる。「正反対の設計思想」にしても、そもそも「設計思想」自体があったとも述べられておらず、UNIXがシンプルなものになったのは、ハードウエアー上の制約に適合した結果に過ぎない。 ケン・トンプソンは2007年のインタビューでMulticsについて「設計も開発も何もかもが過剰だった。およそ実用的ではなかった。彼ら (MIT) は未だに大きな成功だったと主張しているが、明らかにそうではない」と述べている。しかし同時に「私が（Multicsの中で）十分採用に値すると考えた機能は、階層型ファイルシステムとシェルだ。シェルはプロセスとして独立していて、好きなものと取り替えることができる」と認めている。 プライムコンピュータ（英語版）のオペレーティングシステムPRIMOS（英語版）を、同社の創業者ウィリアム・ポドスカ（英語版）は「靴箱の中のMultics」(Multics in a shoebox) と称した。ポドスカは後にアポロコンピュータを創業し、そこでAEGISとDomain/OSというオペレーティングシステムを開発したが、それを「マッチ箱の中のMultics」(Multics in a matchbox) と呼んだりした。Domain/OSはMulticsにネットワークとグラフィックス機能を加えたものである。 ストラタスコンピュータ（現ストラタステクノロジー）のオペレーティングシステム Stratus VOS（英語版） はMulticsの強い影響を受けており、ユーザインタフェースも内部構造もよく似ている。Multicsの高信頼性・可用性・セキュリティ機能を強化したもので、高信頼トランザクション処理をサポートするフォールトトレラントシステムで採用されている。VOSはMulticsの直接の子孫として、今も活発に開発が続けられている。 HoneywellのDPS8/M CPUのエミュレータ上でMultics 12.7が動作します. Multicsに関しては様々な文献がある。完全なリストはここにある。最も重要な文献を以下に挙げる。 F. J. Corbató, V. A. Vyssotsky, Introduction and Overview of the Multics System (AFIPS 1965年) システムに関する良い紹介資料 F. J. Corbató, C. T. Clingen, J. H. Saltzer, Multics -- The First Seven Years (AFIPS, 1972年) 長年の使用と改良を経た時点での素晴らしいレビュー Jerome H. Saltzer, Introduction to Multics (MIT Project MAC, 1974年) 実ユーザーによる非常に長いシステム紹介 Elliott I. Organick, The Multics System: An Examination of Its Structure (MIT Press, 1972年) 初期のバージョンに関する標準的資料。ただしここに記されている機能の一部は結局実装されなかった。 V. A. Vyssotsky, F. J. Corbató, R. M. Graham, Structure of the Multics Supervisor (AFIPS 1965年) Multicsカーネルの基本構造 Jerome H. Saltzer, Traffic Control in a Multiplexed Computer System (MIT Project MAC, 1966年6月) カーネルスタック切り替えに関する最初の記述; 情報工学の古典的論文 R. C. Daley, P. G. Neumann, A General Purpose File System for Secondary Storage (AFIPS, 1965年) ファイルシステム、アクセス制御、バックアップ機構について R. J. Feiertag, E. I. Organick, The Multics Input/Output System. 入出力部の詳細について implementation. A. Bensoussan, C. T. Clingen, R. C. Daley, The Multics Virtual Memory: Concepts and Design, (ACM SOSP, 1969年) Multicsのメモリ管理の詳細 Paul Green, Multics Virtual Memory - Tutorial and Reflections Multicsのストレージシステムについての良い資料 Roger R. Schell, Dynamic Reconfiguration in a Modular Computer System (MIT Project MAC, 1971年) 構成変更機能について Paul A. Karger, Roger R. Schell, Multics Security Evaluation: Vulnerability Analysis (Air Force Electronic Systems Division, 1974年) 「タイガーチーム」によるMulticsのセキュリティ破りについて Jerome H. Saltzer, Michael D. Schroeder, The Protection of Information in Computer Systems (Proceedings of the IEEE, 1975年9月) 最初のセキュリティアップグレードの背景となる基本思想について; もう1つの古典的論文 M. D. Schroeder, D. D. Clark, J. H. Saltzer, D. H. Wells. Final Report of the Multics Kernel Design Project (MIT LCS, 1978年) さらなるセキュリティ強化について Paul A. Karger, Roger R. Schell, Thirty Years Later: Lessons from the Multics Security Evaluation (IBM, 2002年) 数十年前のセキュリティ機能が今日の厳しい環境で役に立つかどうかを考察している。Multicsが2002年の多くの商用システムよりもセキュリティが強いと断定している。 池田克夫, コンピュータ・ユーティリティの構造　MULTICSの解剖 (昭晃堂, 1974年)