システムアーキテクチャ

佐藤一郎 1998/9/28

AgentSpace システムは、Java 言語 (JDK1.1以上)を利用した分散計算用ミドルウェアです。モーバイルエージェントの作成を可能にするAPI群とそのエージェントを実行や移動などを処理するランタイムシステムの二つの部分からなっています。

エージェントランタイムシステム

エージェントランタイムシステムはJavaの仮想機械(VM)上で動作し、エージェントの起動、永続化、停止を管理します。また、他のエージェントランタイムとのエージェントの送受信を行うことができ、エージェントを受信するとそのエージェントを動作可能にし、また、転送要求のあったエージェントを他のエージェントランタイムに転送します。

エージェントランタイムは、各エージェントとのインタフェースとなるエージェントコンテキストと、エージェント移動や永続化を管理するエージェントサーバ(以降ではエージェントサーバをエージェントランタイムと呼ぶことがある)から構成されています。

エージェントサーバシステムの機能には以下のものがあります。

エージェントの起動(ロード)

AgentSpaceではエージェントの移動が計算の基本です。従って、エージェントは生成するものではなく、どこかから移動してくるものなのです。従って、AgentSpaceのシステム自体は、エージェントを生成することも、起動することもできません。従って、エージェントは実行開始以前の状態にあることなく、すべてのエージェントはどこかで実行されていたものです。そして、エージェントのロードとは、実行をすでに開始したエージェントを永続化したファイルを再びエージェントに戻すことに相当します。

エージェントの移動

エージェントランタイムシステムは他のエージェントランタイムシステムとネットワークで接続され、ネットワークを通じてエージェントが転送されます。また、このとき、ネットワーク接続形態に制限はありません。また、エージェント及びエージェントランタイムシステムがルータとしての機能をもっているため、エージェントの転送ルートは任意に定めることができます。

エージェントの転送

エージェントランタイムシステムは以下の手順でエージェントを移動します。

  1. 移動要求があったエージェントに移動前処理に対応するコールバックメソッドを起動します。
  2. エージェントそれ自体の実行を停止します。
  3. エージェントの実行状態をネットワークに移動可能なデータ形式に変換(直列化)します。変換はJavaのObjectSerialization機構を利用して行います。
  4. エージェントの宛先やエージェント識別子、名前、所有者などの管理情報を直列化します。
  5. 直列化した状態及び管理情報と、実行中のエージェントは動作を定義したコード、つまり(一つ以上の)クラスファイルを併せて転送用のビット列(バックオブビット)を作成します。
  6. ビット列をデータ圧縮します。データ量は60パーセント程に減少します。
  7. 作成したビット列を転送します。転送はTCPを利用します。

バックオブビットデータのまた、通信を速度を高速化するためバックオブビットデータはZip形式で圧縮されます。圧縮により、コード(クラスファイル)とコンテキスト(エージェントの状態と管理情報)のなお、移動際の宛先はIPアドレス形式を採用していますが、今後、httpに準じたURL形式も変更する予定です。

エージェントの到着

エージェントランタイムシステムは以下の手順でエージェントを受け取ります。

  1. エージェントを直列化したビット列を受け取る。
  2. ビット列を非圧縮状態に戻します。
  3. ビット列を実行状態、管理情報、クラスファイルに分解します。
  4. 分解した実行状態からエージェントを実行可能な状態に戻します。
  5. 管理情報をもとにエージェントの識別子や名前、所有者を再登録します。
  6. クラスファイルをエージェントから動的ロードできる状態で保持します。
  7. エージェントの到着後処理に対応するコールバックメソッドを呼び出します。

クラスの転送

このシステムは、エージェントの実行に必要なクラスファイルをエージェントの状態と一緒に転送します。Java言語は動的クラスローディングを行うため以下の問題があります。

このため、遅延ローディング(オンデマンド・ローディング)が最適となりますが、以下の理由から採用しません。

注意

TCPの接続はエージェントの転送毎に接続・切断を行います。このことは通信コストを増大させますが、予測不能な通信障害に対して対応できることと、モーバイルエージェントは他のコンピュータに移動後はもとのコンピュータとの通信は頻発しないという特徴をもっているので、RPCなどの非モーバイルベースの通信に比べてTCPの接続・切断によるコストは小さくなります。

転送要求のあったエージェントは所定のコールバックメソッド(dispatch)を起動が停止しますが、エージェントがスレッドを作成している場合はそのスレッドが移動後も残る可能性があります。このためコールバックメソッド内で作成したスレッドを停止するようにして下さい。

エージェントをデータに直列化するときは、すべての状態を直列化できるわけではありません。制限される内容はJavaのObjectSerialzationと共通となります。 

バックオブビットデータ

エージェントは転送する際にビット列(バックオブビットと呼ぶ)に直列化されます。ビット列には以下のエントリがあります。

コードフィールド
コンテキストフィールド

