ラベル $OC ADIVAC の投稿を表示しています。 すべての投稿を表示
ラベル $OC ADIVAC の投稿を表示しています。 すべての投稿を表示

2021年6月19日土曜日

[OS][OC] EDVAC~OSの登場(1950)


[OS][OC] EDVAC~OSの登場(1950)
OSの登場
前回とりあげた、MEMEX から NLS の間というのは非常に長い期間になっています。
今回は、前回と同じ期間で、MEMEX から NLS に至る流れとは別の流れ、「OS の登場」を追ってみようと思います。
■BSD
1950年のEDVAC の登場で、コンピュータは「技術」の問題ではなく「学術」的研究という俎上に乗せられることになりました。目指すべき方向性が明確に示されたことの影響は大きく、その方向にしたがってさまざまなアイディアが出されます。
こうして、ハードウェアはすぐに安定し、実用的になります。しかし、同時に新しい問題が出てきました。
プログラムの問題です。それまではハードウェアさえ出来ればさまざまな計算に使えると信じられていたのですが、ここに来てプログラムが想像以上に難しいことがわかったのです。
■自動プログラミング
当時、プログラムを動かすには機械語コードと1対1で対応するアセンブリコードという物を使ってプログラムを行い、人間が自分の手で対応表を引いて数字からなる機械語コードに変換して、それをパンチカードに穿孔してからコンピューターに入力する、という作業が必要でした。
プログラムが難しいのは、このアセンブリコードがあまりにも単純なことしか出来ないためです。そのため、これを英語のような「人間にわかりやすい言葉」で指示することでコンピューターを動かせないか、というアイディアが出てきました。
これは、後に「自動プログラム」と呼ばれるアイディアです。
コンピューターが、自分自身のプログラムを作り上げる。これは夢のようなアイディアです。人間にも難しいことを、人間が作り出した機械にさせることが可能なのでしょうか?
自動プログラムについては、可能論と不可能論が激しく対立しました。
しかし、IBM にとっては、これは同社の有力商品である「コンピューター」の普及のためにも、ぜひ可能であって欲しい技術でした。
そこで、IBM 内で自動プログラムの研究がスタートしたのです。
最初は、とにかく「自動プログラムは可能である」ことを証明することが重要でした。証明と言っても、数学的な証明なんかは必要ではありません。実際に動くシステムを作ればいいだけです。
そこで、もともとコンピューターの得意分野である「数学計算」に的が絞られました。変数を含む複雑な数式を入力し、変数の値を決定してやると、計算結果を表示するプログラム。それが目標でした。
いまでは電卓でも出来るような簡単なことですが、可能かどうかもわからない状況では、十分すぎるほどの研究テーマだったのです。
1957年、システムは完成しました。
数式(FORMULER)を変換(TRANSLATION)するという意味から、「FORTRAN」と呼ばれるその言語は、確かに人間にとってわかりやすい言語を、自動的に機械コードに翻訳(コンパイル)することを可能としたのです。
初期の FORTRAN は制御構造を持たない単純なものでした。
パンチカード1枚に入れられる文字数が 80文字以内に限られていたため、1行は80文字以内に限られました。(現在でも、コンピューターで1行を 80 文字以内にすることが多いのはこの名残)
また、行の先頭に C が来た行は「COMMENT」を意味するなど、文法とは関係のない「決まりごと」も沢山ある言語でした。
それでも、FORTRAN の登場により自動プログラミングが可能であることが示され、COBOL や BASIC 、PL/I などの言語を生み出していくきっかけとなるのです。
■FORTRAN モニター
FORTRAN は、パンチカードの1枚を1行(1命令)として、すべてのカードを読み込ませてから機械コードへの翻訳(コンパイル)を行い、その後翻訳された機械コードを実行させることでプログラムを動作させる仕組みになっていました。
そのため、プログラムの動作まで手間がかかります。それに、まだ当時はコンピューターは高価でしたが、これらの作業をしているあいだ、他の人はコンピューターが空くのを待っていなくてはならなかったのです。
1950 年代末から 60年代前半にかけて、これらの制御もコンピューターにやらせてしまおう、というアイディアが生まれます。
カードの束をセットしてプログラムをスタートさせれば、読み込み・コンパイル・実行を自動で行い、紙テープに結果を出力します。
紙テープ出力後は、すぐに次のカードの束の読み込みにかかります。このため、コンピューターを使いたい人はカードの束をセットしたら、しばらくたって結果を受け取りにいけばいいだけになります。
こうした仕組みは、FORTRAN モニターと呼ばれました。そして、これがいわゆる「OS」の最も原始的な姿です。
MULTICS
1960 年代になると、マサチューセッツ工科大学(MIT)の学生達が、非常にユニークなしかけをソフトウェアで実現します。
タイム・シェアリング・システム(時分割システム。以下 TSS と略称)と呼ばれるそのソフトウェアは、コンピューターの動作を非常に短時間で区切って複数のソフトウェアを動かすことで、複数のプログラムを同時に動かすことが可能でした。
高価なコンピューターを、1台で何台分にも使うことの出来るこのシステムは非常に注目されます。
ここで、MIT の TSS は国防総省高等技術研究局(ARPA)からの援助も受けて、GE(ゼネラル・エレクトリック)や AT&Tなどコンピューターに携わる多くの企業が技術を出し合う一大プロジェクトに発展します。
実際にハードウェアを作成していたのは GE だけなので、GE のコンピューター(GE-635)を改良し、MULTICS に必要な機能を持たせ(GE-645)、その機種をターゲットとして OS として作成が開始されます。
さまざまな最新技術・思想が取り入れられたこのシステムは、1台のコンピューターを複数人数で使うことを目標とし、「複数の」という意味の MULTI から、MULTICS と名付けられていました。
MULTICS は今見ても非常に先進的です。その一例をここに記しておきましょう・・・
すでに、当時は外部記憶装置が実用化されていました。MULTICS では、この外部記憶装置を使いやすくするために、データを「ファイル」という単位で管理する方法を取り入れており、しかも同種のファイルを管理しやすくするための「階層化」の概念まで導入されています。
さらに、ファイルを記憶装置だけではなく、システムを制御するすべての構造に適用するようになっています。たとえば、キーボードやディスプレイと言った装置も「特殊なファイル」という位置づけで、プログラムの入力や出力は、すべて自由なファイルに対して行うようになっていました。
これにより、複数人数で使う際に複数のキーボードやディスプレイを接続していても、システムからは「入出力ファイルが異っている」というだけの扱いで済ませることが出来ます。また、出力をファイルに保存しておいたり、ファイルに収められたデータを処理したりするのにも、特別なプログラムは不要になりました。
さらに、MULTICS では、「すべての記憶領域は、プログラムから見れば同じものである」という、先進的な概念を導入していました。単一レベル記憶、と呼ばれます。
いわゆる RAM で構成されたメインメモリも、外部に接続されたハードディスクも、それをバックアップするテープドライブも、「メモリ」であることに変わりはありません。
これらすべてに連続したメモリアドレスが割り振られ、同じようにアクセスすることが可能です。
ただ、アクセスの際に速度が違ったり、電源を切った時に消えるメモリ/消えないメモリがある、というだけのことです。
もちろん「プログラムから見て」同じであっても、特性は違います。
MULTICS では、動いているプログラムは RAM のアドレスに配置され、何らかの理由で停止するとディスクのアドレスに移動するような仕組みが作られました。これで、メモリを効率よく使えます。
先に書いた「すべてのデバイスはファイルである」ことと組み合わせ、ここに壮大な「単一化」が図られることになります。
全てのコンピューター資源へのアクセスは、メモリへのアクセスと同じように行えるのです。
これにより、TSS の問題点を解決することも出来ました。
たとえば、プログラムが停止したとき、TSS 以前ならば停止した状態のプログラムのメモリを調べることで、異常の原因などを探ることが可能でした。
しかし、TSS 以降は複数人数で限られたメモリを使用するため、停止したプログラムをメモリに留めておくことが難しく、原因調査が行いにくくなっていました。
しかし、先に書いたように MULTICS では、プログラムが停止するとメモリ内容を低速なアドレス…ディスク装置に書きだします。現代的に言えば「コアダンプ」と同じことです。
これにより停止した原因を調査し、修正した後で、もう一度プログラムを「起動」すると、高速なアドレス…内部 RAM にプログラムが移動して動き始めるのです。
メモリとディスク間でのプログラムの移動は、OS が自動的に行うものです。高速なメモリが足りなくなると、一時停止中のプログラムなどは低速なメモリに移動されました。
逆に言えば、メモリが足りないと判っているときは、実行中のプログラムを「一時停止」すれば、OS が適切に処理してくれることになります。
現代的な意味での「仮想記憶」とは異なりますが、きわめて原始的な形の仮想記憶が実現されていたことになります。
仮想記憶は、実際の搭載以上のメモリが存在しているように見せる技術です。アドレス上は存在しますが、実際には存在しないため、余りアクセスがないメモリ内容をディスク上に置くことになります。
MULTICS では、アドレスの位置によって内部メモリやディスクを区別できましたが、仮想メモリではどのアドレスが RAM で、どのアドレスがディスクに割り当てられているのか、単純には区別できません。
TSS では、複数人数で使うにもかかわらず、セキュリティ対策は全くされていませんでした。
TSS を作成した MIT の「ハッカー」たちの倫理では、すべての資源は共有するのが当たり前でした。また、他人に危害を加えることは恥ずべきことでした。
ですから、TSS ではセキュリティなど考慮する必要はなかったのです。
しかし、それはハッカーが狭いコミュニティに住んでいたから大丈夫だっただけの話。MULTICS では、セキュリティにも非常に気を使っていました。ファイルはアクセス制限がつけられ、自由な閲覧を許可することもできる一方、誰にも見せないことも可能でした。
結局、MULTICS では、「メモリ」「外部記憶」「周辺機器」などの、コンピューターを構成するさまざまな要素を「ファイル」という、仮想的な単一要素にまとめてしまい、さらにそのファイル単位でのアクセス制限機能を付けたことになります。これは、近代的な OS の最初の形でした。
MULTICS には先進的で非常に優れた機能が多数盛り込まれました。そのため、開発も難航していました。
開発は 1964年に始まりましたが、5年たっても終わりません。そして、その5年目には AT&T が見切りをつけ、プロジェクトから手を引きます。
さらに翌1970年には、GE のコンピューター部門がハネウェル社に売却されます。
世間的には、「MULTICS プロジェクトは失敗した」ように思われました。
僕もそう思っていました。このページは 1999 年に記述しましたが、その後 2013年まで、「MULTICS は失敗だった」との記述のままでした。
2013年以前に記述が間違いであることを知ったのですが、忙しくて修正しないまま、不正確な風説を流し続けていたことをお詫びいたします。
(さらに追記:2015年まで、MULTICS が GECOS に変化した、という記述でしたが、これも誤りでした)
MULTICS に関与した会社が次々手を引いたため、「MULTICS は開発に失敗し、出荷されなかった」という風説を産んでいます。
実際には、ハネウェルは GE のコンピューター部門を合併した直後から MULTICS システムを販売しています。
ハードウェアは GE-645から、後継機であるハネウェル 6180に変更されています。
これは 6080 に、GE-645 に施したのと同じような改良をしたマシン。
MULTICS は、最終的には大学や政府機関、会社など、85個所程度で使われた、とのこと。
当時の大型コンピューターとしては、まずまずの「成功」です。
1985年には NSA (国家安全保障局)が認める「安全な OS」の第1号に選定されています。
しかし、その1985年に、ハネウェルは MULTICS の販売を終了。それまで使用していた機関などは、Unix などにシステム変更していきました。
ヨーロッパではライセンス供与を受けたフランス企業「ブル」が 1975年から MULTICS の販売を始め、ハネウェルの販売終了後の 1991 年にはコンピューター部門を買い取り、2000年までサポートを続けました。
2000年10月30日、カナダの国防総省で使われていた「最後の MULTICS システム」が停止されます。これで、サポートも終了。
現在、ブルは MULTICS をオープンソース化しています。
以下は余談になりますが、以前に「MULTICS は GECOS として販売されていた」と書いてしまっていたので。
MULTICS の「経験を活かして」、GE が作った別 OS が GECOS です。
GECOS は、ハネウェル買収後に GE の名前を外され、GCOS となります。
MULTICS が動作した GE-645 の一部機種には、メモリアドレスの扱いを変更するための、ハード的な切り替えスイッチがついていたそうです。
これで、GE-635 互換モードを選ぶと、GECOS も動作します。そのほかの後継機種でも GECOS が動作します。しかし、MULTICS は GE-645 以外の機種では動きません。
ハネウェル売却後も事情は同じで、6000シリーズでは GCOS が動きますが、6180 でのみ、MULTICS が動きます。
また、日本ではハネウェルと提携していた NEC と、GE と提携していた東芝が、共同で GCOS 互換の ACOS を作成し、販売しています。GCOS は OS の名前ですが、ACOS は GCOS 互換の OS を動作させるコンピューターの名前にもなっています。
東芝と NEC が共同作業をしたのには深いわけがあって、ここら辺の話も面白いのですが、話題を逸れてしまうので割愛。
気になる人は「三大コンピューターグループ」を検索してみましょう。
東芝はすでに撤退しましたが、NEC の ACOS シリーズは続いています。
まとめると、GCOS ≒ ACOS ですが、GCOS ≠ MULTICS です。
■UNIX
1969年 AT&T ベル研究所のKen Thompsonが、自分の趣味で中古のミニコンピューター PDP-7 を買ってきました。
AT&T はMULTICS の開発が長引いたため、撤退を決めました。しかし、AT&Tから参加していた Ken は、MULTICS に未練を感じていました。
なぜなら、彼は MULTICS で作成した「宇宙旅行ゲーム(Space Travel)」を非常に気に入っていたのです。MULTICSプロジェクトから撤退してしまった今では、あの面白いゲームが遊ぶことが出来ません。
宇宙旅行ゲームではなく、宇宙戦争ゲーム(Spacewar!)とする説もあります。
しかし、UNIX 開発者の一人、デニス・リッチーのホームページには、問題となるゲームが宇宙旅行ゲームであり、宇宙戦争ゲームとは異なるゲームだとはっきり書かれています。
もっとも、宇宙旅行ゲームとほぼ同時期に宇宙戦争ゲームの UNIX 移植も行ったとも書かれていますので、UNIX 開発メンバーが宇宙戦争ゲームのことを知っていたのは事実のようです。
買ってきた PDP-7 は、このゲームをなんとか移植して遊ぶための物でした。しかし、ここで彼は問題に気づきます。PDP-7 には、MULTICS のような優れたシステムが無かったのです。
彼は、ゲームのために MULTICS のようなシステムを PDP-7 で作ることにしました。しかし、MULTICS ほどのものは必要ありません。どうせ趣味なのですから。
そこで、彼は MULTICS のなかから気に入った機能だけを選び出して、小さな一人用システムを作り上げ、UNIX と名付けます。UNI とは、「ひとつの」という意味で、MULTI の対義語でした。つまり、このシステムは MULTICS のパロディ版なのです。
UNIX には、TSS や階層化ファイルシステム、周辺デバイスをすべてファイルに見せる仕組み、コアダンプなどが取り入れられました。
その反面、複数人数で使うためのセキュリティ機構などは無視された作りとなっていました。もともとゲームが遊べれば十分でしたから、セキュリティなんて不要なのです。
しかし、この UNIX システムは、彼一人で使うにはもったいないシステムでした。彼は快く仲間の研究者にシステムを開放します。彼らのグループはこのシステムに手を加え続け、十分実用になるシステムに育て上げます。そして、セキュリティは甘いながらも、結局複数人数が同時に使えるシステムへと発展を遂げるのです。
UNIX の開発を開始してからまもないうちに、UNIX を PDP-11 に移植することになりました。PDP-11 は PDP-7 の後継機で、性能もずっと上がっています。みんなが使い始めたシステムをいつまでも中古の PDP-7 で動かしているよりも、性能の良いマシンに移植しよう、というアイディアでした。
しかし、PDP-11 は PDP-7 の後継機とはいっても、まったく同じプログラムが動くわけではありません。プログラムには大幅な手直しが必要です。
彼らのグループは、ここでちょっと工夫を凝らすことにしました。
FORTRAN から始まった「プログラム言語」は、その後の研究で必要な機能が整理され、「構造化言語」というブームを興していました。構造化言語の特徴は、コンパイラのプログラムが作りやすく、その言語で書かれたプログラムが非常に整理されていてわかりやすいことです。
そこで彼らは、この構造化言語の流れを汲む言語を新たに作り、UNIX をその言語で書き直すというアイディアを思いつきました。
まず、構造化言語 BCPL の機能を単純化した「B」という言語を UNIX 上で作り、その機能を強化して「C」言語を作ります。
ついで、C 言語を C 言語自身で書き直します。ここまでは PDP-7 上の UNIX で作られました。ここまでが第1段階。
次いで、UNIX 自身を C 言語で書き直します。まずは、単純でも良いから PDP-7 で動く UNIX とほぼ同等なものを。
C 言語は UNIX 上で C 言語を使って開発され、UNIX は その C 言語で開発される。とにかくこの関係がちゃんと動くようになるまでが第2段階です。
これで、新しい言語である「C」と、この言語で書かれた UNIX ができ上がりました。
ここまで来れば後は簡単です。C 言語を改良して、PDP-11 の機械語コードを出力できるようにします。そして、UNIX と C 言語自身を PDP-11 用にコンパイルし直せば作業は終了です。
こうして、UNIX は、そのシステムがターゲットとしたシステムから別のシステムへ、無事に移植が終了したのです。そして、この開発方針を守っていけば、いつかさらに強力なコンピューターに移植することも可能だ、という保証を手に入れたことにもなります。
これまでは、プログラムというのはあくまでも「ハードウェアのおまけ」でしかありませんでした。しかし、ここでついにプログラムがハードウェアからの独立を果たしたのです。
■BSD
AT&T は、この UNIX システムを商売に出来ないか、と考えました。当然のことです。
しかし、AT&T は大企業過ぎる余り、反トラスト法(日本の独占禁止法)によって、電話事業以外への事業展開が禁じられていました。
そこで、AT&T はこの優れたシステムを、公共機関にかぎって無料で配布することにしました。とにかく広めておけば、あとでコンピューター業界に乗りだすことが可能になったときに、商売につながるかもしれません。
そんなとき、ちょうど ARPA が、政府と研究機関を結ぶ新しいコンピューターネットワーク「ARPA-NET」の研究を開始していました。
ARPA-NET は、従来のように中枢コンピューターにデータを蓄積するのではなく、ネットワークで結ばれたコンピューターそれぞれが協調して動作するシステムです。これは、核兵器によって、1つの基地が壊滅的な打撃を受けたときでも残りのネットワークが動作できるようにするための、重要な研究でした。
そして、ARPA は、この研究をカリフォルニア大学バークレー校に依託します。
追記 2020.5.27
このページ、20年以上前に書いたもので、間違った記述多いです。すみません…
上に書いてある「核攻撃に耐えられるネットワーク」は、実際に研究されたのですが、ARPA-NET とは別のものです。
詳細は、ポール・バランの誕生日記事に書いてあります。
バークレー校では、この研究を行うために UNIX を使用することにしました。無料で入手でき、わかりやすい言語でかかれたこの OS ならば、必要に応じて独自に改良することも可能だったのです。
こうして、バークレーの学生達によって、UNIX にさまざまなネットワーク機能が付け加えられました。
こうして作られた UNIX は、「Barkley Softwear Distribute UNIX」、略称 BSD UNIX と呼ばれるようになります。(現在のBSD)
この後、BSD の先進機能は本家も真似するようになり、AT&T UNIX (System V) と BSD という二つの流れを作るようになるのです。
こうして、現在でも広く使われている UNIX OS が生まれ、次いで さまざまな OS が生み出されていくことになります。
AT&T はこの後分割され、UNIX のライセンス供給を開始します。それは同時に、BSD UNIX を「海賊版」としてしまうことでもありました。BSD は、AT&T UNIX の派生品でありながら AT&T のライセンスを受けていないのです。
実際には、BSD もライセンス供与のもとで作成されていました。ただし、AT&Tがコンピューター事業をできなかったことから、教育機関向けに非常に安価なライセンスで許可されたものでした。
AT&T分割後は、コンピューター事業を行えるようになったため、ライセンス料を引き上げようとして訴訟となります。
このときの騒ぎが、AT&T の UNIX に反対し、同等品を作り上げてしまおうという活動、「GNU」(GNU is Not UNIX の略)の開始にも関係してきます。また、BSD が「UNIX」という名前を捨てた直接原因でもあります。
BSD とともに始まった ARPA ネットは後の インターネットに成長するのですが、この段階ではまだ Ethernet などは使われておらず、まだ「原形」としての形すら見えていません。
ここら辺の話は、また別の機会に。
参考文献
林檎百科?マッキントッシュクロニクル?
FORTRAN 77
TransTECH 創刊号
前ページ 1 2
(ページ作成 1999-06-09)
(最終更新 2020-05-27)
第3版 …他の版 初版 2版

魔法使いの森
https://www.wizforest.com/
https://www.wizforest.com/OldGood/