annotate resume/master_resume.tex @ 22:d9667cf8aa3f

*** empty log message ***
author atsuki
date Wed, 20 Feb 2008 16:50:00 +0900
parents d66662b295ba
children 12e852a3e36a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
19
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
1 \documentclass[twocolumn, a4j, twoside]{jarticle}
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
2 \usepackage{master_proc}
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
3 \usepackage[dvips]{graphicx}
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
4
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
5 % dvipdfm を使って PDF ファイルに日本語の栞をつける
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
6 % \usepackage[dvipdfm]{color}
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
7 % \usepackage[dvipdfm,bookmarks=true,bookmarksnumbered=true,%
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
8 % bookmarkstype=toc]{hyperref}
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
9
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
10 \jtitle{線形時相論理によるContinuation based Cプログラムの検証} %和文タイトル
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
11 \etitle{Verification of Continuation based C Program using Linear-time Temporal Logic} %英文タイトル
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
12 \author{下地 篤樹} %著者名
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
13 \studentid{068507B} %学籍番号
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
14 \teacher{河野 真治} %指導教官
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
15
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
16 \begin{document}
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
17 \maketitle
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
18 \section{はじめに}
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
19 リアルタイムプログラムや並列プログラムのような非決定性を含むプログラムは、
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
20 逐次型のプログラムに有効な二分法などによるデバッグ手法ではデバッグすることが
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
21 困難である。
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
22 そのため、非決定性を含むプログラムに対して有効なデバッグ手法や検証手法の
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
23 確立が重要な課題となっている。
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
24
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
25 そこで、本研究では、Continuation based C(CbC)言語による実装と
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
26 その実装に対する検証手法を提案している。
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
27 また、CbCで記述されたプログラムは状態遷移記述になるという性質がある。
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
28
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
29 本研究は、CbCプログラムが状態遷移記述になることに着目し、
22
d9667cf8aa3f *** empty log message ***
atsuki
parents: 21
diff changeset
30 状態遷移記述に対して有効であるタブロー法による状態の展開を行い、
19
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
31 状態を展開する際に、線形時相論理も同時に展開することにより検証を行う。
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
32
21
d66662b295ba *** empty log message ***
atsuki
parents: 20
diff changeset
33 \vspace{-2mm}
20
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
34 \section{Continuation based Cの概要}
21
d66662b295ba *** empty log message ***
atsuki
parents: 20
diff changeset
35 CbC は、C言語を制限したもので、
22
d9667cf8aa3f *** empty log message ***
atsuki
parents: 21
diff changeset
36 Cからループ制御構造と、サブルーチン・コールを取り除き、継続を導入した言語である。
d9667cf8aa3f *** empty log message ***
atsuki
parents: 21
diff changeset
37 この言語は、Cに継続専用のプログラム単位であるコード(code)と、
20
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
38 継続(goto)を導入した構成となっている。
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
39 継続とは、次に実行すべきコードを直接または間接的に指定する手法である。
22
d9667cf8aa3f *** empty log message ***
atsuki
parents: 21
diff changeset
40 CbC は、サブルーチンよりも小さいプログラム単位であるcodeを導入しているため、
20
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
41 C言語よりも細かく、アセンブラよりも高度な記述が可能であるという利点がある。
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
42
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
43 CbCはコードセグメントを引数付きgoto文で接続することで継続を実現している。
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
44 コードセグメントとは、codeという型で定義されるプログラム単位である。
22
d9667cf8aa3f *** empty log message ***
atsuki
parents: 21
diff changeset
45 このコードセグメントへの遷移は引数付きgoto文によってのみ行われる。
20
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
46 また、コードセグメントからの脱出も引数付きgoto文によってのみ行われる。
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
47
22
d9667cf8aa3f *** empty log message ***
atsuki
parents: 21
diff changeset
48 また、ここでは、CbCにおける並列度はコードセグメント単位を使用する。
20
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
49
22
d9667cf8aa3f *** empty log message ***
atsuki
parents: 21
diff changeset
50 CbCにCのサブルーチンへ戻るための環境付き継続を
d9667cf8aa3f *** empty log message ***
atsuki
parents: 21
diff changeset
51 導入することでCの上位言語となる。この言語をCwC(C with Continuation)と呼ぶ。
20
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
52 CwCでは、CbCから通常のC言語の関数を呼び出すことができる。
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
53
21
d66662b295ba *** empty log message ***
atsuki
parents: 20
diff changeset
54 \vspace{-2mm}
d66662b295ba *** empty log message ***
atsuki
parents: 20
diff changeset
55 \section{線形時相論理の概要}
d66662b295ba *** empty log message ***
atsuki
parents: 20
diff changeset
56 線形時相論理(Linear-time Temporal Logic、LTL)は、
d66662b295ba *** empty log message ***
atsuki
parents: 20
diff changeset
57 時間を様相として持つ様相論理の一つで、
d66662b295ba *** empty log message ***
atsuki
parents: 20
diff changeset
58 状態遷移システムの単一の経路に関する性質を記述することが可能である。
d66662b295ba *** empty log message ***
atsuki
parents: 20
diff changeset
59 表\ref{tab:LTL}にLTLの単項演算子を示す。
d66662b295ba *** empty log message ***
atsuki
parents: 20
diff changeset
60 \begin{table}
d66662b295ba *** empty log message ***
atsuki
parents: 20
diff changeset
61 {\footnotesize
d66662b295ba *** empty log message ***
atsuki
parents: 20
diff changeset
62 \begin{center}
d66662b295ba *** empty log message ***
atsuki
parents: 20
diff changeset
63 \begin{tabular}{|l|c|l|} \hline
d66662b295ba *** empty log message ***
atsuki
parents: 20
diff changeset
64 \multicolumn{1}{|c|}{名称} & 記号表記 & \multicolumn{1}{|c|}{意味} \\ \hline
d66662b295ba *** empty log message ***
atsuki
parents: 20
diff changeset
65 Always & □p & pは今後常に真である \\ \hline
d66662b295ba *** empty log message ***
atsuki
parents: 20
diff changeset
66 Sometime & ◇p & pは将来のいずれかの時点で真である\\ \hline
d66662b295ba *** empty log message ***
atsuki
parents: 20
diff changeset
67 Next & ○p & pは次の時点で真である \\ \hline
d66662b295ba *** empty log message ***
atsuki
parents: 20
diff changeset
68 \end{tabular}
d66662b295ba *** empty log message ***
atsuki
parents: 20
diff changeset
69 \vspace{-2mm}
d66662b295ba *** empty log message ***
atsuki
parents: 20
diff changeset
70 \caption{線形時相論理の単項演算}
d66662b295ba *** empty log message ***
atsuki
parents: 20
diff changeset
71 \label{tab:LTL}
d66662b295ba *** empty log message ***
atsuki
parents: 20
diff changeset
72 \end{center}
d66662b295ba *** empty log message ***
atsuki
parents: 20
diff changeset
73 }
d66662b295ba *** empty log message ***
atsuki
parents: 20
diff changeset
74 \vspace{-8mm}
d66662b295ba *** empty log message ***
atsuki
parents: 20
diff changeset
75 \end{table}
d66662b295ba *** empty log message ***
atsuki
parents: 20
diff changeset
76 検証において、時相論理はシステムの要求仕様を記述する方法として形式的検証で利用さ
d66662b295ba *** empty log message ***
atsuki
parents: 20
diff changeset
77 れる。
d66662b295ba *** empty log message ***
atsuki
parents: 20
diff changeset
78
d66662b295ba *** empty log message ***
atsuki
parents: 20
diff changeset
79 \vspace{-2mm}
22
d9667cf8aa3f *** empty log message ***
atsuki
parents: 21
diff changeset
80 \section{他のモデル検査ツール}
d9667cf8aa3f *** empty log message ***
atsuki
parents: 21
diff changeset
81 他のモデル検査ツールとしてSPINとJava PathFinder(JPF)がある。
20
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
82
22
d9667cf8aa3f *** empty log message ***
atsuki
parents: 21
diff changeset
83 SPIN\cite{bib:spin}は、プログラム変換的な手法で検証するツールで、
20
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
84 検証対象をPROMELA(PROcess MEta LAnguage)という言語で記述し、
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
85 それを基にC言語で記述された検証器を生成するものである。
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
86 チャネルを使っての通信や並列動作する有限オートマトンのモデル検査が可能である。
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
87 SPINでは、アサーション、デッドロック、到達性、進行制、LTL式の
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
88 性質について検査することができる。
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
89 また、SPINの並列動作はステートメント単位となる。
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
90
22
d9667cf8aa3f *** empty log message ***
atsuki
parents: 21
diff changeset
91 JPF\cite{bib:jpf}は、実行可能なJavaのバイトコードを検証するためのシステムである。
20
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
92 バイトコードを状態遷移モデルとして扱い、
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
93 実行時に遷移し得る状態を網羅的に検査することにより、デッドロックを検知したり、
22
d9667cf8aa3f *** empty log message ***
atsuki
parents: 21
diff changeset
94 キャッチされていない例外を検出することができる。
20
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
95 JPFで検査できる性質として、アサーション、デッドロック、キャッチされていない例外
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
96 があげられる。
21
d66662b295ba *** empty log message ***
atsuki
parents: 20
diff changeset
97 また、JPFの並列動作はスレッド単位となる。
22
d9667cf8aa3f *** empty log message ***
atsuki
parents: 21
diff changeset
98 \vspace{-2mm}
20
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
99
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
100 \section{実装}
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
101 検証用のサンプルプログラムとしてDining Philosophers Problemを用いる。
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
102 これは資源共有問題の一つで、次のような内容である。
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
103 5人の哲学者が円卓についており、それぞれ思索と食事を交互に繰り返す。
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
104 円卓には5本のフォークが置かれており、哲学者は左右のフォーク2本を使って食事をする。
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
105 フォークが取れない場合はフォークが空くのを待つ。
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
106 この問題では、すべての哲学者が一斉に左手でフォークを取るとデッドロックが起きる。
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
107 例として、左手でフォークを取るコードセグメントを示す。
22
d9667cf8aa3f *** empty log message ***
atsuki
parents: 21
diff changeset
108
d9667cf8aa3f *** empty log message ***
atsuki
parents: 21
diff changeset
109 \vspace{-3mm}
20
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
110 {\footnotesize
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
111 \begin{verbatim}
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
112 code pickup_lfork(PhilsPtr self)
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
113 {
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
114 if (self->left_fork->owner == NULL) {
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
115 self->left_fork->owner = self;
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
116 goto pickup_rfork(self);
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
117 } else {
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
118 goto pickup_lfork(self);
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
119 }
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
120 }
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
121 \end{verbatim}
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
122 }
21
d66662b295ba *** empty log message ***
atsuki
parents: 20
diff changeset
123 \vspace{-4mm}
22
d9667cf8aa3f *** empty log message ***
atsuki
parents: 21
diff changeset
124
20
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
125 codeがコードセグメントの定義であり、
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
126 コードセグメントの引数部分をインターフェースと呼ぶ。
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
127 このコードセグメントは左手でフォークが取れた場合は、
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
128 右手でフォークを取るコードセグメントへ遷移する。
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
129 取れなかった場合は、またこのコードセグメントへ遷移する。
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
130
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
131 次に、タブロー法による状態の展開の実装について説明する。
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
132
22
d9667cf8aa3f *** empty log message ***
atsuki
parents: 21
diff changeset
133 CbCプログラムのタブロー法による状態の展開の特徴として、
20
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
134 プログラムの可能な実行の組み合わせすべてを調べる、
22
d9667cf8aa3f *** empty log message ***
atsuki
parents: 21
diff changeset
135 プログラムの状態を展開するために状態の探索をDepth First Searchで行う、
20
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
136 プログラムの実行によって生成される状態は木構造で記録する、
22
d9667cf8aa3f *** empty log message ***
atsuki
parents: 21
diff changeset
137 同じ状態はすべて共有することでメモリ消費を減らすということ
20
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
138 があげられる。
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
139
22
d9667cf8aa3f *** empty log message ***
atsuki
parents: 21
diff changeset
140 まず、最初に状態として扱うすべてのメモリをBinary Tree構造で記録する。
20
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
141 そして、検証対象のプログラムのコードセグメントを実行して、
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
142 実行に伴う状態の変化をBinary Tree構造で記録していく。
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
143 このBinary Treeを状態データベースと呼ぶ。
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
144 すべての可能な実行の組み合わせを実行しながらそのときの状態を
22
d9667cf8aa3f *** empty log message ***
atsuki
parents: 21
diff changeset
145 状態データベースに登録していく。
20
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
146
21
d66662b295ba *** empty log message ***
atsuki
parents: 20
diff changeset
147 以下にタブロー展開を行うためのtableauコードセグメントを示す。
d66662b295ba *** empty log message ***
atsuki
parents: 20
diff changeset
148 このコードセグメントはCwCで記述している。
22
d9667cf8aa3f *** empty log message ***
atsuki
parents: 21
diff changeset
149
d9667cf8aa3f *** empty log message ***
atsuki
parents: 21
diff changeset
150 \vspace{-3mm}
20
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
151 {\footnotesize
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
152 \begin{verbatim}
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
153 code tableau(TaskPtr list)
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
154 {
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
155 StateDB out;
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
156 if (lookup_StateDB(&st, &state_db, &out)) {
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
157 while(!(list=next_task_iterator(task_iter))) {
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
158 TaskIteratorPtr prev_iter=task_iter->prev;
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
159 if (!prev_iter) {
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
160 memory_usage();
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
161 goto ret(0),env;
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
162 }
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
163 free_task_iterator(task_iter);
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
164 task_iter=prev_iter;
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
165 }
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
166 restore_memory(task_iter->state->memory);
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
167 } else {
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
168 task_iter=create_task_iterator(list,out,task_iter);
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
169 }
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
170 goto list->phils->next(list->phils,list);
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
171 }
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
172 \end{verbatim}
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
173 }
21
d66662b295ba *** empty log message ***
atsuki
parents: 20
diff changeset
174 \vspace{-3mm}
22
d9667cf8aa3f *** empty log message ***
atsuki
parents: 21
diff changeset
175
20
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
176 検証対象プログラムのコードセグメントはこのtableauコードセグメントに遷移するようにする。
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
177 \verb|lookup_StateDB()|関数で状態データベースからコードセグメントの実行によって
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
178 得られた状態を検索・登録していく。登録する際にそのまま登録するのではなく、
22
d9667cf8aa3f *** empty log message ***
atsuki
parents: 21
diff changeset
179 メモリを記録したBinary Treeをコピーして登録していく。この際、同じメモリ内容が
20
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
180 あった場合は、同じ領域を指すことで状態を共有するようにする。
21
d66662b295ba *** empty log message ***
atsuki
parents: 20
diff changeset
181 このtableauコードセグメントによりDFSで状態を探索していく。
20
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
182
22
d9667cf8aa3f *** empty log message ***
atsuki
parents: 21
diff changeset
183 また、タブロー展開を行う際に、
d9667cf8aa3f *** empty log message ***
atsuki
parents: 21
diff changeset
184 LTL式より生成されたコードセグメントを実行することで検証を行う。
d9667cf8aa3f *** empty log message ***
atsuki
parents: 21
diff changeset
185 検証対象プログラムからtableauコードセグメントに遷移する前に
d9667cf8aa3f *** empty log message ***
atsuki
parents: 21
diff changeset
186 生成された検証用コードセグメントを実行することで検証する。
21
d66662b295ba *** empty log message ***
atsuki
parents: 20
diff changeset
187
22
d9667cf8aa3f *** empty log message ***
atsuki
parents: 21
diff changeset
188 ここでは、実装したDining Philosophers Problemに対して、デッドロックの検知を行う。
d9667cf8aa3f *** empty log message ***
atsuki
parents: 21
diff changeset
189 デッドロックとは、複数のプロセスが互いに相手の占有している資源の開放を待ってしまい、
d9667cf8aa3f *** empty log message ***
atsuki
parents: 21
diff changeset
190 結果としてプログラムが停止してしまうことである。
d9667cf8aa3f *** empty log message ***
atsuki
parents: 21
diff changeset
191 Dining Philosophers Problemにおいて、資源とはフォークのことである。
d9667cf8aa3f *** empty log message ***
atsuki
parents: 21
diff changeset
192 つまり、この場合のデッドロックはすべての哲学者(プロセス)が左手でフォークを持ち、
d9667cf8aa3f *** empty log message ***
atsuki
parents: 21
diff changeset
193 右手のフォークが空くのを待っている状態である。
d9667cf8aa3f *** empty log message ***
atsuki
parents: 21
diff changeset
194
d9667cf8aa3f *** empty log message ***
atsuki
parents: 21
diff changeset
195 デッドロックが起きる条件である、「哲学者が一斉に左手でフォークを取る」を
d9667cf8aa3f *** empty log message ***
atsuki
parents: 21
diff changeset
196 すべての状態で検査することでプログラムのデッドロックを検知する。
21
d66662b295ba *** empty log message ***
atsuki
parents: 20
diff changeset
197
d66662b295ba *** empty log message ***
atsuki
parents: 20
diff changeset
198 \vspace{-2mm}
d66662b295ba *** empty log message ***
atsuki
parents: 20
diff changeset
199 \section{評価および考察}
d66662b295ba *** empty log message ***
atsuki
parents: 20
diff changeset
200 Dining Philosophers Problemの検証をCbC、SPIN、JPFで行った。
22
d9667cf8aa3f *** empty log message ***
atsuki
parents: 21
diff changeset
201 それぞれの結果を表\ref{tab:time}に示す。
21
d66662b295ba *** empty log message ***
atsuki
parents: 20
diff changeset
202 \begin{table}[htbp]
22
d9667cf8aa3f *** empty log message ***
atsuki
parents: 21
diff changeset
203 \vspace{-2mm}
21
d66662b295ba *** empty log message ***
atsuki
parents: 20
diff changeset
204 {\footnotesize
d66662b295ba *** empty log message ***
atsuki
parents: 20
diff changeset
205 \begin{center}
d66662b295ba *** empty log message ***
atsuki
parents: 20
diff changeset
206 \begin{tabular}{|r|r|r|} \hline
22
d9667cf8aa3f *** empty log message ***
atsuki
parents: 21
diff changeset
207 \multicolumn{3}{|c|}{\textbf{CbCによる検証}} \\ \hline
21
d66662b295ba *** empty log message ***
atsuki
parents: 20
diff changeset
208 プロセス数 & 状態数 & 実行時間(秒) \\ \hline
d66662b295ba *** empty log message ***
atsuki
parents: 20
diff changeset
209 5 & 38,984 & 0.68 \\ \hline
d66662b295ba *** empty log message ***
atsuki
parents: 20
diff changeset
210 6 & 159,299 & 3.90 \\ \hline
d66662b295ba *** empty log message ***
atsuki
parents: 20
diff changeset
211 7 & 845,529 & 28.48 \\ \hline
d66662b295ba *** empty log message ***
atsuki
parents: 20
diff changeset
212 8 & 3,915,727 & 201.04 \\ \hline
22
d9667cf8aa3f *** empty log message ***
atsuki
parents: 21
diff changeset
213 \multicolumn{3}{|c|}{\textbf{SPINによる検証}} \\ \hline
21
d66662b295ba *** empty log message ***
atsuki
parents: 20
diff changeset
214 5 & 94 & 0.008 \\ \hline
d66662b295ba *** empty log message ***
atsuki
parents: 20
diff changeset
215 6 & 212 & 0.01 \\ \hline
d66662b295ba *** empty log message ***
atsuki
parents: 20
diff changeset
216 7 & 494 & 0.03 \\ \hline
d66662b295ba *** empty log message ***
atsuki
parents: 20
diff changeset
217 8 & 1,172 & 0.04 \\ \hline
22
d9667cf8aa3f *** empty log message ***
atsuki
parents: 21
diff changeset
218 \multicolumn{3}{|c|}{\textbf{JPFによる検証}} \\ \hline
21
d66662b295ba *** empty log message ***
atsuki
parents: 20
diff changeset
219 5 & 不明 & 3.98 \\ \hline
d66662b295ba *** empty log message ***
atsuki
parents: 20
diff changeset
220 6 & 不明 & 7.33 \\ \hline
d66662b295ba *** empty log message ***
atsuki
parents: 20
diff changeset
221 7 & 不明 & 26.29 \\ \hline
d66662b295ba *** empty log message ***
atsuki
parents: 20
diff changeset
222 8 & 不明 & 123.16 \\ \hline
d66662b295ba *** empty log message ***
atsuki
parents: 20
diff changeset
223 \end{tabular}
22
d9667cf8aa3f *** empty log message ***
atsuki
parents: 21
diff changeset
224 \vspace{-3mm}
d9667cf8aa3f *** empty log message ***
atsuki
parents: 21
diff changeset
225 \caption{検証の計測結果}
d9667cf8aa3f *** empty log message ***
atsuki
parents: 21
diff changeset
226 \label{tab:time}
21
d66662b295ba *** empty log message ***
atsuki
parents: 20
diff changeset
227 \end{center}
d66662b295ba *** empty log message ***
atsuki
parents: 20
diff changeset
228 }
22
d9667cf8aa3f *** empty log message ***
atsuki
parents: 21
diff changeset
229 \vspace{-7mm}
21
d66662b295ba *** empty log message ***
atsuki
parents: 20
diff changeset
230 \end{table}
d66662b295ba *** empty log message ***
atsuki
parents: 20
diff changeset
231 CbCの検証では、実際に実行可能なプログラムであり、プログラムで渡される引数全体と
d66662b295ba *** empty log message ***
atsuki
parents: 20
diff changeset
232 大域変数全体が状態となるため、プロセス数が増えるにつれて状態数も指数関数的に
d66662b295ba *** empty log message ***
atsuki
parents: 20
diff changeset
233 多くなっている。
d66662b295ba *** empty log message ***
atsuki
parents: 20
diff changeset
234
d66662b295ba *** empty log message ***
atsuki
parents: 20
diff changeset
235 SPINによる結果は、CbCでの検証と比べて状態数が少ない。
d66662b295ba *** empty log message ***
atsuki
parents: 20
diff changeset
236 生成される状態数が少ないことが探索時間の短さにつながっていると考えられる。
d66662b295ba *** empty log message ***
atsuki
parents: 20
diff changeset
237
d66662b295ba *** empty log message ***
atsuki
parents: 20
diff changeset
238 JPFの探索時間が、プロセス数6個まではCbCの探索時間よりも遅く、
d66662b295ba *** empty log message ***
atsuki
parents: 20
diff changeset
239 7個以上になるとCbCより速いのは、CbCの実装によるものだと推測される。
d66662b295ba *** empty log message ***
atsuki
parents: 20
diff changeset
240
d66662b295ba *** empty log message ***
atsuki
parents: 20
diff changeset
241 CbCでの実装では、メモリのBinary Treeをバランスさせていないため、
d66662b295ba *** empty log message ***
atsuki
parents: 20
diff changeset
242 状態数が増えるにつれて探索時間が長くなっていると考えられる。
22
d9667cf8aa3f *** empty log message ***
atsuki
parents: 21
diff changeset
243
21
d66662b295ba *** empty log message ***
atsuki
parents: 20
diff changeset
244 \vspace{-2mm}
d66662b295ba *** empty log message ***
atsuki
parents: 20
diff changeset
245 \section{まとめ}
d66662b295ba *** empty log message ***
atsuki
parents: 20
diff changeset
246 Dining Philosophers ProblemをCbCで記述し、
d66662b295ba *** empty log message ***
atsuki
parents: 20
diff changeset
247 LTL式より生成された検証用コードセグメントを同時にタブロー展開することで
22
d9667cf8aa3f *** empty log message ***
atsuki
parents: 21
diff changeset
248 検証を行い、他のモデル検査ツールと比較した。
21
d66662b295ba *** empty log message ***
atsuki
parents: 20
diff changeset
249 CbCの方が遅いという結果になったが、実用には耐えられるレベルである。
d66662b295ba *** empty log message ***
atsuki
parents: 20
diff changeset
250 また、メモリのTreeをバランスさせることで探索時間の短縮を行うことが課題である。
22
d9667cf8aa3f *** empty log message ***
atsuki
parents: 21
diff changeset
251
21
d66662b295ba *** empty log message ***
atsuki
parents: 20
diff changeset
252 \vspace{-2mm}
19
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
253 {\small
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
254 \begin{thebibliography}{9}
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
255 \bibitem{bib:jssst2000kono}
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
256 河野真治. ``継続を持つCの下位言語によるシステム記述''.
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
257 日本ソフトウェア科学会第17回大会, 2000.
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
258 \bibitem{bib:sigos2007}
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
259 下地篤樹, 河野真治. ``線形時相論理によるContinuation based Cプログラムの検証''.
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
260 情報処理学会システムソフトウェアとオペレーティング・システム研究会(OS), April, 2007.
22
d9667cf8aa3f *** empty log message ***
atsuki
parents: 21
diff changeset
261 \bibitem{bib:spin}
d9667cf8aa3f *** empty log message ***
atsuki
parents: 21
diff changeset
262 ``Spin - Formal Verification''.
d9667cf8aa3f *** empty log message ***
atsuki
parents: 21
diff changeset
263 http://spinroot.com/spin/whatispin.html
d9667cf8aa3f *** empty log message ***
atsuki
parents: 21
diff changeset
264 \bibitem{bib:jpf}
d9667cf8aa3f *** empty log message ***
atsuki
parents: 21
diff changeset
265 ``Java PathFinder''.
d9667cf8aa3f *** empty log message ***
atsuki
parents: 21
diff changeset
266 http://javapathfinder.sourceforge.net/
19
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
267 \end{thebibliography}
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
268 }
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
269 \end{document}