同期処理のモジュール化を 可能にする アスペクト指向言語

Slides:



Advertisements
Similar presentations
Web アプリをユーザー毎に カスタマイズ可能にする AOP フレームワーク
Advertisements

シーケンス図の生成のための実行履歴圧縮手法
セキュリティ機構のオフロードを考慮した仮想マシンへの動的メモリ割当
Dynamic AOPと その実装手法について
実行時のメモリ構造(1) Jasminの基礎とフレーム内動作
第2回:Javaの変数と型の宣言 プログラミングII 2007年10月2日.
侵入検知システム(IDS) 停止 IDS サーバへの不正アクセスが増加している
AspectScope によるアスペクトとクラスのつながりの視覚化
ネストした仮想化を用いた VMの安全な帯域外リモート管理
リファクタリングのための 変更波及解析を利用した テスト支援ツールの提案
同期的にアドバイスを活性化できる分散動的アスペクト指向システム
第20章 Flyweight ~同じものを共有して無駄をなくす~
ユーザ毎にカスタマイズ可能な Web アプリケーション用のフレームワークの実装
アスペクト指向プログラミングを用いたIDSオフロード
効率的なJava Dynamic AOPシステムを実現する Just-in-Time weaver
アスペクト指向プログラミングと Dependency Injection の融合
遠隔ポイントカット - 分散アスペクト指向プログラミング のための言語機構
J2EEアプリケーションにおける アプリケーションレベルスケジューリング
~手続き指向からオブジェクト指向へ[Ⅱ]~
細かい粒度でコードの再利用を可能とするメソッド内メソッドのJava言語への導入
細かい粒度で コードの再利用を可能とする メソッド内メソッドと その効率の良い実装方法の提案
ソードコードの編集に基づいた コードクローンの分類とその分析システム
第9章 例外処理,パッケージ 9.1 例外処理 9.2 ガーベッジコレクション.
独習JAVA 6.8 コンストラクタの修飾子 6.9 メソッドの修飾子 6.10 ObjectクラスとClassクラス 11月28日(金)
暗黙的に型付けされる構造体の Java言語への導入
関心事ごとに視点を切り替えて プログラムを編集できる 統合開発環境の提案と実装
数理・計算科学専攻 千葉研究室 08M37315 森田 悟史 指導教員 千葉 滋 教授
理学部 情報科学科 指導教官 千葉 滋 助教授 学籍番号 03_03686 内河 綾
アスペクト指向言語による 例外処理の記述方法の改善
オブジェクト指向プログラムにおける エイリアス解析手法の提案と実現
ユーザ毎にカスタマイズ可能な Webアプリケーションの 効率の良い実装方法
実行時情報に基づく OSカーネルのコンフィグ最小化
横断的関心事に対応したオブジェクト指向言語GluonJとその織り込み関係の可視化ツール
通信機構合わせた最適化をおこなう並列化ンパイラ
動的データ依存関係解析を用いた Javaプログラムスライス手法
ソースコードの特徴量を用いた機械学習による メソッド抽出リファクタリング推薦手法
豊富な情報を基にした pointcut を記述できるアスペクト指向言語
Recoveryアドバイスをもつ アスペクト指向システム
アルゴリズムとデータ構造1 2005年6月24日
アスペクト指向言語のための 独立性の高いパッケージシステム
アプリケーション依存の先読みが可能なO/Rマッピングツール
バイトコードを単位とするJavaスライスシステムの試作
アスペクト指向言語のための 独立性の高いパッケージシステム
J2EEアプリケーションにおける アプリケーションレベルスケジューリング
pointcut に関して高い記述力を持つ アスペクト指向言語 Josh
オブジェクト指向プログラミングと開発環境
ソフトウェア保守のための コードクローン情報検索ツール
Javaバーチャルマシンを利用した 動的依存関係解析手法の提案
プログラムの織り込み関係を可視化するアウトラインビューの提案と実装
JAVAバイトコードにおける データ依存解析手法の提案と実装
アルゴリズムとプログラミング (Algorithms and Programming)
静的情報と動的情報を用いた Javaプログラムスライス計算法
分散 Java プログラムのための アスペクト指向言語
Josh : バイトコードレベルでのJava用 Aspect Weaver
統合開発環境によって表現された 言語機構によるコードのモジュール化
プログラムの差分記述を 容易に行うための レイヤー機構付きIDEの提案
オープンソースソフトウェアに対する コーディングパターン分析の適用
ユビキタスコンピューティングの ための ハンドオーバー機能付きRMIの実装
状況に応じて適切な 例外処理が行なえる アスペクト指向分散環境実験の 支援ツール
プログラミング基礎a 第9回 Java言語による図形処理入門(1) Javaアプレット入門
統合開発環境のための プログラミング言語拡張 フレームワーク
開発者との対話を活かした 横断的構造の表現
エイリアス関係を考慮した Javaプログラム用静的スライシングツール
プログラムの一時停止時に 将来の実行情報を提供するデバッガ
回帰テストにおける実行系列の差分の効率的な検出手法
Javaとは Javaとはオブジェクト指向言語でJava VM(Java仮想マシン)と呼ばれるプログラム上で動作します。
オブジェクト指向言語における セキュリティ解析アルゴリズムの提案と実現
プログラム理解のための 付加注釈 DocumentTag の提案
GluonJ を用いたビジネスロジックからのデータベースアクセスの分離
Josh : バイトコードレベルでのJava用 Aspect Weaver
Presentation transcript:

