Amoeba (オペレーティングシステム)

**Amoeba** (**Amoeba分散オペレーティングシステム**、The Amoeba Distributed Operating System) は、マイクロカーネルの設計思想に基づいたオープンソースの分散オペレーティングシステム (分散OS) である。
オランダのアムステルダム自由大学のアンドリュー・タネンバウム教授、および彼の研究室の博士課程の学生であった Frans Kaashoek 、Sape J. Mullender 、Robbert van Renesse などの人々によって、開発された。
Amoebaプロジェクトの主な目標は、ネットワークにつながった複数のコンピュータ全体を、あたかも1つのコンピュータシステムであるように利用者が扱えるような、タイムシェアリングシステム (TSS) を構築することであった。
第2の目標は、分散型の並列プログラムを作成するための基本実験環境を提供することであった。

## 概要
1983年までに、最初のプロトタイプである Amoeba 1.0 が使用可能になった。
数年後に、欧州共同体 (EC) の後援を受けて広域分散システムのプロジェクトとして、欧州各国の各サイトで使われるようになった。
このときのバージョンは、Amoeba 3.0 であった。
Amoebaは、C言語を使って開発された。
Amoebaは、およそ5年の期間にわたり、学術組織、企業、各国の政府組織などの人々によって、利用された。
Amoebaの開発は、現在は停止しているようである。
最新バージョン (5.3) を構成するファイルの最終更新日付は2001年2月12日である。

Amoebaは、複数のプラットフォームで動作する。
動作するプラットフォームには以下のものが含まれる。
* SPARC
* Intel 80386
* Intel 486
* MC68030
* Sun-3/50
* Sun-3/60
* VAX
Amoebaでは、複数の異なるプラットフォームのコンピュータ群を、あたかも1つのコンピュータシステムであるかのように、構成できる。

Amoebaの利用者は、ハードディスクを備えていないコンピュータを通してもAmoebaを使うことができる。
Amoebaを構成する他のコンピュータは、必要に応じていくつかのプロセサを提供する。
Amoebaにおいては、プロセサはプロセサ・プールに配置される。
プロセサ・プールは多くのプロセサから成っている。
プロセサ・プールに含まれるプロセサは、おのおの異なるアーキテクチャであってよい。
また、プロセサ・プールに含まれるプロセサは地理的に分散していてもよく、異なる国々に配置されていてもよい。
プロセサは、プロセサ・プールから必要に応じて提供され、必要がなくなれば解放 (返却) される。
ファイルサーバのサービス、ディレクトリサービス、データベースのような専用のサービスは、専用のコンピュータが提供することが多い。

Amoebaを利用するための端末は、典型的には大きなビットマップディスプレイとマウスを備えたX端末である。

アムステルダム自由大学では、およそ80のSPARCのコンピュータでAmoebaを構成しており、おのおののコンピュータはイーサネットでネットワークを構成していた。

Amoebaは、オブジェクトに基づいた思想で設計されている。
Amoebaにおけるオブジェクトは抽象データ型である。
Amoebaを構成するおのおののオブジェクトは、それぞれが何らかの能力をAmoebaに提供する。
おのおののオブジェクトは、アプリケーションソフトウェアからは、遠隔手続き呼出し（RPC、リモートプロシージャコール） を通して利用される。
セキュリティについては Capability-based security のコンセプトにもとづいており、オブジェクトは、ケーパビリティ (capability) という特別なチケットを用いた均一な方法で命名、保護される。

## Amoebaのプロセス管理
Amoebaのプロセス管理を説明する。

Amoebaのプロセスは、基本的にアドレス空間とそこで実行するスレッドの集合である。

プロセスは、Amoebaではオブジェクトの一つとして認識される。
プロセスは、複数の子プロセスを生成することができる。
生成された子プロセスは、さらに複数の孫プロセスを生成することができる。
すなわち、Amoebaではプロセスは、UNIXやDOSと同じように、木構造を構成する。
親プロセスは、生成した子プロセスを、一時停止、再開、消滅させることができる。
Amoebaのプロセスの生成は、UNIXのそれとは異なる。
UNIXでは、子プロセスを生成する際に、親プロセスが自分のプロセスのメモリイメージのコピーを生成して (fork) 、その後にコピーを指定したプログラムに差し替えて (exec) いる。
この方式は、非常に大きなオーバーヘッドをともなう。
Amoebaでは、こうした方式は採っていない。
Amoebaでは、意図したメモリ・イメージを使って特定のプロセサ上で最初から正しく開始するような新しいプロセスの生成が、可能である。
親プロセスと子プロセスは、ともに並列に実行することが可能である。