ビット列はコードフィールドとコンテキストフィールドに分けて別々に圧縮されます。また、圧縮形式はzip方式によります。現在はサポートしていませんが、暗号化も容易に実現できます。

バックオブビットデータの例

 

このビット列はエージェントの永続化に用いるのと同じ形式となり、ファイルとして保存することができます。現在の直列化エージェントのビット列は独自のものですが、将来はJavaBeanの形式に変更する可能性があります。なお、独自形式を採用したのはJavaBeanの方式は圧縮時間が長いためです。

エージェント転送の性能

エージェント転送の性能値(参考データあり、厳密な測定ではありません)を示します。測定は、Intel PentiumII300MHzのPC(MS-WindowsNT)2台の間、ネットワークは100Base-TXを用いています。

移動時間

TCP転送

0.21s

UDP転送

0.28s

なお、ネットワークトラフィック及びOSスケジューリングの影響を受けているため、それぞれ0.1s程度の増加することがあります。

エージェント間通信

エージェントが処理を行う際には、人間の共同作業と同様に他人、つまり他のエージェントと情報を交換する必要があります。このシステムでは以下の方法により実現します。

なお、エージェントメソッド呼び出しにおいて、エージェントが別のエージェントの変数やメソッドを直接呼び出すことはできません。このため、通信用のプリミティブを利用して、ラインタイムシステム(正しくはエージェントコンテキスト)に通信を依頼する必要があり、その通信方式には次の3つの形態があります。

通信依頼を受け取ったランタイムシステムはメッセージを転送します。メッセージには呼び出すべくメソッドの名前とそれの仮引数から構成されます。

受信側のエージェントでは、メッセージに対応するメソッドがランタイムシステムによって呼び出されます。また、その通信方式により返値を返します。

通信方式

非同期メッセージ送信

送信側エージェントはメッセージを送信し、そのまま続くプログラムを実行します(ブロックされません)。受信側エージェントでは対応するメソッドを呼び出されます。このときメソッドが返値をもっていても無視されます。

同期メソッド呼び出し

送信側エージェントはメッセージを送信し、呼び出したメソッドからの結果を待ちます(ブロックされる)。受信側エージェントでは対応するメソッドを呼び出され、それの返値を返します。送信側も返値を受け取り実行を再開します。なお、必要に応じてタイムアウト機能を通じて、所定時間内に完了しないメソッド呼び出しを中止することができます。

非同期メソッド呼び出し(フュチャー通信)

送信側エージェントはメッセージを送信すると同時に、値を受け取るためのオブジェクト(フュチャー)を生成します。そして、そのまま続くプログラムを実行します(ブロックされません)。受信側エージェントでは対応するメソッドを呼び出され、それの返値をフュチャーオブジェクトに返します。送信側はフュチャーオブジェクトを読み出すことにより、メッソドからの返値を受け取ることができます。なお、読み出した時点でメソッド呼び出しが終了していない場合はメソッド呼び出しが終了するまで待ちます(ブロックされます)。そして、返値を受け取ると処理を再開します。 なお、必要に応じてタイムアウト機能を通じて、所定時間内に完了しないメソッド呼び出しを中止することができます。

受信メッセージの処理

各エージェントは一度に一つのメッセージを処理することができます。このため、各エージェントはそれぞれ一つのメッセージキューをもっており、他のメッセージまたはコールバックメソッドを実行中に到着したメッセージはメッセージキュー(FIFO)に格納されます。

メッセージキュー内のメッセージは到着順に対応するメソッドを呼び出すことで処理されます。このとき、呼び出されるメソッドはメッセージの名前を同じ名前をもつプブリックメソッドであり、さらにメッセージの引数の型はメソッドの仮引数は一致またはサブセットである必要があります。対応するメソッドがない場合はランタイムエラーとなり、送信側に例外が発生します。また、タイムアウト機構により、送信後所定時間が経過しても対応したメソッド実行が完了しない場合は、待ち行列から除去されるとともに、メソッド実行が開始されている場合は中断され、タイムアウト例外が送信側に通知されます。なお、メソッドの返値の型は判定の対象外であり、送信側エージェントにおいて型の不整合を判定する必要があります。

メッセージの処理はFCFSを基本としますが、 自分自身に送信したメッセージはキューの先頭に入れられます。 これはデッドロックを避けるためです。

エージェントの永続化

エージェントは永続化することができます。ただし、AgentSpaceの永続化はファイルという2次記憶に移動することとして扱われます。つまり、エージェントの移動先が他のコンピュータであればエージェント間のコンピュータ移動、移動先が2次記憶上であれば永続化にないます。従って、コンピュータ移動と同じデータフォーマットで永続化されます。


Ichiro Satoh (Ph.D.)
Associate Professor,
Deparment of Information Sciences
Ochanomizu University
2-1-1 Otsuka Bukyo-ku Tokyo 112, JAPAN
Tel: +81-3-5978-5388, Fax: +81-3-5978-5705
Email: ichiro@is.ocha.ac.jp