既存Javaプログラムの バイトコード変換による 機能分散 筑波大学 立堀道昭 佐々木俊幸 千葉滋 板野肯三 たつ ぼり March 21-23, 2001 JSSST SPA 2001, Kyoto
ソフトウェアの分散実行 GUI とアプリケーション・ロジックの分離 「PC anywhere」 「ゼロ・アドミニストレーション」 「シン・クライアント」 管理コストの削減 安価なクライアント環境を活用できるよう 今日お話するのは「ソフトウェアの分散実行」に関することです。 一口に分散実行といっても、様々な用途がありますが、 例えば、「GUIとアプリケーション・ロジック」を分離し、分散した状況で使いたいという要求が強くあります。 (ちまたでよく使われる)キーワードでは、…などというのがこれにあたります。 これによって、管理コストを削減したり、クライアント環境が安価にすむようにすることができます。 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]、… さて、我々の立脚しているポイントは、このような分散化を自動化して 開発コストを減らそう、というものです。 既存の全自動分散化環境には、先ほどの遠隔GUIの場合ですと、… が有名です。 また、全自動ではなく、そのような分散化したソフトウェアの開発を支援するツールがたくさんあります。 JavaRMI …. Emerald のような …. March 21-23, 2001 JSSST SPA 2001, Kyoto
X Window Xlib ライブラリレベルで分散化 低レベルな命令が大量に ネットワークを飛び交う Xlib ユーザ プログラム マウスが動いた マウスボタン押された Xlib マウスボタン離された X Window では、ライブラリレベルで分散化を行っていて、 全自動の遠隔表示環境を実現しています。 線を書くなどの比較的低レベルな命令やイベントが大量にネットワークを行き交う。 GUI がシンプルな場合や、ネットワークの帯域とサーバのCPUリソースが潤沢に得られる場合には問題ないわけですが。 ユーザ プログラム 線を書け March 21-23, 2001 JSSST SPA 2001, Kyoto
ORBによる 手動(半自動)変換 ユーザプログラムを変更 応答性能のよい遠隔表示が可能 ORB ライブラリ ユーザ プログラム 応答性能のよい遠隔表示が可能になります。 ウィンドウ内で クリックあり ユーザ プログラム ユーザ プログラム 内部ウィンドウ表示 March 21-23, 2001 JSSST SPA 2001, Kyoto
既存の分散化手法 X Window ORB ライブラリ・レベルの分散化 プログラム全体を手で分割して分散化 完全自動だが遅い 速いが、開発に余分な工数が 必要 X Protocol ユーザ プログラム GUIモジュール ユーザ プログラム March 21-23, 2001 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風のポリシーファイルで宣言的に指定 実装法により、変更が必要なコードの範囲が 異なる システムクラスの変更を避けるように 実装法を選択 “長いものには巻かれろ”法 XML風のポリシーファイルで宣言的に指定 「置き換え」、「名前変更」、 「サブクラス」、「複製」 March 21-23, 2001 JSSST SPA 2001, Kyoto
「置き換え」手法 (例:ユーザクラス) 対象クラスをプロキシに置き換え 元のクラスを変更できる場合 ひとつのJVM上には、プロキシかマスタのどちらか一方のみ .. Show .. Widget w = new Widget(); w.show(); Widget show() 分散化 置き換える .. Send .. Widget show() March 21-23, 2001 JSSST SPA 2001, Kyoto
「名前変更」手法 (例:java.awt.Window) コード中に現れた対象クラス名を プロキシクラスのものに変更 元のクラスを変更できない場合 使っている側のコードを変更する .. Show .. Widget w = new Widget(); w.show(); Widget show() 分散化 .. Send .. WidgetProxy w = new WidgetProxy(); WidgetProxy show() March 21-23, 2001 JSSST SPA 2001, Kyoto
「サブクラス」手法 (例:java.util.Vector) 対象クラスのサブクラスとしてプロキシクラスを定義 1つのJVM上にプロキシとマスタを 混在させたい場合 .. Show .. Widget w = new Widget(); w.show(); Widget show() 分散化 指示の場合によっては .. Send .. Widget w = new WidgetProxy(); WidgetProxy show() March 21-23, 2001 JSSST SPA 2001, Kyoto
「複製」手法 (例:java.lang.String) プロキシクラスは作らず、遠隔メソッド呼び出しの際、オブジェクトを移送して複製を渡す Shallow copy 変則版 - 「書き戻し複製」手法 配列オブジェクトに 用いる byte[] buf = …; istream.read(buf); 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
応答性能の実験 クリック – 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"> subclass@java.awt.- subclass@javax.swing.- .. </import> <import proxy="rename" from="application"> exactsubclass@java.io.[InputStream|OutputStream|..] exactsubclass@javax.swing.filechooser.* </import> <import proxy="subclass"> subclass@java.util.[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) 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