同期処理のモジュール化を 可能にする アスペクト指向言語 理学部 情報科学科 04_00290 赤井駿平 指導教員 千葉滋

同期処理の分離の必要性 同期処理を適用する範囲を切り替えたい public class ProxyFactory { public Class createClass() { if (thisClass == null) { ClassLoader cl = getClassLoader(); synchronized (proxyCache) { if (useCache){createClass2(cl);} else {createClass3(cl);} }} return thisClass; } private void createClass2(ClassLoader cl) { CacheKey key = new CacheKey(…); HashMap cacheForTheLoader =…; if (cacheForTheLoader == null) { cacheForTheLoader = new HashMap(); proxyCache.put(cl, cacheForTheLoader); cacheForTheLoader.put(key, key); }else {...}} synchronized (key) { Class c = isValidEntry(key); if (c == null) { createClass3(cl); key.proxyClass = new WeakReference(…); }else{thisClass = c;} 同期処理を適用する範囲を切り替えたい 同期処理は計算機の特性により最適な粒度が変化 Javassistのバグレポート [JASSIST-28 : http://jira.jboss.org/jira/browse/JASSIST-28] 細かい粒度と粗い粒度の同期処理を切り替えて,動作速度を調べる 同期を行う箇所が散らばっているので切り替えが大変 粗い粒度 細かい粒度

アスペクト指向言語による同期の分離 - コード範囲をポイントカットすることの困難さ Fragile pointcut problem ソースコードを変更により 意図してしない場所をポイントカットしてしまう 意図した場所をポイントカットできなくなってしまう 範囲のポイントカットはソースコードの変更に弱い 例:行番号の指定 改行を追加するだけで意図した場所をポイントカットできなくなる ソースコードの変更に強い指定方法が必要

Fragile pointcut problemの要因 プログラムのブロック構造の変化 GluonJ/R [熊原ら ’07] 始点・終点をポイントカットで指定 ブロックの構造を無視したポイントカットを行えてしまう 適用できるアドバイスは例外処理のみ 類似したコード範囲の出現 LoopsAJ [Harbulot et al. ’06] ループのみポイントカット可能 メソッド内のループの区別ができない 取得するコンテキストに含まれる変数の名前・順序の変更 ローカル変数をアドバイスで利用したい ローカル変数の指定方法を工夫しないと,fragile pointcut

提案:ブロックポイントカット ブロックのような複数の実行点を含む範囲をジョインポイントとして指定 ソースコードの変更に強い範囲の指定方法 その範囲に対しアドバイスを実行できる 同期処理の分離や差し替えが容易 ソースコードの変更に強い範囲の指定方法 Fragile pointcut problemに対処可能 ポイントカットする範囲に条件を指定する 取得するコンテキストの指定

ブロック構造を考慮した範囲の指定 begin/endポイントカット void foo(){ … start(); if(n>0){ finish(); }else{ ... } begin/endポイントカット 始点,終点となるジョインポイントを指定し,その2点間がポイントカットされる ブロックの深さが違う場合は,同じ深さまでブロックをさかのぼる 制御構造やブロックと重ならないように範囲を決定 ×If文と重なる If文 void around(): begin(call(* *.start())) && end(call(* *.finish())) {proceed();}

類似したコード範囲の区別 include/excludeポイントカットを利用して絞り込む void bar(){ start(); a(); finish(); … b(); } include/excludeポイントカットを利用して絞り込む 範囲の中に含まれなければいけない,含まれてはいけないジョインポイントを指定 後から追加 void around(): begin(* *.start()) && end(* *.finish()) && include(call(* *.a())) { proceed(); }

コンテキストの取得 同期処理を行う場合,ローカル変数を取得できなければならない 型を指定して取得するローカル変数を選ぶ 変数の名前や宣言順で指定すると fragile pointcut problem が起こりやすい List list = (List)map.get("list"); synchronize(list){ start(); list.remove(0); finish(); } void around(List l) : begin(* *.start()) && end(* *.finish()) && args(List) && args(l) { synchronized(l){ proceed(l); }

実装 AspectJを拡張 中間表現上にブロック,制御構造,文の情報を記録する AspectBench Compiler を改造して実装 開始・終了を表す命令を新たに用意し,前後に挿入 ブロックを解析し,ポイントカットで指定された条件にマッチする範囲を選ぶ

適用例 Javassistのバグレポートにおける同期処理の粒度を切り替える 粗い粒度の場合 static WeakHashMap proxyCache; public Class createClass() { if (thisClass == null) { ClassLoader cl = …; if (useCache) createClass2(cl); else createClass3(cl); } return thisClass; void around(): begin(call(* *.createClass2(..)))&& end(call(* *.createClass3(..))) { synchronized( ProxyFactory.proxyCache){ proceed(); }

適用例(続き) 細かい粒度の場合 static WeakHashMap proxyCache; void around(): private void createClass2(ClassLoader cl) { CacheKey key =…; HashMap cacheForTheLoader = (HashMap)proxyCache.get(cl); if (cacheForTheLoader == null) { proxyCache.put(...); cacheForTheLoader.put(...); }else{...} Class c = isValidEntry(key); if (c == null) { createClass3(cl); key.proxyClass = new WeakReference(thisClass); } void around(): begin(call(* WeakHashMap.get(..))) && end(call(* WeakHashMap.put(..))){ synchronized( ProxyFactory.proxyCache){ proceed(); } void around(CacheKey key): begin(call(* *.isValidEntry(..))) && end(call(WeakReference.new(..))) && args(CacheKey) && args(key){ synchronized(key){ proceed(key);

速度の測定 Javassistの同期の粒度をアスペクトを用いて変更し,バグレポートに投稿されたマイクロベンチマークを使用して実行時間を測定(1000回試行) 4コア,40スレッド 細かい粒度 : 平均実行時間 8.97秒,標準偏差 0.36 粗い粒度 : 平均実行時間 11.94秒,標準偏差 0.17 2コア,40スレッド 細かい粒度 : 平均実行時間 13.31秒,標準偏差 1.02 粗い粒度 : 平均実行時間 13.08秒,標準偏差 0.26 実験環境 CPU:Xeon 3.00GHz 最大4コア メモリ: 2GB OS: Linux 2.6.22-14 JVM: java 1.6.0_03 アスペクトを用いて粒度を切り替えた方が性能が良くなる

粒度の切り替えによる性能の向上 2コアで40スレッドの場合,粗い粒度の方が安定した速度 速度の安定性を考えると,粗い粒度の方が良い性能を出すことが分かる

まとめと今後の課題 範囲をポイントカットする機構を提案 今後の課題 同期処理を分離して記述することができる AspectBench Compilerを改造して実装 Javassistに適用して実験 今後の課題 コンテキスト渡しの指定方法の改善 より柔軟な範囲の指定方法