• 検索結果がありません。

Koala 例外処理拡張による実行時オーバーヘッドの評価

N/A
N/A
Protected

Academic year: 2021

シェア "Koala 例外処理拡張による実行時オーバーヘッドの評価"

Copied!
6
0
0

読み込み中.... (全文を見る)

全文

(1)2006−EVA−16(6)   2006/3/20. 社団法人 情報処理学会 研究報告 IPSJ SIG Technical Report. Koala 例外処理拡張による実行時オーバーヘッドの評価 殷 中翔 †. 中西 恒夫 ‡. 福田 晃 ‡. † 九州大学大学院システム情報科学府 〒 816-8580 福岡県春日市春日公園 6-1 ‡ 九州大学大学院システム情報科学研究院 〒 816-8580 福岡県春日市春日公園 6-1 E-mail: †[email protected], ‡ {tun,fukuka}@f.csce.kyushu-u.ac.jp あらまし 組込み向けコンポーネントモデル Koala は,可変部分を有するソフトウェア構造の 記述に優れ,プロダクトライン開発に適する.しかしながら Koala は,異常処理の扱いに不 可欠の例外処理機構をもたないため,筆者らは過去に Koala への例外処理拡張を提案した.本 稿ではさらに,当該例外処理拡張において例外発生時にパラメータの受け渡しを可能にすると ともに,実行時オーバーヘッドの評価を行う.例外発生時の実行時オーバーヘッドは,C++ のそれと比較して,大幅に軽いものであった.. Implementation and Evaluation of An Exception Handling Model for The Koala Component Model Zhongxiang Yin†. Tsuneo Nakanishi‡. Akira Fukuda‡. † Graduate School of Information Science and Electrical Engineering, Kyushu Univ. ‡ Faculty of Information Science and Electrical Engineering, Kyushu Univ. E-mail: †[email protected], ‡ {tun,fukuka}@f.csce.kyushu-u.ac.jp Abstract Koala, an embedded component model, is suitable for product line software engineering since it has ability to model variability in software structure. However, Koala does not equip with any exception handling mechanism though it is considered necessary for embedded software. We have proposed an approach to extend Koala for exception handling.In this paper,we additionally extend that exception handling mechanism to pass parameters along with exceptions. Moreover,we evaluate the runtime overhead associated with exception handling.The overhead caused by exception raising is proved reasonably less than that of C++.. 1. による再利用は,決して PLSE による再利用と 排他的になされるものではなく,むしろ両者は 組込みソフトウェア開発において,大規模化, 同時に行うべきである. 複雑化,高機能化に伴い,再利用技術の一層の 組込み向けのコンポーネント技術は,これまで 活用が望まれている. に Koala [3],PECOS [4],PBO [5],TOPPERS 組込みソフトウェア分野における将来的な再 コンポーネントモデル [6] 等が提案されている. 利用の手段として,コンポーネントベース開発 Koala は Philips 社が提案したコンポーネントモ (CBSE: Component Based Software Engineer- デルであり,TV 受像機のプロダクトラインにお ing)[1],およびプロダクトライン開発方法論 ける使用実績がある.組込みシステムのために (PLSE: Product Line Software Engineering)[2] 部分評価による最適化,省メモリ対策等が施さ が挙げられる. れていると同時に,Diversity Interface 等によっ CBSE は,コンポーネントと呼ばれるソフト てプロダクトライン開発を支援する仕組みも設 ウェアの部品を,組み立ててシステムを開発す けられている.そこで本研究は,相違性の表現 る手法である.CBSE はコードを対象とする再 に優れ,PLSE との相性のよい Koala を研究対 利用であるに対して,PLSE は,類似製品群の 象とした. 共通性/相違性に着目し,開発過程全般での設計 組込みシステムのほとんどは,長期に渡って安 資産の大規模かつ戦略的な再利用を図る. CBSE 定して動作することが望まれているため,よく. はじめに. −31− –1–.

(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)

図 2 で示したコードに基づき,Termination 型

参照

関連したドキュメント

の総体と言える。事例の客観的な情報とは、事例に関わる人の感性によって多様な色付けが行われ

トリガーを 1%とする、デジタル・オプションの価格設定を算出している。具体的には、クー ポン 1.00%の固定利付債の価格 94 円 83.5 銭に合わせて、パー発行になるように、オプション

あれば、その逸脱に対しては N400 が惹起され、 ELAN や P600 は惹起しないと 考えられる。もし、シカの認可処理に統語的処理と意味的処理の両方が関わっ

定的に定まり具体化されたのは︑

ぎり︑第三文の効力について疑問を唱えるものは見当たらないのは︑実質的には右のような理由によるものと思われ

小学校における環境教育の中で、子供たちに家庭 における省エネなど環境に配慮した行動の実践を させることにより、CO 2

具体的な取組の 状況とその効果 に対する評価.

具体的な取組の 状況とその効果