オブジェクト共有空間を利用した 分散プログラミング支援フレームワーク

オブジェクト共有空間を利用した
分散プログラミング支援フレームワーク
SOR
A Distributed Programming Framework using Shared Object Space: SOR
前田 直人
上田 和紀
Naoto MAEDA Kazunori UEDA
早稲田大学大学院 理工学研究科 情報科学専攻
Graduate School of Information and Computer Science, Waseda University
e-mail: fmaeda,[email protected]
概要
オブジェクト共有空間という抽象化を利用した、Java 言語環境による分散プログラミング支援フ
レームワーク SOR を提案する。オブジェクト共有空間は、格納されるデータの単位がオブジェ
クトであり、格納されたオブジェクトの内部状態はメソッド 呼び出しによって変更、通知される、
オブジェクト指向に基づいたモデルである。オブジェクト共有空間の実装を利用することで、異
なる JVM 間での仮想的なオブジェクトの共有や、オブジェクトの永続化が可能となり、分散シ
ステムの記述を容易にする。また、その実装において proxy による通信の隠蔽や、共有オブジェ
クトの物理的な位置の隠蔽、移動や複製による通信効率の向上や、耐故障性の付加が可能である。
1 はじめに
異なるホスト上のプロセスが協調して特定の処理を
ワーク SOR
(Shared Object Repository) を提案する。
SOR はオブジェクト共有空間を実装するための枠組み
と、その枠組みに沿って実装されたオブジェクト共有
行うような分散システムの記述は従来の集中型のシス
空間をユーザに提供するための
テムの記述と比較して非常に困難である。分散環境上
される。
SOR システムで構成
で動作するシステムは、セキュリティ、耐故障性、相
オブジェクト共有空間とは扱うデータの単位がオブ
互運用性、通信効率等を考慮して設計、実装する必要
ジェクトであり、次の機能を持っている抽象的なモデ
がある。近年登場した Java 言語環境はプラットフォー
ム非依存であり、動的なクラスローデ ィング、堅牢な
セキュリティ構造等の分散環境に適した機能や性質を
提供する。そのため、Java を利用した分散システムの
研究は数多く行われている。
分散システムの多くは情報の共有がその主な目的の
一つであり、仮想的にオブジェクトの共有を行うことで
分散システムの記述を支援することが考えられる。既に
JavaSpaces という共有空間に基づいた分散プログラミ
ング支援システムが公開されているが 、JavaSpaces [4]
はオブジェクトの流れに基づいた分散プログラミング
モデルに従う必要があり自由度が少ない。
本稿では、オブジェクト共有空間というモデルを利
用した、Java による分散プログラミング支援フレーム
ルである。
オブジェクトの格納
オブジェクトの削除
オブジェクトのメソッド の呼び出し
格納されたオブジェクトは、メソッド 呼び出しを通じ
て、内部状態を変更し 、返り値によって内部状態を通
知する。
SOR はオブジェクト共有空間を利用することで、異
なる JVM 間での仮想的なオブジェクトの共有と 、格
納されたオブジェクトの永続化を提供し 、異なる場所
で複数の人間が同じデータを利用して作業するような、
CSCW における同期分散型や非同期分散型の分散シス
テムの記述の支援を目標としている。また、格納され
たオブジェクトの物理的な配置、並列アクセスや移動
SharedSpace for CSCW
による通信効率の向上、複製や二次記憶への保存によ
SharedSpace for agents
る耐故障性の付加等をオブジェクト共有空間の実装で
対応することにより、分散特有の諸問題をオブジェク
Sharable Object
ト共有空間内に隠蔽することが可能である。
本稿では、まず
SOR の方針及び構造と、Java によ
SOR
るオブジェクト共有空間を実装するための枠組みにつ
いて述べ、さらにその枠組みに基づいて実装したオブ
JVM
ジェクト共有空間を紹介する。
図
2
SOR
2.1
2.3
方針
オブジェクト共有空間の実装は様々な手法が考えら
れ 、対象とする分野の分散システムの性質やそれが動
1: SOR システム概念図
オブジェクト 共有空間の枠組み
SOR はオブジェクト共有空間を実装するためにクラ
スやインタフェースを提供する。この節では枠組みに
ついて述べる。
作する環境によって 、効率の良い実装手法は異なる。
例えば 、オブジェクトの配置として移動や複製を行う
かど うか、またオブジェクトの永続化は行うかど うか
等で分類することができる。従って、SOR は Java に
よるオブジェクト共有空間実装のための枠組みを規定
し 、その枠組みに沿って実装されたものは、ユーザの
プログラムに変更を与えないか 、若干の変更で済むよ
うに設計する。次に対象とする分野を明確にし 、オブ
2.3.1
共有オブジェクト
共有空間に格納可能なオブジェクトを共有オブジェ
クトと呼ぶ。共有オブジェクトは Java のオブジェクト
であり、外部からの遠隔メソッド 呼び出しを受け付け
る。内部状態として primitive と、他のオブジェクトへ
の参照を保持する。共有オブジェクトとそのインスタ
ジェクト共有空間の実装を行い、再利用が可能と思わ
ンス変数によって参照されるオブジェクトで、一つの
れるオブジェクトは
グループが形成され 、格納時にはそのグループ 全体の
SOR のクラスライブラリとして
作成する。ユーザはオブジェクト共有空間の中から実
装する分散システムに適したものを選択して利用し 、
もし 必要であれば 、オブジェクト共有空間を独自に実
装する。
コピーが共有空間の実装に渡される。
共有オブジェクトは格納される前は通常のオブジェ
クトとして扱うことが可能であり、SOR のオブジェク
ト共有空間に格納することで外部からのメソッド 呼び
出しを受け付けるようになる。
2.2
SOR システムの構成
SOR システムとは 、SOR が提供する枠組みに従っ
て作成された、オブジェクト共有空間の実装をユーザ
に提供するためのシステムである。各ホストでそれぞ
れ動作している SOR サーバが協調して一つの SOR シ
ステムを形成する。SOR サーバは内部に一つ以上のオ
2.3.2
遠隔メソッド 呼び出し
SOR のオブジェクト共有空間に格納された共有オブ
ジェクトへの参照として proxy [5, 6] を利用する。利
用する側はローカルな proxy へアクセスすることで共
有オブジェクトへのメソッド 呼び出しを行なう。これ
ブジェクト共有空間の実装を保持しており、オブジェ
により、通常のオブジェクトに対するメソッド 呼び出
クト共有空間の実装は他の
しと同一の文法で共有オブジェクトのメソッド 呼び出
SOR サーバ内にある同種
のオブジェクト共有空間の実装と協調して一つの仮想
しを記述できる。既存の ORB では呼び出されるオブ
的な共有空間を形成する。
ジェクトの場所は固定されており、共有空間内でのオ
ユーザから見た SOR システムの概念図 (図 1) と SOR
システムの実装の概観 (図
2) を以下に示す。
ブジェクトの移動や複製に対応することが困難である。
従って、SOR では独自に遠隔メソッド 呼び出しのため
の機構を用意する。
既存の ORB の遠隔メソッド 呼び出しでは、分散オブ
ジェクトが引数や返り値として渡される場合、代りに
その proxy が値として送られる。それ以外のオブジェ
Network
Sharable Object
SharedSpace Impl.
SOR System
SharedSpace
SOR Server
SharedSpace
JVM
Host A
Host B
図
Host C
2: SOR システム実装の概観
クトはその複製が転送される。SOR では格納された共
位置を確定するための仕組みが必要となる。複製を行
有オブジェクトのメソッド 呼び出しの引数としてまだ
う場合は、特定の一貫性モデルを選択し 、オブジェクト
格納されていない共有オブジェクトが渡された場合、
のメソッド の read/write 属性を判断する必要がある。
共有空間への格納として処理する。引数として指定さ
共有オブジェクトの移動や複製は proxy を通しての
れた未格納の共有オブジェクトはその複製が共有空間
アクセスによってプログラマからは隠蔽することが可
へと転送され 、呼び出された共有オブジェクトには引
能であると考えているが 、実際に実装して検証を行う
数として指定された共有オブジェクトの proxy が渡さ
のは今後の課題である。
れる。したがって、共有空間内で共有オブジェクトが
他の共有オブジェクトを参照する場合は必ず proxy を
通しての参照となる。これにより、格納された共有オ
ブジェクトの移動や複製を共有オブジェクトとインス
2.3.4
クラス構成
オブジェクト共有空間のインタフェースとして、以
タンス変数として参照されるオブジェクトのグループ
下の 5 つのメソッド をもった RepositoryContext クラ
単位で行うことが可能である。共有オブジェクトでは
スを提供する。
ないオブジェクトや proxy は引数及び返り値として複
製が渡される。
2.3.3
共有オブジェクト の配置
SOR を利用するプログラマは、共有空間内の共有オ
ブジェクトが実際にどのホスト上にあるのかを知る必
要はなく、物理的な位置を意識せずに共有オブジェク
トにアクセスすることができる。
オブジェクト共有空間の実装で共有オブジェクトを
put 共有空間にオブジェクトを格納する
remove 共有空間からオブジェクトを削除する
bind 登録したオブジェクトと名前を関連付ける
unbind オブジェクトと名前の関連付けを削除する
lookup 名前から関連付けられたオブジェクトを探し
出し参照を返す
RepositoryContext の実装のクラス構成を図 3 に示
どのように配置するかは、主に通信効率に関わる問題
す。
である。共有オブジェクトの配置戦略は大まかに以下
ObjectRepository 共有オブジェクトを管理するた
の 3 通りに分類できる。
1. 複製なし移動なし
2. 複製なし移動あり
3. 複製あり
1 は最も基本的な配置であり、必要なリソースの位置
が固定される場合が考えられる。2 は共有オブジェクト
に能動的な移動の機能を提供する場合や、移動によっ
て通信性能の向上を図る場合が考えられる。3 は読み
込みを並列に行うことによる通信性能の向上や、複製
の作成による耐故障性の付加などが考えられる。
移動を行う場合は、現時点に置けるオブジェクトの
めのクラス。ObjectRepository は put された共
有オブジェクトに共有空間内で一意になるよう
な識別子を割り当て、その識別子と共有オブジェ
クトへの参照を管理する。put は内部に識別子を
もった
proxy を インスタン ス化して返す。一定
期間参照の起きなかった共有オブジェクトをメモ
リからデ ィスクへ追い出し 参照が再び起きた時
にデ ィスクからメモリへ戻す責任を持つ。
ProxyGenerator
遠隔手続き呼び出しのための proxy
クラスファイルを共有オブジェクトのクラスファ
イルから生成する。共有オブジェクトの配置戦略
RepositoryContext
オブジェクトは put されたホスト上の ObjectRepos-
itory が管理をする。移動や複製は行なわない。proxy
ProxyGenerator
ProxyGenerator
generate
Proxy Classfile
機能
3.1
ObjectRepository
はインスタンス変数として共有オブジェクトの位置を
SharableObject
保持し 、メソッド 呼び出しの際は共有オブジェクトが
実際に存在する SOR サーバと直接通信を行なう。
NamingService
NamingService
Proxy
永続化
RMI
Return Proxy
lookup
Proxy
RMI
ClientObject Client
Process
図
3:
bind
put
NamingService に bind されている共有オブジェクトは
proxy からの参照がなくなっても ReferenceManager に
よって回収されない。共有オブジェクトが回収される
ClientObject
Client
Process
のは proxy からの参照がなくかつ NamingService から
も参照されていない場合のみである。
Observable クラス
SOR における遠隔メソッド 呼び出しはクライアントの
クラス構成の概略図
オブジェクトから共有オブジェクトへの一方通行であ
として複製を行なう場合は proxy の生成時に共有
オブジェクトのメソッドを検査して、read/write
属性を判断する方法が考えられる。
proxy を関連づけて保持する NamingService ク
ラスを提供する。NamingService クラスは特殊
な共有オブジェクトであり、固有の識別子を持
RepositoryContext の実
装によりアクセスされ 、単純な名前付けサービ
しては特に有用なパターンであると考えられるためそ
の回避策として Observable クラスを提供している。
3.2
分散プログラムの記述
分散プログラムの例として、本実装を利用したカウ
スを提供する。bind 、unbind 、lookup は実際に
ンターの記述について述べる。カウンターは内部に int
は
を一つもった共有オブジェクトである。内部状態を変
NamingService への遠隔メソッド 呼び出しと
なる。
ReferenceManager proxy が共有オブジェクトへの
参照となる。従って、現在存在する
proxy の数
を把握しておけば 回収するべきタイミングを判
断できる。JavaRMI の分散ガベージコレクショ
ンにならい、共有オブジェクトの参照は一定期
間で無効になり、参照を保持するために一定期間
毎に参照を更新する方法を採用している。SOR
では分散ガベージコレ クションのためのクラス
ReferenceManager を提供する。
3
ンパターンを適用することができない。Observer デザ
インパターンはオブジェクトの共有というモデルに関
NamingService ブ ート スト ラップ のために名前と
つ。NamginService は
り、CallBack を行う共有オブジェクトを記述できない。
そのため共有オブジェクトにたいして Observer デザイ
実装の一例
前の節で述べた枠組みに従い、オブジェクト共有空
間を試作した。この節では試作した実装について紹介
する。
更するメソッドとして inc を持つ。inc メソッドにより
値を一つ増やした共有オブジェクトは、変更をカウン
ターを監視している全てのオブジェクトに通知する。
プログラムを図
4 に示す。
public class SharableCounterImpl
extends sor.basic.ObservableImpl
implements SharableCounter {
int count;
public SharableCounterImpl(){
count= 0;
}
public int inc(){
setChanged();
count++;
notifyObservers(new Integer(count));
return count;
}
}
図
4: ObservableCounter の実装プログラム
共有オブジェクトの Observer になるには update メ
ソッドを実装して Proxy の addObserver(Observer) に
4
tifyObservers() が呼ばれたらその Proxy によって Observer の update メソッドが呼び出される仕組みになっ
Java を利用した分散オブジェクトシステムは数多く
研究されている [1, 2, 3]。分散オブジェクトシステム
よって自身を登録すれば良い。共有オブジェクトの no-
ている。
関連研究
は分散システムを構築する上での基本的な機能しか提
この共有空間を利用することで同期型のチャットや
供していないため、特定の分散オブジェクトにアクセ
共有ホワイトボード はもちろんデータを永続化するこ
スが集中して隘路が発生することを考慮したり、耐故
とで非同期型の掲示板等の分散システムを容易に記述
障性を考慮しながらプログラムを記述する必要がある。
できる。さらに共有オブジェクトを複数組み合わせて
SOR では、オブジェクトへの並列アクセスや耐故障性
利用することでより複雑な
といった分散特有の問題をオブジェクト共有空間内で
CSCW アプ リケーション
の実装に役立てることが可能である。
解決することで、分散システムを構築する際に分散特
有の問題を切り分けて考えることが可能である。
3.3
遠隔メソッド 呼び出しの性能の比較
JavaSpaces [4] はオブジェクトの共有を行う空間を
SOR と類似しており、共有空間
提供するという点で
Java の代表的な分散オブジェクトである JavaRMI と
に格納されたオブジェクトのメソッド 呼び出しが出来
本実装が提供する遠隔手続き呼び出しで速度の比較を
Linda のタプルスペースに基づいており、タプルの照
おこなった。primitive である int を引数にとってそのま
ま返り値として返すメソッドをそれぞれ実装し
100000
回呼び出しそれを 5 回おこなって平均を算出した。同
様に引数と返り値を
Integer にしたものに対しても実
験を行った。呼び出すオブジェクトと呼び出されるオ
ブジェクトとは同じホスト上で動作している。
int
1.20
7.11
引数
JavaRMI
本実装
単位:ms
引数
Integer
3.12
7.13
Solaris SPARC JDK 1.1.5, Native Thread, JIT Compiler
使用, Solaris2.6, SunUltraSPARC-II 248 MHz
表
1:
ないという点で SOR と異なっている。JavaSpaces は
合によってプロセス間でオブジェクトのやり取りを行
う。ある空間から別の空間へオブジェクトが流れてい
くことにより分散システムが形成される。一方、SOR
は共有空間に格納したオブジェクトのメソッド 呼び出
しを通じてオブジェクトのやり取りを行う。異なる場
所で複数の人間が同じデータを利用して作業するよう
な分散システムの記述は、オブジェクトが流れるモデ
ルと比較して、SOR のオブジェクトを直接共有するモ
デルの方が適している。また、プロセス間で頻繁にメッ
セージがやり取りされる場合、Linda モデルの実装は
タプルの照合を効率的に行う必要がある。一方、SOR
は共有空間に格納したオブジェクトのメソッド 呼び出
しを通じてオブジェクトのやり取りを行うため照合の
遠隔メソッド 呼び出しにかかる時間の比較
手間がかからない。
また、本研究はオブジェクトの共有と永続化を提供
JavaRMI と比較して 2 倍以上時間がかかる原因は、
SOR が Skeleton とよばれるクラスの作成を行ってい
ないことに起因する。Skeleton クラスは Stub クラス
と対応しており、Stub はメソッド の番号を送ることで
Skeleton はオブジェクトの対応するメソッド を直接呼
び 出している。一方 SOR は Skeleton がないために 、
メソッド の名前や引数の型と言った余分な情報を送る
必要がある。これらの
marshaling の時間がオーバー
ヘッド の原因になっている。
従って、遠隔メソッド 呼び出しについては Skeleton
を作成することで 、今後 JavaRMI と同等の性能を出
DSR [7] 、PerDiS [8] 等とも関連する。DSR や
PerDiS は特定の言語に依存せずにオブジェクトの共有
及び 、永続化をサポートする。ど ちらも明確に CSCW
する
の分野のアプリケーションを対象として打ち出してお
り、オブジェクトの永続と共有が CSCW の分野に適し
ていることが示されている。さらに、扱うデータのセ
キュリティも重要な問題であり、双方の研究で議論さ
れている。SOR は Java のみで記述されていることに
より
Java のもつ利点を完全に活かすことが可能であ
り、また、ユーザにとって利用しやすいことが期待さ
れる。
すことが可能である。また、共有空間の実装でローカ
ルホストに共有オブジェクトをキャッシュすることで
更なる性能の向上が見込まれる。
5 まとめと今後の目標
Java によるオブジェクト共有空間の実装手法につい
て述べ、オブジェクト共有空間を利用した分散プログ
ラミング支援フレームワーク SOR を提案した。オブ
and persistency, Proc. 13th Int. Conf. on Distributed Computing Systems, IEEE Computer
Society, pp. 20{29, 1993.
ジェクト共有空間は proxy による通信の隠蔽と共有オ
ブジェクトの位置透過性を提供する。さらに複製を作
成することで並列アクセスによる効率の向上が可能で
あり、複製のオリジナルが消失した場合もコピーから
オリジナルを選出することで耐故障性を高めることが
可能である。また、スレッドを保持した共有オブジェク
トの移動を行うことにより負荷分散の応用も考えられ
る。オブジェクト共有空間の実装は柔軟に入れ替えが
可能であり、必要に応じて、ユーザのプログラムに変
[8] Marc Shapiro, Sytse Kloosterman, and Fabio
Riccardi: PerDiS | a Persistent Distributed
Store for Cooperative Applications, Proceedings
of the 3rd Cabernet Plenary Workshop, IRISA
Rennes, France, 1997.
http://www.perdis.esprit.ec.org/papers/
更を加えることなくその性能を改善することができる。
オブジェクト共有空間は、CSCW の分野を対象とし
た分散システムのサポート、エージェントの協調の場、
ファイルシステムやデータベースとしての利用等様々
な応用が考えられる。
今後の目標として、まず、共有オブジェクトの移動
及び複製への対応、メソッド 呼び出しの高速化が挙げ
られる。また、セキュリティや負荷分散に関しても考
慮していく必要があると考えている。
参考文献
[1] Sun Microsystems, Inc.: Java Remote Method
Invocation Specication, 1997.
http://java.sun.com/products/jdk/rmi/
[2]
平野聡: 分散 Java 実行のためのポータブルな ORB
の構成法, 情報処理研究報告 96-OS-73, pp. 55{60,
1996.
[3] ObjectSpace: ObjectSpace Voyager Version
2.0.0 User Guide, 1997.
http://www.objectspace.com/developers/voyager/white/
[4] Sun Microsystems, Inc.: JavaSpaces Specication, 1998.
http://java.sun.com/products/javaspaces/
[5] Marc Shapiro: Structure and Encapsulation in
Distributed Systems: the Proxy Principle, Proc.
6th Int. Conf. on Distributed Computing Systems, IEEE Computer Society, pp. 198{204,
1986.
[6] Andrew Birrell, Greg Nelson, Susan Owicki, and
Edward Wober: Network Objects, DEC SRC
Res. Rep. 115, 1994.
[7] Kazuhiro Kato, Atsunobu Narita, Shigekazu Inohara, and Takashi Masuda: Distributed shared
repository: a unied approach to distribution