Koala 例外処理拡張による実行時オーバーヘッドの評価
6
0
0
全文
(2) 設計された例外処理の提供が不可欠である.し かし,Koala ではビルドインの例外処理機構が 提供されていない.我々は,Koala コンポーネ ントモデルを拡張し,例外処理の概念を導入し た [7].Koala では,インターフェース記述言語 (IDL),ならびにコンポーネント内部の振舞の 記述に C 言語を用いる.我々は IDL および C 言 語に例外処理構文を追加し,例外処理コードの 信頼性と可読性の向上を図った. 本稿は,文献 [7] で提案した例外処理の拡張を 概説し,同文献で提案した拡張 IDL 言語,C 言 語を標準のものに変換する Koala プリプロセッ サの実装と評価について述べる.2 節では Koala の例外処理拡張,3 節では Koala プリプロセッ サの実装を説明する.4 節では例外処理拡張によ る実行時オーバーヘッドの評価を行う.最後に, 5 節で本稿をまとめる.. 子は,Provides インターフェースと呼ばれ,外 部のコンポーネントに対してサービスを提供す ることを意味する.前者は関数呼出元を,後者 は関数呼出先をモデル化したものである. インターフェースはインターフェース記述言語 (IDL:Interface Description Language) で記述さ れる.図 1 のインターフェース pIf を IDL 言語 で定義すると以下のようになる. interface IF { void foo(int p); int boo(void); }. アプリケーションの具体的な振舞は,モジュー ルに記述される.モジュールの実体は,C 言語の コードである.モジュールは,インターフェース の三角形底辺側と接続する場合,そのインター フェースが定義する関数を参照することが可能 となり,インターフェースの三角形頂点側と接 続する場合,そのインターフェースの定義する 2 Koala の例外処理拡張 全ての関数を実装する必要がある. Koala 自体は例外処理機構を持たず,開発者 2.1 Koala の概要 は例外処理を記述するためには,C 言語の標準 Koala アプリケーションは,複数のコンポー の制御構造を用いて記述するほかない.しかし, ネントによって構成される.コンポーネントは, C 言語は例外処理のための構文を持たないため, 複数のインターフェースを持つことができ,そ 複雑な制御を実現するには手間が掛かる.例外 れらインターフェースを経由して外部環境との 処理の不備の検出手段もないので,安全性の観 点から好ましくない.これら不足を対処するに 通信を行う. は,我々は Koala の例外処理機構を拡張する.. 2.2. 図 1: Koala の例 図 1 は Koala のコンポーネントモデル図であ る.コンポーネントにつく,三角形のマークを 伴う端子は,コンポーネントのインターフェー スを意味している.コンポーネントの外に出る 三角形マークを伴う端子は,Requires インター フェースと呼ばれ,外部のコンポーネントが提 供するサービスを利用することを意味する.コ ンポーネントの中に入る三角形マークを伴う端. 例外処理拡張の提案. 例外処理モデル:提案する Koala 例外処理機 構拡張では,アプリケーション全体で一意の名 前で例外を表現する.例外を発行するときに,開 発者が独自に定義した構造体をパラメータとし て付随することもできる. コンポーネント利用者の視点から見た場合,他 のコンポーネントからサービスを受けるときは, そのコンポーネントの Provides インターフェー スに,自身のコンポーネントの Requires イン ターフェースを接続する.何かしらの理由でサー ビスを提供できない場合,そのコンポーネント は例外を発行するものとする.すなわち,例外は 常に Provides インターフェースから Requires インターフェースに向けて発行される.我々は, Koala のコンポーネントモデルのインターフェー ス接続について,Requires インターフェースか. −32− –2–.
(3) ら Provides インターフェースへのサービス要求 だけではなく,Provides インターフェースから Requires インターフェースへの例外の伝搬を表 すものと,その意味を拡張する. また,より柔軟に例外に対応できるように, Termination 型復帰と Resumption 型復帰の両 方に対応する. IDL 言語の拡張:前述の例外処理拡張を導入 するために,Koala の IDL 言語を拡張する. IDL 言語において,関数を宣言する際,外部へ 伝搬する例外も明記させるようにする.下記は拡 張した IDL 言語でインターフェースを記述する例 である.throws_t ex1 と throws_r ex2 は,そ れぞれ Termination 型例外 ex1 と Resumption 型例外 ex2 を発行することを意味する. Interface IF { void foo (int p) throws_t ex1; int boo (void) throws_r ex2; }. 行された場合,ex を処理する catch t 節を持つ, try 節入れ子構造で最も内側の try 節を検索す る.検索した try 節の,例外 ex の catch t 節を 実行し,実行後は当該 try 節の次の文に制御を 移行する. throw_r ex, param; Resumption 型例外 ex を発行する.例外ハン ドラの検索は throw t と同様であるが,例外ハ ンドラ実行完了後は,throw r 文の次に制御が移 行される. 今回本稿では,throw t,throw r 構文で例外に パラメータを付加し,catch t,catch r において これらパラメータを受け取るように,文献 [7] で 提案した Koala 例外処理拡張をさらに拡張した.. 3. Koala プリプロセッサ. 拡張 IDL 言語と拡張 C 言語による記述を,標 準の IDL 言語と C 言語に変換する Koala プリ インターフェースの実現側は,明記されてい プロセッサを導入する. ない例外を外部へ発行してはいけない.また,イ Koala プリプロセッサは,拡張 IDL 言語,拡 ンターフェースの利用側は,外部へさらに伝搬 張 C 言語による記述が構文的かつ意味的に正し しない限り,例外を処理する責任があり,利用側 いか検査し,問題がなければ,例外処理コード に例外ハンドラが定義されていなければエラー を含む,等価な標準 IDL 言語,標準 C 言語によ として扱われる. る記述を生成する.紙面の都合上,拡張 IDL 言 C 言語の拡張:文献 [10] では C 言語に try/catch 語の変換は文献 [7] にゆずる. 構文を導入しているが,我々も同文献と類似の 図 1 で示した,Compo1,Compo2 の構成を例に, 手法を採用し,Koala コンポーネントモデルの 例外処理構文を伴う拡張 C 言語のコードの標準 モジュール記述に使用する C 言語に,下記の構 C 言語コードへの変換を示す.変換のアルゴリズ 文を導入することとした [7]. ムについては,例外ハンドラの検索については文 try {...} 献 [9] で提案されたアルゴリズム,Resumption try 節は,後続の catch 節に記述される例外 型例外処理の実現については文献 [11] 掲載のア ハンドラのスコープを定める.例外の発生する ルゴリズムを参考にした. 可能性があるコードを中括弧の中に置く. 図 2 は変換前の拡張 C 言語によるコードで catch_t (ex,param) {...} ある. catch t 節は,指定された Termination 型例外 例外 EX1 について,図 3 で示すような例外管 ex を処理する例外ハンドラを定義する例外 ex 理構造体を定義し,さらに,例外管理構造体を が発行されると,制御は該当 catch t 節に移行 格納するスタックをひとつ用意する. し,例外処理が行われる.また,param 経由で Compo1 において,例外 EX1 を処理する catch_t 例外に付随するパラメータを参照できる. 節が,関数 catch_nnn として分離される.EX1 catch_r (ex,param) {...} を処理する catch_t/catch_r 節は複数存在する catch r 節は,指定された Resumption 型例外 場合もあるので,それらを区別するため,関数 ex を処理する例外ハンドラを定義する.記述方 名に一意の番号 nnn を接尾辞としてつける. 法は catch t 節と同様である. try 節進入時は,setjmp を用いて,例外ハンド throw_t ex, param; ラからの Termination 型復帰に備えて,現在の Termination 型例外 ex を発行する.param は 実行環境を例外管理構造体のメンバ env に保存す 例外に付随するパラメータである.例外 ex が発 る.このときの setjmp の戻り値は 0 であり,例 −33− –3–.
(4) /* Compo1_Module1 */ void fun () { EX1_PARAM *param; ... try { rIf_foo (); } catch_t (EX1, param) { ... } }. 関数 catch_nnn の内容は,Termination 型と Resumption 型では異なる.Termination 型の場 合,例外処理終了後 longjmp を用いて,対応する try 節の入口に制御を移行する(10 行).setjmp の戻り値が 0 以外の値となるように,実引数に −1 が指定されていることに注意されたい.一方, Resumption 型の場合はそのまま throw_r の直 後に復帰する.また,例外に付随するパラメー タは,例外管理スタックのトップ要素から取得 できる(2–3 行).. /* Compo2_Module2 */ void pIf_foo () { EX1_PARAM param; ... throw_t EX1, param; ... }. 1 2 3 4 5 6 7 8 9 10 11. 図 2: 変換前の拡張 C 言語の例 typedef struct _EX1_INFO { EX1_PARAM param; jmp_buf env; void (* exhandler)(); ... } EX1_INFO;. 図 3: 例外管理構造体 外管理構造体のメンバ exhandler に catch_nnn のアドレスを保存し,EX1 用の例外管理スタック に push し(6–7 行),try 節内部を実行する.例 外が発生するか否かに関わらず,try 節進入時に push された例外管理構造体は,try 節から脱出 する際にスタックから pop される(13 行). Termination 型例外が発生した場合は,例外 ハンドラ実行後に,setjmp からの復帰として, setjmp の直後,さらに 13 行に制御が移される. この例において,catch 節は一つしかないので 例外管理構造体の push/pop 操作は 1 回で済む が,複数ある場合はその数だけ push/pop 操作 が必要である. 1 2 3 4 5 6 7 8 9 10 11 12 13 14. void fun () { EX1_INFO info; ... int ret = setjmp (info.env); if(ret == 0) { info.exhandler = catch_nnn; EX1_push (info); /* try 節内部はじまり */ rIf_foo (); /* try 節内部おわり */ } EX1_pop ();. void catch_nnn () { EX1_INFO info = EX1_top(); EX1_PARAM *param = &info.param; /* catch_t 節内部はじまり */ ... /* catch_t 節内部おわり */ /* catch_r 構文の場合は省略 */ longjmp (info.env, -1); }. 拡張 C 言語の throw t 文は Termination 型例 外の発行を意味する.当該例外に対応する例外 管理構造体スタックのトップ要素には,当該例 外を処理する catch 節を有する try 節進入前に push された,例外管理構造体がある.そのメン バ param に,throw t の例外パラメータを保存 する(2–5 行).さらに,メンバ exhandler に 格納されている例外ハンドラのアドレスを取得 し,例外ハンドラを呼び出す(6 行). 1 void pIf_foo () { 2 EX1_PARAM param; 3 ... 4 EX1_INFO* info = &(EX1_top()); 5 info->param = param; 6 info->exhandler(); 7 ... 8 }. Resumption 型例外を発行する throw r 文も 同様の変換を行う.. 4. 実行時オーバーヘッドの評価. 本節では,Koala プリプロセッサにより生成 する,C 言語コードを実行速度,メモリ消費量 の面から評価する.. }. –4– −34−.
(5) 4.1. 明らかに例外処理構文の実行時オーバーヘッ ドをもたらしているが,示されているデータは 図 1 で示した Compo1,Compo2 の構成を例に, 例外が発生した場合での実行時間であることに 図 2 で示したコードに基づき,Termination 型 注意されたい.現実には例外は頻発するもので と Resumption 型例外を個別に評価するプログ はない.また,C++の例外発生時のオーバヘッ ラムを作成する.評価プログラムを図 4 に示す. ドはかなり大きい. 1 for (int i=0; i<10; i++) { さらに,try/catch の入れ子構造が実行スピー 2 T0 = ... /* 開始時刻 */ ドへの影響を調べるために,下記関数 f1 を定義 3 for (int j=0; j<10000000; j++) { 5 行で発行する例外を変更することによっ する. 4 /* 図 2 の try/catch 節 */ て,try 節の入れ子の深さが調整できる.例えば, 5 /* (try 節内で例外 EX1 を発行) */ 6 ... EX1 を発行する場合の深さは 1 であり,EX3 を 7 } 発行する場合の深さは 3 となる.. 実行速度. 8 9 10. T1 = ... /* 終了時刻 */ T = T1 - T0;. 1 2 3 4 5 6 7 8 9 10 11 12. }. 図 4: 評価プログラムの概要 すなわち,内側のループでは,例外処理を 10,000,000 回実行させ,実行時間 T を計測する. 外側のループでは T をさらに 10 回計測し,その 平均値を最終の実行時間とする. Koala プリプロセッサが生成する C 言語のコー ドに対して,PC における実行時間の計測を行う. 比較のために,例外を発行しない場合(try/catch 節があるが throw 文がなし),例外処理なしの 場合(try/catch 節,throw 文ともになし),な らびに C++言語の例外処理構文を用いて上記評 価プログラムを実装する場合の実行時間も測定 する.C++は Termination 型の例外しか処理で きないため,Resumption 型例外処理における実 行時間の比較はしていない. 測定環境は以下の構成である.CPU:AMD Athlon XP 2000+(動作周波数:1.67 GHz),メ モリ:512M,OS:Fedora Core 4.0(Linux 2.6), コンパイラ:GCC-4.0.2,最適化オプション:-O3. 測定結果を表 1 で示す.表 1 における括弧中 の数字は,例外を発行しない場合の実行時間を 示す. 表 1: PC における実行時間(単位:ミリ秒) Koala 例外処理拡張 例外処理 C++言語 TerminResumpなし Termination 型. tion 型. 67 (23). 33 (23). ation 型. 2. void f1(void) { try { try { try { throw_t EX?; } catch_t (EX1) { } } catch_t (EX2) { } } catch_t (EX3) { } }. 評価するときに,図 4 の 4 行目から f1() を呼 び出し,入れ子の深さを調整しながら,実行時 間を測定する.測定結果は表 2 の通りである. 表 2: 入れ子の深さと実行時間の関係(単位:ミ リ秒) 入れ子 の深さ. Termination 型. Resumption 型. 1. 103. 70. 2. 116. 74. 3. 120. 75. 測定結果によると,入れ子の深さの増大につ れて,実行速度が若干落ちることがわかる.. 4.2. メモリ消費量. 提案例外処理機構のメモリ消費量 C は,式 1 で表すことができる.. 8865 (2). Termination 型の例外を処理する際に,setjmp と longjmp を一回ずつ呼び出すに対して,Resumption 型の例外の場合,setjmp を一回しか 呼び出していない.そのため,後者の実行時間 は前者の半分ぐらいに短縮される.. C=. Ne . Dk × Sk. (1). k=1. Ne は定義された例外の数である.Dk は,例 外 EXk の入れ子構造の最大深さ,すなわち例外 EXk に関連づけられる例外管理構造体スタック. –5– −35−.
(6) の長さを示す.Sk は,図 3 で定義された例外管 for Consumer Electronics Software,” IEEE Computer, Vol.33, No.3, pp.78–85, Mar. 2000. 理構造体 EX INFO のサイズであり,例外 EXk に付随するパラメータのサイズ Pk に決定される. [4] O. Nierstrasz, S. Ducasse, R. Wuyts, G. Ar´evalo, A. Black, P. Muller, C. Zeidler, T. メモリ消費量の計算例を示す.. Ne. 5. Genssler, and R. v. d. Born, “A Component Model for Field Devices,” Proc. IFIP/ACM Working Conf. on Component Development, pp.200–209, 2002.. 表 3: メモリ消費量 Dk Pk メモリ消費量 (bytes) (bytes). 8. 3. 4. 960. 8. 3. 8. 1920. 16. 5. 8. 3200. 16. 5. 16. 3840. 32. 5. 8. 6400. 32. 5. 16. 7680. [5] D. B. Stewart, R. A. Volpe, and P. K. Khosla, “Design of Dynamically Reconfigurable RealTime Software Using Port-Based Objects,” IEEE Trans. on Software Engineering, Vol.23, No.12, pp.759–776, Dec. 1997. [6] 山本将也, 高田広章, 大山博司, 「組込みシステム に特化したコンポーネント仕様の実装と評価」, ソ フトウェアシンポジウム 2005 論文集, pp.61–68, 2005 年 6 月. [7] 殷 中翔, 中西 恒夫, 福田 晃, 「組み込みコンポー ネントにおける例外処理機構の一実装」, 組込み システム合同研究会 論文集, pp. 2-9, 2006 年 1 月.. まとめ. 本稿では,組込みコンポーネントモデル Koala に対する,例外処理機構の拡張について述べた. Koala では,インターフェース記述言語(IDL), ならびにコンポーネント内部の振舞の記述に C 言語を用いる.文献 [7] では,IDL および C 言 語に例外処理構文を追加することによって,例 外処理機構を持たない Koala に例外処理機構を 設けた.本稿ではさらに,当該例外処理機構に おいて,例外発生時にパラメータの受け渡しを 可能にするとともに,拡張された IDL 言語と C 言語から,標準の IDL 言語と C 言語に変換する Koala プリプロセッサの概要を示した.最後に, 実行スピードおよびメモリ消費量の側面から,例 外処理によるオーバーヘッドを評価した結果,比 較的軽い動作を実現することが分かった. 今後は,例外ハンドラにおいてローカル変数 が参照できない制約を緩和するとともに,提案例 外処理機構に finally 等付加構文の追加や,オー バヘッドを軽減する手法について検討したい.. [8] J. Lang and D. B. Stewart, “A Study of the Applicability of Existing Exception-Handling Techniques to Component-Base Real-Time Software Technology,” ACM Trans. on Programming Languages and Systems, Vo.20, No.2, pp.274–301, Mar. 1998. [9] J. Lang, “An O(1) Distributed Exception Handling Mechanism for Dynamically Reconfigurable Real-Time Software,” M. Thesis, Graduate School of the University of Maryland, 1997. [10] N. H. Gehani, “Exceptional C or C with Exceptions,” Software: Practice and Experience, Vol.22, No.10, pp.827–848, Oct. 1992. [11] B. Stroustrup, The C++ Programming Language, Addison-Wesley, 2000.. 参考文献 [1] C. Szyperski, D. Gruntz, and S. Murer, Component Software: Beyond Object-Oriented Programming, 2nd Ed., Addison-Wesley / ACM Press, 2002. [2] P. Clements and L. M. Northrop, Software Product Lines: Practices and Patterns, Addison-Wesley, 2001. [3] R. v. Ommering, F. v. d. Linden, J. Kramer, and J. Magee, “The Koala Component Model. −36− –6–E.
(7)
図
関連したドキュメント
の総体と言える。事例の客観的な情報とは、事例に関わる人の感性によって多様な色付けが行われ
トリガーを 1%とする、デジタル・オプションの価格設定を算出している。具体的には、クー ポン 1.00%の固定利付債の価格 94 円 83.5 銭に合わせて、パー発行になるように、オプション
あれば、その逸脱に対しては N400 が惹起され、 ELAN や P600 は惹起しないと 考えられる。もし、シカの認可処理に統語的処理と意味的処理の両方が関わっ
定的に定まり具体化されたのは︑
ぎり︑第三文の効力について疑問を唱えるものは見当たらないのは︑実質的には右のような理由によるものと思われ
小学校における環境教育の中で、子供たちに家庭 における省エネなど環境に配慮した行動の実践を させることにより、CO 2
具体的な取組の 状況とその効果 に対する評価.
具体的な取組の 状況とその効果