既存Javaプログラムの バイトコード変換による 機能分散

Download Report

Transcript 既存Javaプログラムの バイトコード変換による 機能分散

既存Javaプログラムの
バイトコード変換による
機能分散
筑波大学
たつ ぼり
立堀道昭
佐々木俊幸 千葉滋 板野肯三
March 21-23, 2001
JSSST SPA 2001, Kyoto
ソフトウェアの分散実行
GUI とアプリケーション・ロジックの分離
「PC anywhere」
「ゼロ・アドミニストレーション」
「シン・クライアント」
– 管理コストの削減
– 安価なクライアント環境を活用できるよう
March 21-23, 2001
JSSST SPA 2001, Kyoto
ソフトウェアの自動分散化

自動化による開発コスト削減

既存の環境(全自動の遠隔表示)
– X Window System、VNC、Rawt[IBM Haifa 98]

既存の(半自動)分散化支援ツール
– JavaRMI、HORB、ObjectSpace、…
– Emerald[Black87]、”remotenew”[Nagaratnam96] 、
JavaParty[Philippen99]、…
March 21-23, 2001
JSSST SPA 2001, Kyoto
X Window

Xlib ライブラリレベルで分散化
– 低レベルな命令が大量に
ネットワークを飛び交う
マウスが動いた
マウスボタン押された
Xlib
ユーザ
プログラム
March 21-23, 2001
マウスボタン離された
線を書け
JSSST SPA 2001, Kyoto
ORBによる
手動(半自動)変換

ユーザプログラムを変更
– 応答性能のよい遠隔表示が可能
ORB
ライブラリ
ユーザ
プログラム
March 21-23, 2001
ウィンドウ内で
クリックあり
内部ウィンドウ表示
JSSST SPA 2001, Kyoto
ユーザ
プログラム
既存の分散化手法

X Window
X Protocol
– ライブラリ・レベルの分散化
 完全自動だが遅い

ユーザ
プログラム
ORB
– プログラム全体を手で分割して分散化
 速いが、開発に余分な工数が
必要
March 21-23, 2001
GUIモジュール
ユーザ
プログラム
JSSST SPA 2001, Kyoto
提案するシステム
Addistant

より自動化されたORB
– プログラム全体を自動変更して分散化
– 開発者はプログラムを直接いじる必要はない

現実的なシステムにむけて
–
–
–
–
実用的な Swing アプリケーションにも対応
既存の Java 仮想機械 (JVM) の利用
バイトコード変換
開発者による分散化の指示の簡素化
March 21-23, 2001
JSSST SPA 2001, Kyoto
Addistant の基本設計

クラスローダによるバイトコード変換
– バイトコード変換にはJavassist[Chiba00] を利用

クラス単位でインスタンスの配置方針を指
示
– 開発者がポリシーファイルに宣言的記述
– 例: GUI のクラスはあちら、その他のユーザク
ラスはこちら
March 21-23, 2001
JSSST SPA 2001, Kyoto
現実的なシステムに向けて

プロキシ・マスタ方式の限界
– 遠隔オブジェクト(マスタ)に対応して、手元
では代理のオブジェクト(プロキシ)を用いる
– Java RMI など、多くのORB で使われている方
式
しかし、既存の ORB の実装法をそのまま適用は
無理…
メソッド
プロキシ
マスタ
呼び出し
ネットワーク通信
March 21-23, 2001
JSSST SPA 2001, Kyoto
システム・クラスの存在

プロキシ・マスタ方式
– クラス定義またはクラスを使う側のコー
ドの変更が必要
– システムクラスの場合バイトコード変換
禁止
– 例:プロキシクラスをサブクラスとする
実装法
 元のクラスが
final クラスのときは使えない、
など
March 21-23, 2001
JSSST SPA 2001, Kyoto
Addistant の方式

クラス毎に異なる実装法で遠隔参照を実現
– 実装法により、変更が必要なコードの範囲が
異なる
– システムクラスの変更を避けるように
実装法を選択
– “長いものには巻かれろ”法

