Download presentation
Presentation is loading. Please wait.
1
活性化のタイミング制御の実装を分離記述可能な分散動的アスペクト指向言語
森田 悟史 堀江 倫大 千葉 滋 東京工業大学 千葉研究室
2
分散動的アスペクト指向 実行途中でアスペクトを織り込む 例: N 体問題の視覚化 離れたノードで動いているプログ ラムに機能を追加
各ワーカノードが分散並列で計算 各ループでバリア同期をしている 途中経過を随時マスタノードに集 めて視覚化 マスタ ワーカ 各ノード: for ( t = 0; t < MAX; t++) { /* 他ノードとデータを交換 */ exchangeData(data); calc (data); // N 体問題計算 sync(); // 他のノードと同期 } アスペクト
3
分散動的アスペクトの織り込み 離れたノードに織り込む 織り込みがずれる マスタノードが、各ワーカノードにア スペクトを配る
計算データを送信するコード 織り込みがずれる ノードにより、ネットワーク速度・CPU 使用率が違う データの送信開始がずれる ずれる マスタ ワーカ
4
織り込みと活性化 織り込み 活性化 アスペクトを遠隔ノードに準備する アスペクトを実行可能な状態にする 活性化のタイミングを制御する ずれる
活性化されると視覚化が始まる 活性化のタイミングを制御する アスペクトを有効にするタイミングを 調整 ずれる マスタ ワーカ 活性化されるまで実行しない
5
活性化の条件:アスペクトの織り込み状況 ノードによってアスペクトが織り 込まれていない場合がある
織り込みがずれる アスペクトが織り込まれていな いノードがあるなら活性化しては いけない ずれる ない マスタ ワーカ
6
活性化の条件:アプリケーションの進捗 計算の同じループで活性化す る必要がある
全てのノードで織り込みが完了 しても、単純に活性化してはい けない バリア同期を利用したい ループごとに全ノードで同期を とっている csg000 織り込み t = 101 同期 ジョイン ポイント t = 102 データ 送信 同期 N体問題 計算 t = 103
7
活性化の条件:アプリケーションの進捗 計算の同じループで活性化す る必要がある
全てのノードで織り込みが完了 しても、単純に活性化してはい けない バリア同期を利用したい ループごとに全ノードで同期を とっている csg000 csg001 csg002 t = 101 同期 活性化 t = 102 同期 t = 103 活性化しては いけない
8
活性化するタイミングの制御 分散動的アスペクトが必要 活性化すべきタイミングはアプリ ケーションによって異なる 情報を集めるコードを織り込む
バリア同期 を報告する アスペクト 分散動的アスペクトが必要 活性化すべきタイミングはアプリ ケーションによって異なる バリア同期のタイミング 情報を集めるコードを織り込む バリア同期のタイミングをマスタノ ードに報告させる バリア同期 マスタ ワーカ 視覚化 アスペクト 活性化するタイミングを判断
9
素朴な活性化のタイミング制御 織り込みたいアスペク トと活性化制御の実装 が混ざる 必要ないコードが残る 制御の実装 活性化のタイミング制御
を考慮したアスペクト : aspect DrawAspect { boolean flag = false; // 共有フラグ before(Satellite s): // 星のデータ execution(void Nbody.calc(Satellite)) && args(s) { if (flag) { // 視覚化処理 } /* バリア同期のタイミングで実行 */ after(): execution(void Nbody.sync()) { // マスタノードへ同期のタイミング // を通知し、活性化の判断をさせる }}
10
提案:活性化のタイミング制御をアスペクトとして分離記述できる言語
単一ノード上のアスペクトからの織り込みの集中制御 Remote pointcut [‘04 Nishizawa ら] 活性化すべきタイミングを把握するプログラムを書きやすくする 各遠隔ノードのバリア同期のタイミングなどを取得 dynamic アスペクト 動的に分散織り込み可能なアスペクト プログラムから織り込み・活性化処理が可能 織り込み状況の確認 タイミング制御の実装のライブラリ化 活性化のタイミング制御と織り込みたいアスペクトを切り分ける
11
Remote pointcut 活性化すべきタイミングを把握するプログラム が書きやすくなる 視覚化ノード上のアドバイスの実行
計算ノードがジョインポイントに到達したら csg000: ... sync(); … pointcut remote(String h): execution(void Nbody.sync()) && hosts(“csg000”, “csg001”, “csg002”) && hostName(h); csg000 Aspect 指定子 ジョインポイント hosts(hostNames or hostName1, hostName2 ..) String 配列、もしくは直接名前で指定したホスト上のジョインポイントを選択 hostName(hostName) ホスト名がhostNameに一致するジョインポイント
12
dynamic アスペクト 動的に分散織り込み可能なアスペクト 特別なオペレータを持つ プログラムから活性化を制御可能
dynamic aspect DrawAspect { …. } DrawAspect draw = new DrawAspect(); draw.weave(); while (!draw.isWoven()) Thread.sleep(10); draw.deploy(); ... draw.unweave(); 動的に分散織り込み可能なアスペクト プログラムから活性化を制御可能 dynamic 修飾子 を付ける 特別なオペレータを持つ インスタンス化して呼ぶ アスペクトの織り込み状況の確認 オペレータ 説明 void weave() 非活性状態でアドバイスを呼び出す準備をする void unweave() アスペクトを取り除く void deploy() アスペクトを活性化する void undeploy() アスペクトを非活性化する boolean isWoven() アスペクトが準備ができているかどうか調べる boolean isDeployed() アスペクトが活性化されているかどうかを調べる
13
タイミング制御の実装のライブラリ化 dynamic アスペクト 活性化のタイミング制御ア スペクト First-class entity
パラメタとして渡せる DAspect型のオブジェクト 活性化のタイミング制御ア スペクト 視覚化アスペクトから分離 再利用可能なライブラリに 抽象アスペクトとして実装 abstract aspect BarrierSync { private DAspect dAspect; public BarrierSync(DAspect dAspect) { this.dAspect = dAspect; dAspect.weave(); } abstract pointcut remote(String s); after(String h): remote(h) { ... dAspect.deploy(); }}
14
例:N 体問題の活性化制御アスペクト バリア同期の タイミングを利用
public abstract aspect BarrierSync { /* 織り込みたいアスペクト */ private DAspect dAspect; public BarrierSync (DAspect dAspect, String[] nodes) { this.nodes = nodes; this.dAspect = dAspect; dAspect.weave(); } abstract pointcut sync(); // バリア同期のメソッドの実行 before(String host): sync() && hostName(host) { // host 上で同期メソッドへ突入 } after(String host): sync() && hostName(host) { // host 上で同期メソッドが終了 if ( 全てのノードで同期メソッド突入後 ) if (dAspect.isWoven()) { dAspect.deploy(); this.unweave(); } … }} バリア同期の タイミングを利用 アスペクト準備完了 csg000 csg001 csg002 before 同期 after 同期 +活性化 同期
15
例:視覚化アスペクトの織り込み・活性化 活性化制御アスペクト に織り込みたいアスペ クトを渡す 織り込みを行うクラス :
public class Weaver { public static void main(String[] args) { DrawPolicy dp = new DrawPolicy( new DrawAspect() ); dp.weave(); while( !dp.isWoven() ){ Thread.sleep(10); } dp.deploy(); }} N 体問題の活性化制御アスペクト: 織り込むアスペクト : public dynamic aspect DrawPolicy extends BarrierSync { private DAspect dAspect; public DrawPolicy(DAspect dAspect) { … } pointcut sync(): execution(void Nbody.sync()) && hosts(“csg000”, …); } public dynamic aspect DrawAspect { … before(Satellite s): execution(void Nbody.calc(Satellite)) && hosts(nodes) && args(s) { // 描画処理 } …}
16
例:サーバ・クライアント間のメッセージ暗号化アスペクト
Client Server メッセージ 二つのアスペクトで機能を実現 クライアント側:暗号化 サーバ側:複合 片方だけが活性化されると通 信失敗 メッセージのやりとりの状況を 把握する必要がある 通信中に活性化してはいけな い 暗号化 復号 Client Server 暗号文 暗号化 解読不可 Client Server 暗号文
17
例:暗号化アスペクトのタイミング制御用アスペクト
Client Server メッセージ 1回の通信をもとに、双方の活性化を行う public abstract aspect ServerClient { /* 織り込みたいアスペクト */ private DAspect server, client; public ServerClient (DAspect server, DAspect client) { server.weave(); client.weave(); // 両方のアスペクトが準備できるまで待つ } abstract pointcut server(); // サーバのジョインポイント abstract pointcut client(); // クライアントのジョインポイント before (): client() { client.deploy(); // 1回だけ通信を許可する // 以降は wait() で待たせる // 先に送信中のメッセージが届くのを待つ } before(): server() { server.deploy(); this.unweave(); // 待たせていた通信を再開させる }} Client Server 暗号化 Client Server Client Server 復号 Client Server 暗号文
18
関連研究 CaesarJ [‘03 Mezini ら] DJAsCo [‘06 Navarro ら]
非活性状態のアスペクトを deploy 命令で活性化 遠隔ノードの処理の進行状況を集中管理できない DJAsCo [‘06 Navarro ら] Remote pointcut を使用できる フックを活性化する処理をアドバイスとして記述できない DyReS [‘08 Truyen ら] XML スクリプトで活性化までの流れを記述 遠隔ノードの処理の状況を把握することはできない スクリプトが複雑になりやすい
19
まとめと今後の課題 アスペクトの活性化のタイミング制御を別のアスペ クトとして分離して実装できる言語を提案した
分散ノードの処理の進行状況を把握しつつ、活性化 制御ができる N 体問題などの例を示した 実装の残りを完成させるのが今後の課題
Similar presentations
© 2024 slidesplayer.net Inc.
All rights reserved.