### Amoebaのスレッド
Amoebaではプロセスは、少なくとも1つの、あるいは複数の、スレッドをもつ。
Amoebaでは、マルチスレッドによるプログラミングが可能である。
プロセスは、実行中に自分のスレッドを生成したり、自分のスレッドを終了したりすることができる。
すなわち、プロセスの実行中には、そのプロセスに属するスレッドの数は、あたりまえに増減しうる。
スレッドは、それぞれに固有のスタックをもつ。
スレッドを同期させる方法としては、シグナルとミューテックスとセマフォの3つの方法を、提供している。
スレッドはすべてカーネルが管理している。
カーネルによるスレッドのスケジューリングは、優先順位に基づく。

## Amoebaのメモリ管理
Amoebaのメモリ管理は、とても単純である。
プロセスは、希望する個数のセグメントを所有し、プロセスの仮想アドレス空間のどこにでも望むところに配置することが可能である。
セグメントは、ページングされることはない。
セグメントは、完全に主記憶装置 (メインメモリ) 上に常駐する。
さら、メモリ管理ユニット (MMU) というハードウェアを使っており、おのおののセグメントは隣接して主記憶装置上に配置される。
このため、Amoebaでは、プロセスの実行が、遠隔手続き呼び出し (RPC、リモートプロシージャコール) をともなう場合も含めて、高速である。
また、ページング方式を実装する必要がないので、Amoebaの設計が簡単になり、カーネルも小さくなって管理が易しくなる。

## Amoebaマイクロカーネル
Amoebaは、マイクロカーネルの思想に基づいて設計されている。
Amoebaのマイクロカーネルのアーキテクチャは、クライアントサーバモデルである。
Amoebaは、プロセサごとに実行するマイクロカーネルと、サーバ群から、構成される。
サーバ群は、マイクロカーネルとは別のシステムソフトウェア群であり、従来のオペレーティングシステム (OS) が提供する機能のほとんどを、提供する。
Amoebaのマイクロカーネルには、次の4つの重要な機能がある。
# プロセスとスレッドの管理
# 下位のメモリ管理機能の支援
# 通信の支援
# 下位の入出力処理

## Amoebaサーバ
従来のオペレーティングシステム (OS) の機能 (ファイルシステムを管理する機能など) のほとんどは、Amoebaでは、マイクロカーネル外部でプロセスとして動作するサーバ群によって実装された。

Amoebaのすべてのサーバは、一連のスタブ手続きで定義されている。
スタブは、初期に開発されたサーバについてはC言語で、後に開発されたサーバはAIL (Amoeba Interface Language, Amoebaインタフェース言語) で、定義されている。
AILで定義されたスタブは、スタブ定義がAILコンパイラによって変換 (コンパイル) されてスタブ手続きの形でライブラリにまとめられているので、クライアントから使うことができる。

重要なサーバとしては次のようなものがある。
; ブレット・サーバ (bullet server)
: ファイルサーバとしての役割を果たす。ファイルの管理、生成、読み取り、削除などを行う基本命令を提供する。
; ディレクトリ・サーバ (directory server)
: 「ソープ・サーバ (soap server) 」とも呼ばれる。ディレクトリやパス名を管理する。
; 複製サーバ (replication server)
: ディレクトリ・サーバが管理するオブジェクト群の複製を行う。この複製はバックグラウンドで自動的に行われる (遅延複製) 。このサーバは、世代機構とガーベジコレクション機構を備えており、使われなくなったと判断されたオブジェクトに対しては、ガベージコレクタが起動される。
; 実行サーバ (run server)
: プロセスの起動を行う際に、そのプロセスをAmoebaを構成するコンピュータ群のうちどのコンピュータ上で実行するかの、決定を支援する。コンピュータが異なれば、プロセサのアーキテクチャは異なる。プロセサアーキテクチャによっては、起動対象となったプロセスが動かないことがある。またコンピュータごとに、プロセサの負荷状況も異なるし、主記憶装置 (メインメモリ) の空き容量も異なる。こうした条件をもとに、プロセスを実行するのに最適なコンピュータを選択する。
; ブートサーバ (boot server)
: 実行されていると想定されているサーバが実際に動作しているかどうかを調べ (サーバが停止していないかの監視) 、もし動作していなかった場合は、しかるべき措置 (該当サーバの起動など) をとる。実行されていると想定されているサーバが、実際に正常に動作している場合は、なにも行わない。ブートサーバ自身が正常に動作しなくなる場合に備えて、ブートサーバ自身の複製をすることができる。
; TCP/IPサーバ (TCP/IP server)
: AmoebaがTCP/IPの通信プロトコルを使って、別のコンピュータと通信する機能を提供する。これによりAmoebaは、X端末との接続、Amoebaではないシステムのコンピュータとの通信、インターネットへの接続が、可能になる。TCP/IPサーバは、後述するFLIPよりも効率は良くないので、FLIPが使えない場合にのみ、このサーバが使われる。
このほか、ディスク入出力、その他の装置との入出力、乱数生成、電子メールの送受信などを行うサーバ群がある。

