理学部 情報科学科 06_19780 早船 総一郎 指導教員 千葉 滋 教授 1 動いているプログラムを修正する 実行を止めることなく機能を追加するのは大変 いろいろ制限がある 静的と同じ自由度 にしたい ©森田 悟史 2 既存の around advice 様々システムが存在 未実装や不可能な部分も存在 特に around advice around は不完全 around advice 利用可能 execution remote pointcut pointcut + HW + HW 分散DAOP remote pointcut Hot weaving (HW) before after advice PROSE × ○ ○ ? ? × JAC × ○ ○ ○ ○ × DJAsCo ○ ○ ○ ○ ○ △ CaesarJ × × ○ ○ × × ReflexD ○ ○ ○ ○ ? ? DandyJ ○ ○ ○ ○ △ △ 3 なぜ実装が難しいか 特に around advice 実装には新規メソッドの追加が必要 標準 JVM の Hotswap は追加をサポートしない Inlining などの最適化技法を難しくする class { void run(){ … } … 置き換え code 追加 method 追加 } field 4 提案: around advice に対応した 分散 DAOP の実装方法 標準 JVM の利用 around advice execution pointcut, proceed, remote pointcut に対応 実装技術 ロード時の method wrap proceed + execution pointcut を実現 遠隔 proceed 呼び出しの拡張 実行コンテキストを含むように改造 proceed + remote pointcut を実現 二重の around advice を実現 (今回の発表では省略) 5 around advice とはadvice メソッドの上書き proceed: 元のメソッド を呼び出す メソッドボディの退避 が必要 これができないのが 問題だった Aspect around : execution (foo()) { // 追加機能 proceed(); // 元の処理 } pointcut Target App void foo () { // 処理 } 織り込み前 織り込み後 Aspect around : execution (foo()) { // 追加機能 proceed(); // 元の処理 } 退避 Target App void foo () { hook } void foo’ () { // 処理 } 6 提案手法1: ロード時の method wrap あらかじめ退避しておく ロード時はメソッド追加可能 上書きしても O.K. Aspect around : exec(foo()) { // 追加機能 proceed(); // 元の処理 } ロード前 ロード後 Aspect around : exec(foo()) { // 追加機能 proceed(); // 元の処理 } Target App void foo () { // 処理 } around : exec(foo()) { // 追加機能 proceed(); // 元の処理 } Target App void foo () { foo’(); } void foo’ () { // 処理 } 織り込み前 織り込み後 本システム Target App void foo () { foo’(); } void foo’ () { // 処理 } ロード後 Aspect 退避 Aspect around : exec(foo()) { // 追加機能 proceed(); // 元の処理 } Target App void foo () { hook } void foo’ () { // 処理 } 7 提案手法2: 遠隔 proceed 呼び出しの拡張 実行コンテキストを含むように拡張 分散では元の処理を直接呼び出せない 本システムがディスパッチを行う Target App 分散 Aspect context around : exec (foo()) { // 追加機能 proceed(); // 元の処理 } args args 直接は呼び出せない context args void foo () { hook } void foo’() { // 処理 } 本システム context 実行コンテキストを 利用して dispatch 8 実装・実験 実装 行数:約2600 行 Instrument API バイトコードの置き換え Javassist バイトコードの変換 unweave weave 300 250 時間 (ミリ秒) 実験 remote pointcut で メッセージ通信 App に機能追加 改良の余地あり 実験環境 InTrigger の chiba, mirai, hongo を利用 OS:Debian chiba, hongo CPU: Core2Duo 2.13GHz メモリ: 4GB mirai CPU: XeonE5410 2.33GHz メモリ: 16GB 200 150 100 50 0 1 101 201 301 回数 401 9 関連研究 DJcutter [Nishizawaら '04] 分散対応のポイントカット (Remote Pointcut) 動的な織り込みができない HotWave [Villazonら '09] アドバイス間のデータ伝達 (inter-advice communication) アラウンドアドバイスをエミュレート 完璧なエミュレートでない Envelope-Based Weaving [Bockischら '06] コンパイル時のラップを行う VMレベルでの織り込み 分散ではない 10 まとめと今後の課題 まとめ 分散動的アスペクト指向言語の around advice の 実装方法を提案 ロード時の method wrap 遠隔 proceed 呼び出しの拡張 今後の課題 method wrap の方法などを変え、オーバーヘッドの軽減 他の方法での around advice の実装を提案 動的プロキシを利用 呼び出し側の変換 各実装での比較実験 11 リモート呼び出しが実行コンテ キストを含むように改造 proceed がリモート呼び出しになる メソッドディスパッチを行う proceed に情報を付けて呼び出すことで行う App Host Aspect Host Aspect around(): execution(foo()) && host(App){ // advice proceed(); // advice } 本システム proceed 呼び出し 登録 index App foo(){ Hook アドバイスの foo$w(); 呼び出し } 元の処理を 呼び出し foo$w(){ // code } 12 同じジョインポイントに対して織 り込みが行われる場合 proceed がアドバイスを呼び出す proceed の情報にアドバイスを呼び出すことを加える App Host Aspect Host 本システム Aspect A App proceed(); Hook Aspect B proceed(); advice を 呼び出し 元の処理 元の処理を 呼び出し 13 13 14 実験の詳細 mirai mirai と chiba で通信 hongo から mirai のジョインポイントを 指定する mirai -> hongo -> mirai -> chiba の 順 App chiba hongo 織り込み命令 Aspect App 15 本システムのオーバーヘッド 本システムを用いた場合のオーバーヘッド 約3 %のエージェントによるオーバーヘッド これに加えて、ロード時に行うオーバーヘッド 50 50 エージェントなし 45 45 40 40 エージェントあり 3% 35 35 30 30 25 1 101 201 301 401 25 1 101 201 301 401 16 300 時間 (ミリ秒) 250 200 150 100 50 50 45 0 1 101 201 301 401 40 時間 (ミリ秒) 回数 時間 (ミリ秒) 70 35 30 25 20 15 60 10 50 5 0 40 1 101 201 301 401 回数 30 20 10 0 1 101 201 301 401 回数 17
© Copyright 2024 ExpyDoc