Amoeba (オペレーティングシステム)
Amoeba (Amoeba分散オペレーティングシステム、The Amoeba Distributed Operating System) は、マイクロカーネルの設計思想に基づいたオープンソースの分散オペレーティングシステム (分散OS) である。
オランダのアムステルダム自由大学のアンドリュー・タネンバウム教授、および彼の研究室の博士課程の学生であった Frans Kaashoek 、Sape J. Mullender 、Robbert van Renesse などの人々によって、開発された。
Amoebaプロジェクトの主な目標は、ネットワークにつながった複数のコンピュータ全体を、あたかも一つのコンピュータシステムであるように利用者が扱えるような、タイムシェアリングシステム (TSS) を構築することであった。
第2の目標は、分散型の並列プログラムを作成するための基本実験環境を提供することであった。
1983年までに、最初のプロトタイプである Amoeba 1.0 が使用可能になった。
数年後に、欧州共同体 (EC) の後援を受けて広域分散システムのプロジェクトとして、欧州各国の各サイトで使われるようになった。
このときのバージョンは、Amoeba 3.0 であった。
Amoebaは、C言語を使って開発された。
Amoebaは、およそ5年の期間にわたり、学術組織、企業、各国の政府組織などの人々によって、利用された。
Amoebaの開発は、現在は停止しているようである。
最新バージョン (5.3) を構成するファイルの最終更新日付は2001年2月12日である。
Amoebaは、複数のプラットフォームで動作する。
動作するプラットフォームには以下のものが含まれる。
Amoebaでは、複数の異なるプラットフォームのコンピュータ群を、あたかも一つのコンピュータシステムであるかのように、構成できる。
Amoebaの利用者は、ハードディスクを備えていないコンピュータを通してもAmoebaを使うことができる。
Amoebaを構成する他のコンピュータは、必要に応じていくつかのプロセサを提供する。
Amoebaにおいては、プロセサはプロセサ・プールに配置される。
プロセサ・プールは多くのプロセサから成っている。
プロセサ・プールに含まれるプロセサは、おのおの異なるアーキテクチャであってよい。
また、プロセサ・プールに含まれるプロセサは地理的に分散していてもよく、異なる国々に配置されていてもよい。
プロセサは、プロセサ・プールから必要に応じて提供され、必要がなくなれば解放 (返却) される。
ファイルサーバのサービス、ディレクトリサービス、データベースのような専用のサービスは、専用のコンピュータが提供することが多い。
Amoebaを利用するための端末は、典型的には大きなビットマップディスプレイとマウスを備えたX端末である。
アムステルダム自由大学では、およそ80のSPARCのコンピュータでAmoebaを構成しており、おのおののコンピュータはイーサネットでネットワークを構成していた。
Amoebaは、オブジェクトに基づいた思想で設計されている。
Amoebaにおけるオブジェクトは抽象データ型である。
Amoebaを構成するおのおののオブジェクトは、それぞれが何らかの能力をAmoebaに提供する。
おのおののオブジェクトは、アプリケーションソフトウェアからは、遠隔手続き呼出し（RPC、リモートプロシージャコール） を通して利用される。
セキュリティについては Capability-based security のコンセプトにもとづいており、オブジェクトは、ケーパビリティ (capability) という特別なチケットを用いた均一な方法で命名、保護される。
Amoebaのプロセス管理を説明する。
Amoebaのプロセスは、基本的にアドレス空間とそこで実行するスレッドの集合である。
プロセスは、Amoebaではオブジェクトの一つとして認識される。
プロセスは、複数の子プロセスを生成することができる。
生成された子プロセスは、さらに複数の孫プロセスを生成することができる。
すなわち、Amoebaではプロセスは、UNIXやMS-DOSと同じように、木構造を構成する。
親プロセスは、生成した子プロセスを、一時停止、再開、消滅させることができる。
Amoebaのプロセスの生成は、UNIXのそれとは異なる。
UNIXでは、子プロセスを生成する際に、親プロセスが自分のプロセスのメモリイメージのコピーを生成して (fork) 、その後にコピーを指定したプログラムに差し替えて (exec) いる。
この方式は、非常に大きなオーバーヘッドをともなう。
Amoebaでは、こうした方式は採っていない。
Amoebaでは、意図したメモリ・イメージを使って特定のプロセサ上で最初から正しく開始するような新しいプロセスの生成が、可能である。
親プロセスと子プロセスは、ともに並列に実行することが可能である。
Amoebaではプロセスは、少なくとも一つの、あるいは複数の、スレッドをもつ。
Amoebaでは、マルチスレッドによるプログラミングが可能である。
プロセスは、実行中に自分のスレッドを生成したり、自分のスレッドを終了したりすることができる。
すなわち、プロセスの実行中には、そのプロセスに属するスレッドの数は、あたりまえに増減しうる。
スレッドは、それぞれに固有のスタックをもつ。
スレッドを同期させる方法としては、シグナルとミューテックスとセマフォの3つの方法を、提供している。
スレッドはすべてカーネルが管理している。
カーネルによるスレッドのスケジューリングは、優先順位に基づく。
Amoebaのメモリ管理は、とても単純である。
プロセスは、希望する個数のセグメントを所有し、プロセスの仮想アドレス空間のどこにでも望むところに配置することが可能である。
セグメントは、ページングされることはない。
セグメントは、完全に主記憶装置 (メインメモリ) 上に常駐する。
さら、メモリ管理ユニット (MMU) というハードウェアを使っており、おのおののセグメントは隣接して主記憶装置上に配置される。
このため、Amoebaでは、プロセスの実行が、遠隔手続き呼び出し (RPC、リモートプロシージャコール) をともなう場合も含めて、高速である。
また、ページング方式を実装する必要がないので、Amoebaの設計が簡単になり、カーネルも小さくなって管理が易しくなる。
Amoebaは、マイクロカーネルの思想に基づいて設計されている。
Amoebaのマイクロカーネルのアーキテクチャは、クライアントサーバモデルである。
Amoebaは、プロセサごとに実行するマイクロカーネルと、サーバ群から、構成される。
サーバ群は、マイクロカーネルとは別のシステムソフトウェア群であり、従来のオペレーティングシステム (OS) が提供する機能のほとんどを、提供する。
Amoebaのマイクロカーネルには、次の4つの重要な機能がある。
従来のオペレーティングシステム (OS) の機能 (ファイルシステムを管理する機能など) のほとんどは、Amoebaでは、マイクロカーネル外部でプロセスとして動作するサーバ群によって実装された。
Amoebaのすべてのサーバは、一連のスタブ手続きで定義されている。
スタブは、初期に開発されたサーバについてはC言語で、後に開発されたサーバはAIL (Amoeba Interface Language, Amoebaインタフェース言語) で、定義されている。
AILで定義されたスタブは、スタブ定義がAILコンパイラによって変換 (コンパイル) されてスタブ手続きの形でライブラリにまとめられているので、クライアントから使うことができる。
重要なサーバとしては次のようなものがある。
このほか、ディスク入出力、その他の装置との入出力、乱数生成、電子メールの送受信などを行うサーバ群がある。
Amoebaは、通信形態として、2地点間のメッセージ通信を使った遠隔手続き呼び出し (RPC、リモートプロシージャコール) とグループ通信の、2つの通信形態をサポートしている。
この2つの通信形態は、通信プロトコルとして Fast Local Internet Protocol (FLIP) を使う。
Amoebaは、世界的なインターネットに参加することができる。
また、Amoebaを構成する複数のコンピュータは、いくつかのドメインに分割される。
一つのドメイン内 (一般的には一つのローカルエリアネットワーク (LAN) ) において、サービスを提供するコンピュータは、ネットワークブロードキャストを使って、サービスを提供する。
ネットワークブロードキャストによって、サービスを提供するサーバのコンピュータのアドレスが特定される。
ドメイン間の通信に関しては、予め登録サービスに明示的に登録しておく必要がある。
ドメイン内の通信は、プロクシサーバを介して送受信される。
こうした方式には次のような利点がある。遠隔手続き呼出し（RPC、リモートプロシージャコール）は、2地点間の通信であり、クライアントがサーバに要求 (リクエスト) メッセージを送信し、そしてサーバがクライアントに応答 (レスポンス) メッセージを返信する、というように構成されている。
クライアント側は、要求メッセージをサーバに送信すると、サーバから応答メッセージを受信するまで、ブロックされる。
標準的なサーバごとに、クライアントから呼び出すためのインタフェースが定義されている。
クライアントは、このインタフェースにしたがって、スタブを通して、サーバと通信する。
クライアントは、スタブのインタフェースに定義されたとおりに、サーバに引数を含んだ要求メッセージを送信し、スタブのインタフェースに定義されたとおりの形式で、サーバから応答メッセージを受信する。
Amoebaのグループは、なんらかの作業を行ったり、サービスを提供するために、協力している1個以上のプロセスから、構成される。
グループ通信は、グループが信頼性のある方法でグループとしての処理を実行するための、通信形態である。
グループ通信の基本的な機能としては、次のようなものがある。
グループ通信の実装の基本をなす重要な考え方は、「信頼性のある同報通信 (reliable broadcasting) 」である。
グループ通信のプロトコルは、"k" 個のプロセサ群の損失 (クラッシュ) に耐えるように設計されている。
グループの作成時には、この "k" という弾性係数を指定する。
"k" の大きさにしたがって、Amoebaはプロセサの冗長度を増減させる。
冗長度が増えると、耐故障性は高くなるが、実行は遅くなる。
Fast Local Internet Protocol (FLIP) は、ネットワーク層における通信プロトコルであり、Amoebaで使われている。
FLIPは、Amoebaの開発中に、並行して開発された。
Amoebaを構成するコンピュータ群は、すべてFLIPを使って相互に通信を送受信する。
概念的には、Amoebaでのネットワーク層プロトコルを、FLIP以外のIPなどの別のネットワーク層プロトコルに置き換えることは、可能である。
FLIPは、Amoeba以外のシステムでも実装することが可能である。
実際にUNIXで動くFLIPが実装されている。
すなわち、AmoebaとUNIXコンピュータの間でFLIPを使って通信することが可能であるし、さらにはAmoebaに依存せず、UNIXコンピュータ同士でFLIPを使って通信することも可能である。
またアンドリュー・タネンバウムは、FLIPの「MS-DOS用のバージョンを作れないという理由は見当たらない。」と述べている。
FLIPは、通信プロトコルの一式であり、次に示す要件を満たすように設計された。
FLIPでは、1GBまでの大きさのデータグラムを扱うことができる。
FLIPの上位層でTCP/IPやTCP/IPを基盤とするプロトコルを動作させることができる。
このようにしてAmoebaは、TCP/IPネットワークに参加することができる。
オブジェクト指向スクリプト言語Pythonは、もともとは、Amoebaプラットフォーム向けに開発された。