## Amoebaの通信
Amoebaは、通信形態として、2地点間のメッセージ通信を使った遠隔手続き呼び出し (RPC、リモートプロシージャコール) とグループ通信の、2つの通信形態をサポートしている。
この2つの通信形態は、通信プロトコルとして Fast Local Internet Protocol (FLIP) を使う。

Amoebaは、世界的なインターネットに参加することができる。
また、Amoebaを構成する複数のコンピュータは、いくつかのドメインに分割される。
1つのドメイン内 (一般的には1つのローカルエリアネットワーク (LAN) ) において、サービスを提供するコンピュータは、ネットワークブロードキャストを使って、サービスを提供する。
ネットワークブロードキャストによって、サービスを提供するサーバのコンピュータのアドレスが特定される。
ドメイン間の通信に関しては、予め登録サービスに明示的に登録しておく必要がある。

ドメイン内の通信は、プロクシサーバを介して送受信される。
こうした方式には次のような利点がある。

* ドメイン内の通信は、最大限の速度で、プロセス切り替えなしで、行われる。
* 遠隔のコンピュータとの通信は、ドメイン内のクライアントとサーバとの間の通信と、何ら異なることはない。どちらも同じ遠隔手続き呼び出し (RPC、リモートプロシージャコール) のプロトコルで通信が行われる。

### 遠隔手続き呼出し
遠隔手続き呼出し（RPC、リモートプロシージャコール）は、2地点間の通信であり、クライアントがサーバに要求 (リクエスト) メッセージを送信し、そしてサーバがクライアントに応答 (レスポンス) メッセージを返信する、というように構成されている。
クライアント側は、要求メッセージをサーバに送信すると、サーバから応答メッセージを受信するまで、ブロックされる。
標準的なサーバごとに、クライアントから呼び出すためのインタフェースが定義されている。
クライアントは、このインタフェースにしたがって、スタブを通して、サーバと通信する。
クライアントは、スタブのインタフェースに定義されたとおりに、サーバに引数を含んだ要求メッセージを送信し、スタブのインタフェースに定義されたとおりの形式で、サーバから応答メッセージを受信する。

### グループ通信
Amoebaのグループは、なんらかの作業を行ったり、サービスを提供するために、協力している1個以上のプロセスから、構成される。
グループ通信は、グループが信頼性のある方法でグループとしての処理を実行するための、通信形態である。
グループ通信の基本的な機能としては、次のようなものがある。
* 新しいグループを生成し、引数を設定する。
* プロセスが既存のグループに参加する。
* プロセスが既存のグループから脱退する。
* グループの全メンバー向けに信頼性のある方法でメッセージを送信する。

グループ通信の実装の基本をなす重要な考え方は、「信頼性のある同報通信 (reliable broadcasting) 」である。

グループ通信のプロトコルは、*k* 個のプロセサ群の損失 (クラッシュ) に耐えるように設計されている。
グループの作成時には、この *k* という弾性係数を指定する。
*k* の大きさにしたがって、Amoebaはプロセサの冗長度を増減させる。
冗長度が増えると、耐故障性は高くなるが、実行は遅くなる。

### Fast Local Internet Protocol
**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は、通信プロトコルの一式であり、次に示す要件を満たすように設計された。
* 透過性
* 遠隔手続き呼び出し (RPC、リモートプロシージャコール) のサポート
* グループ通信 (複数のプロセスからなる「グループ」で使われる通信) のサポート
* プロセス・マイグレーション - プロセスを、あるコンピュータから別のコンピュータへ、ネットワークが異なってもだれにも気づかれることなく移動することを可能とする
* セキュリティ - 暗号化技術により、プロセスによる他のプロセスの真似を不可能とする
* ネットワーク管理 - 自動再構築のためのサポート
* 広域ネットワークのサポート
FLIPでは、1GBまでの大きさのデータグラムを扱うことができる。
FLIPの上位層でTCP/IPやTCP/IPを基盤とするプロトコルを動作させることができる。
このようにしてAmoebaは、TCP/IPネットワークに参加することができる。

## Python
プログラミング言語のPythonは、もともとは、Amoebaプラットフォーム向けに開発された。

## 関連項目
* 分散オペレーティングシステム
* 分散コンピューティング
* マイクロカーネル
* アンドリュー・タネンバウム

## 脚注

## 参考文献

* 

## 外部リンク

* Amoeba WWW ホームページ - アムステルダム自由大学
* 分散オペレーティングシステムAmoeba - Fireball Software Distribution - SourceForge.net