XML風のポリシーファイルで宣言的に指定
– 「置き換え」、「名前変更」、
「サブクラス」、「複製」
March 21-23, 2001
JSSST SPA 2001, Kyoto
「置き換え」手法
(例:ユーザクラス)

対象クラスをプロキシに置き換え
– 元のクラスを変更できる場合
– ひとつのJVM上には、プロキシかマスタ
のどちらか一方のみ
Widget w = new Widget();
w.show();
分散化
Widget
show()
置き換える
Widget
show()
March 21-23, 2001
JSSST SPA 2001, Kyoto
.. Show ..
.. Send ..
「名前変更」手法
(例:java.awt.Window)

コード中に現れた対象クラス名を
プロキシクラスのものに変更
– 元のクラスを変更できない場合
– 使っている側のコードを変更する
Widget w = new Widget();
w.show();
Widget
show()
.. Show ..
WidgetProxy
show()
.. Send ..
分散化
WidgetProxy w
= new WidgetProxy();
March 21-23, 2001
JSSST SPA 2001, Kyoto
「サブクラス」手法
(例:java.util.Vector)

対象クラスのサブクラスとしてプロキ
シクラスを定義
– 1つのJVM上にプロキシとマスタを
混在させたい場合
Widget w = new Widget();
w.show();
Widget
show()
.. Show ..
WidgetProxy
show()
.. Send ..
分散化
指示の場合によっては
Widget w
= new WidgetProxy();
March 21-23, 2001
JSSST SPA 2001, Kyoto
「複製」手法
(例:java.lang.String)

プロキシクラスは作らず、遠隔メソッ
ド呼び出しの際、オブジェクトを移送
して複製を渡す
– Shallow copy

変則版 - 「書き戻し複製」手法
– 配列オブジェクトに
用いる
March 21-23, 2001
JSSST SPA 2001, Kyoto
byte[] buf = …;
istream.read(buf);
応答性能の実験
クリック – Window表示

クリックしてから内部
ウインドウが完全に表
示されるまで
– スタートアップホスト

Sparc 440MHz
– GUI ホスト

PentiumII 500MHz
– ネットワーク


10Base-T Half
100Base-TX Full
March 21-23, 2001
JSSST SPA 2001, Kyoto
応答性能の実験
クリック – Window表示

クリックしてから内部
ウインドウが完全に表
示されるまで
– スタートアップホスト

Sparc 440MHz
– GUI ホスト

PentiumII 500MHz
– ネットワーク


10Base-T Half
100Base-TX Full
March 21-23, 2001
JSSST SPA 2001, Kyoto
分散 Swing アプリケーション

ポリシーファイル
<policy>
<import proxy="rename" from="display">
[email protected] [email protected] ..
</import>
<import proxy="rename" from="application">
[email protected].[InputStream|OutputStream|..]
[email protected].*
</import>
<import proxy="subclass">
[email protected].[AbstractCollection|..]
</import>
<import proxy="writeBackCopy">
array@</import>
<import proxy="replace" from="application">
user@</import>
<import proxy="copy">
</import>
</policy>
March 21-23, 2001
JSSST SPA 2001, Kyoto
応答性能の測定結果

プログラム全体の変換による速度改善
– 応答時間(秒) (10Base-T(100Base-TX))
誤差±0.1秒
X Window
Rawt
Addistant
1回目
5.6(1.6)
3.2(2.6)
2.0(2.0)
2回目
5.6(1.4)
0.0(0.0)
0.0(0.0)
X Window
Rawt
Addistant
1回目
3493.57
116.20
81.88
2回目
3438.96
10.95
0.06
– 通信量(キロバイト)
March 21-23, 2001
JSSST SPA 2001, Kyoto
まとめ

透過な分散 JVM を既存の JVM を用いて構
築する際に鍵となる技術
– 既存の Java プログラムを複数のホスト上に分散
させるための支援ツールAddistant を提案

その他の貢献
– 分散プログラミング用の Aspect Oriented
Programming ツール
– Javassist[Chiba00] 応用のケース・スタディ
March 21-23, 2001
JSSST SPA 2001, Kyoto
質問・提案をどうぞ
March 21-23, 2001
JSSST SPA 2001, Kyoto