annotate paper/chapter4.tex @ 20:97f508fb5bf2

*** empty log message ***
author atsuki
date Wed, 20 Feb 2008 05:53:14 +0900
parents 4c4dd3e3fc09
children 3a8e2059e713
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6
1bf023e03779 *** empty log message ***
atsuki
parents: 1
diff changeset
1 \chapter{評価}
1
e1214989942e *** empty log message ***
atsuki
parents: 0
diff changeset
2 \label{chapter4}
6
1bf023e03779 *** empty log message ***
atsuki
parents: 1
diff changeset
3
1bf023e03779 *** empty log message ***
atsuki
parents: 1
diff changeset
4 実装したDining Philosophers Problemのタブロー展開および、
1bf023e03779 *** empty log message ***
atsuki
parents: 1
diff changeset
5 線形時相論理による検証を組み込んだタブロー展開の評価を行う。
1bf023e03779 *** empty log message ***
atsuki
parents: 1
diff changeset
6
1bf023e03779 *** empty log message ***
atsuki
parents: 1
diff changeset
7 また、検証を組み込んだタブロー展開においては他の検証ツールとの比較を行う。
1bf023e03779 *** empty log message ***
atsuki
parents: 1
diff changeset
8
12
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
9 比較の対象としては、SPIN と Java PathFinder を用いる。CbCによる記述と合わせて、
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
10 Dining Philosophers Problemの状態空間の探索にかかる時間を測定した。
11
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
11
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
12
6
1bf023e03779 *** empty log message ***
atsuki
parents: 1
diff changeset
13 \section{実行環境と評価方法}
1bf023e03779 *** empty log message ***
atsuki
parents: 1
diff changeset
14 実行環境として表\ref{tab:machine_spec}を用いた。
1bf023e03779 *** empty log message ***
atsuki
parents: 1
diff changeset
15
0
a67653fda270 Initial revision
atsuki
parents:
diff changeset
16 %評価に使用したマシンのスペック
6
1bf023e03779 *** empty log message ***
atsuki
parents: 1
diff changeset
17 \begin{table}
1bf023e03779 *** empty log message ***
atsuki
parents: 1
diff changeset
18 \centering
1bf023e03779 *** empty log message ***
atsuki
parents: 1
diff changeset
19 \begin{tabular}{|c|l|} \hline
1bf023e03779 *** empty log message ***
atsuki
parents: 1
diff changeset
20 OS & FedoraCore6 \\ \hline
1bf023e03779 *** empty log message ***
atsuki
parents: 1
diff changeset
21 CPU & Intel(R) Pentium4 2.8GHz \\ \hline
1bf023e03779 *** empty log message ***
atsuki
parents: 1
diff changeset
22 MEMORY & 1GB \\ \hline
1bf023e03779 *** empty log message ***
atsuki
parents: 1
diff changeset
23 \end{tabular}
1bf023e03779 *** empty log message ***
atsuki
parents: 1
diff changeset
24 \caption{評価に使用したマシンのスペック}
1bf023e03779 *** empty log message ***
atsuki
parents: 1
diff changeset
25 \label{tab:machine_spec}
1bf023e03779 *** empty log message ***
atsuki
parents: 1
diff changeset
26 \end{table}
1bf023e03779 *** empty log message ***
atsuki
parents: 1
diff changeset
27
1bf023e03779 *** empty log message ***
atsuki
parents: 1
diff changeset
28
1bf023e03779 *** empty log message ***
atsuki
parents: 1
diff changeset
29 実行時間の計測は、Unixのtimeコマンドを用いて行う。
1bf023e03779 *** empty log message ***
atsuki
parents: 1
diff changeset
30 timeコマンドは実行に要する経過時間などを計測するためのコマンドである。
1bf023e03779 *** empty log message ***
atsuki
parents: 1
diff changeset
31 正確な結果を得るため、timeコマンドで5回計測し、その平均値を取る。
0
a67653fda270 Initial revision
atsuki
parents:
diff changeset
32
a67653fda270 Initial revision
atsuki
parents:
diff changeset
33 \section{Dining Philosophers Problemのタブロー展開}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
34 CbCで実装したDining Philosophers Problemに対してタブロー展開を適用した。
12
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
35 プロセス(哲学者)が3〜8個の場合の計測結果は表\ref{tab:dpp_tableau}のようになった。
0
a67653fda270 Initial revision
atsuki
parents:
diff changeset
36
12
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
37 %\begin{table}
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
38 % \centering
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
39 % \begin{tabular}{|r|r|r|} \hline
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
40 % プロセス数 & 状態数 & 実行時間(秒) \\ \hline
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
41 % 3 & 1,340 & 0.01 \\ \hline
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
42 % 4 & 6,115 & 0.08 \\ \hline
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
43 % 5 & 38,984 & 0.66 \\ \hline
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
44 % 6 & 159,299 & 3.79 \\ \hline
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
45 % 7 & 845,529 & 27.59 \\ \hline
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
46 % 8 & 3915,727 & 199.80 \\ \hline
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
47 % \end{tabular}
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
48 % \caption{Dining Philosophers Problemのタブロー展開結果}
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
49 % \label{tab:dpp_tableau}
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
50 %\end{table}
0
a67653fda270 Initial revision
atsuki
parents:
diff changeset
51
6
1bf023e03779 *** empty log message ***
atsuki
parents: 1
diff changeset
52 表\ref{tab:dpp_tableau}を見ると、プロセス数に対して状態数が
1bf023e03779 *** empty log message ***
atsuki
parents: 1
diff changeset
53 指数オーダーで増加していることがわかる。
1bf023e03779 *** empty log message ***
atsuki
parents: 1
diff changeset
54 また、実行時間も同様に増加している。
1bf023e03779 *** empty log message ***
atsuki
parents: 1
diff changeset
55
10
a4babe6179a7 *** empty log message ***
atsuki
parents: 7
diff changeset
56 しかし、プロセス数が5個と6個の場合の実行時間がそれぞれ0.66秒、3.79秒と速く、
6
1bf023e03779 *** empty log message ***
atsuki
parents: 1
diff changeset
57 実用レベルであると言える。
0
a67653fda270 Initial revision
atsuki
parents:
diff changeset
58
a67653fda270 Initial revision
atsuki
parents:
diff changeset
59 \section{線形時相論理を用いた検証}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
60 Dining Philosophers Problemのデッドロックを検知するためのコードセグメントを組み込んで
6
1bf023e03779 *** empty log message ***
atsuki
parents: 1
diff changeset
61 タブロー展開を行う。
1bf023e03779 *** empty log message ***
atsuki
parents: 1
diff changeset
62 また、他の検証ツールとの比較を行う。
1bf023e03779 *** empty log message ***
atsuki
parents: 1
diff changeset
63 \\
1bf023e03779 *** empty log message ***
atsuki
parents: 1
diff changeset
64
12
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
65 プロセスが5〜8個の場合の計測結果は表\ref{tab:ltl_tableau}のようになった。
0
a67653fda270 Initial revision
atsuki
parents:
diff changeset
66
7
8de3a0461beb *** empty log message ***
atsuki
parents: 6
diff changeset
67 検証用のコードセグメントを組み込んでのタブロー展開は、
8de3a0461beb *** empty log message ***
atsuki
parents: 6
diff changeset
68 組み込む前のものと比べて実行時間はあまり変わっていない。
6
1bf023e03779 *** empty log message ***
atsuki
parents: 1
diff changeset
69
7
8de3a0461beb *** empty log message ***
atsuki
parents: 6
diff changeset
70 また、プロセスが5個の場合の実行結果は以下のようになっている。
8de3a0461beb *** empty log message ***
atsuki
parents: 6
diff changeset
71
8de3a0461beb *** empty log message ***
atsuki
parents: 6
diff changeset
72 \begin{center}
8de3a0461beb *** empty log message ***
atsuki
parents: 6
diff changeset
73 \begin{itembox}[l]{プロセスが5個の場合の実行結果}
8de3a0461beb *** empty log message ***
atsuki
parents: 6
diff changeset
74 \begin{verbatim}
8de3a0461beb *** empty log message ***
atsuki
parents: 6
diff changeset
75 found 38984
8de3a0461beb *** empty log message ***
atsuki
parents: 6
diff changeset
76 no more branch 38984
8de3a0461beb *** empty log message ***
atsuki
parents: 6
diff changeset
77 All done count 38984
8de3a0461beb *** empty log message ***
atsuki
parents: 6
diff changeset
78 memory_header 117030
8de3a0461beb *** empty log message ***
atsuki
parents: 6
diff changeset
79 memcmp_count 2383597
8de3a0461beb *** empty log message ***
atsuki
parents: 6
diff changeset
80 memory_body 1120
8de3a0461beb *** empty log message ***
atsuki
parents: 6
diff changeset
81 restore_count 467820
8de3a0461beb *** empty log message ***
atsuki
parents: 6
diff changeset
82 restore_size 6237600
8de3a0461beb *** empty log message ***
atsuki
parents: 6
diff changeset
83 range_count 15
8de3a0461beb *** empty log message ***
atsuki
parents: 6
diff changeset
84 range_size 200
8de3a0461beb *** empty log message ***
atsuki
parents: 6
diff changeset
85 []~p is not valid.
8de3a0461beb *** empty log message ***
atsuki
parents: 6
diff changeset
86 \end{verbatim}
8de3a0461beb *** empty log message ***
atsuki
parents: 6
diff changeset
87 \end{itembox}
8de3a0461beb *** empty log message ***
atsuki
parents: 6
diff changeset
88 \end{center}
8de3a0461beb *** empty log message ***
atsuki
parents: 6
diff changeset
89
8de3a0461beb *** empty log message ***
atsuki
parents: 6
diff changeset
90 この実行結果より、プロセスが5個の場合の状態数が38,984個であることがわかる。
8de3a0461beb *** empty log message ***
atsuki
parents: 6
diff changeset
91 また、\verb|[]~p is not valid.|という結果からデッドロックが検知されたことがわかる。
8de3a0461beb *** empty log message ***
atsuki
parents: 6
diff changeset
92 これは、命題pを「デッドロックが起きる」と定義し、
8de3a0461beb *** empty log message ***
atsuki
parents: 6
diff changeset
93 \verb|[]~p|つまり決してpが起きないことを検査した結果、
8de3a0461beb *** empty log message ***
atsuki
parents: 6
diff changeset
94 pが起きてしまったことを表している。
8de3a0461beb *** empty log message ***
atsuki
parents: 6
diff changeset
95
8de3a0461beb *** empty log message ***
atsuki
parents: 6
diff changeset
96 \subsection{SPINによるDining Philosophers Problemの検証}
8de3a0461beb *** empty log message ***
atsuki
parents: 6
diff changeset
97 SPINでDining Philosophers Problemの検証を行う。
8de3a0461beb *** empty log message ***
atsuki
parents: 6
diff changeset
98
8de3a0461beb *** empty log message ***
atsuki
parents: 6
diff changeset
99 まず、Dining Philosophers Problemをモデル化したプログラムをPROMELAで記述する。
10
a4babe6179a7 *** empty log message ***
atsuki
parents: 7
diff changeset
100 そして、SPINによって検証器であるpan.cを生成しそれをコンパイル、実行する。
7
8de3a0461beb *** empty log message ***
atsuki
parents: 6
diff changeset
101
8de3a0461beb *** empty log message ***
atsuki
parents: 6
diff changeset
102 ソースコード\ref{src:dpp.prm}にPROMELAによるDining Philosophers Problemのモデルの
8de3a0461beb *** empty log message ***
atsuki
parents: 6
diff changeset
103 記述を示す。
8de3a0461beb *** empty log message ***
atsuki
parents: 6
diff changeset
104
8de3a0461beb *** empty log message ***
atsuki
parents: 6
diff changeset
105 \lstinputlisting[caption=PROMELAによるDining Philosophers Problemの記述,label=src:dpp.prm]{src/dpp.prm}
8de3a0461beb *** empty log message ***
atsuki
parents: 6
diff changeset
106
10
a4babe6179a7 *** empty log message ***
atsuki
parents: 7
diff changeset
107 ソースコード\ref{src:dpp.prm}をSPINにかけるとpan.cなどのファイルが生成される。
a4babe6179a7 *** empty log message ***
atsuki
parents: 7
diff changeset
108 これをgccでコンパイルすることで、実行ファイルが生成される。
7
8de3a0461beb *** empty log message ***
atsuki
parents: 6
diff changeset
109
12
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
110 プロセスが5〜8個の場合の計測結果は表\ref{tab:spin_dpp}のようになった。
7
8de3a0461beb *** empty log message ***
atsuki
parents: 6
diff changeset
111
8de3a0461beb *** empty log message ***
atsuki
parents: 6
diff changeset
112 また、プロセスが5個の場合のSPINで生成された検証器の実行結果は以下のようになった。
8de3a0461beb *** empty log message ***
atsuki
parents: 6
diff changeset
113
8de3a0461beb *** empty log message ***
atsuki
parents: 6
diff changeset
114 \begin{center}
8de3a0461beb *** empty log message ***
atsuki
parents: 6
diff changeset
115 \begin{itembox}[l]{SPINのプロセスが5個の場合の実行結果}
8de3a0461beb *** empty log message ***
atsuki
parents: 6
diff changeset
116 \begin{verbatim}
8de3a0461beb *** empty log message ***
atsuki
parents: 6
diff changeset
117 pan: assertion violated 0 (at depth 44)
8de3a0461beb *** empty log message ***
atsuki
parents: 6
diff changeset
118 (Spin Version 4.2.5 -- 2 April 2005)
8de3a0461beb *** empty log message ***
atsuki
parents: 6
diff changeset
119 + Partial Order Reduction
8de3a0461beb *** empty log message ***
atsuki
parents: 6
diff changeset
120
8de3a0461beb *** empty log message ***
atsuki
parents: 6
diff changeset
121 Full statespace search for:
8de3a0461beb *** empty log message ***
atsuki
parents: 6
diff changeset
122 never claim - (none specified)
8de3a0461beb *** empty log message ***
atsuki
parents: 6
diff changeset
123 assertion violations +
8de3a0461beb *** empty log message ***
atsuki
parents: 6
diff changeset
124 acceptance cycles - (not selected)
8de3a0461beb *** empty log message ***
atsuki
parents: 6
diff changeset
125 invalid end states +
8de3a0461beb *** empty log message ***
atsuki
parents: 6
diff changeset
126
8de3a0461beb *** empty log message ***
atsuki
parents: 6
diff changeset
127 State-vector 44 byte, depth reached 44, errors: 1
8de3a0461beb *** empty log message ***
atsuki
parents: 6
diff changeset
128 46 states, stored
8de3a0461beb *** empty log message ***
atsuki
parents: 6
diff changeset
129 16 states, matched
8de3a0461beb *** empty log message ***
atsuki
parents: 6
diff changeset
130 62 transitions (= stored+matched)
8de3a0461beb *** empty log message ***
atsuki
parents: 6
diff changeset
131 0 atomic steps
8de3a0461beb *** empty log message ***
atsuki
parents: 6
diff changeset
132 hash conflicts: 0 (resolved)
8de3a0461beb *** empty log message ***
atsuki
parents: 6
diff changeset
133
8de3a0461beb *** empty log message ***
atsuki
parents: 6
diff changeset
134 2.622 memory usage (Mbyte)
8de3a0461beb *** empty log message ***
atsuki
parents: 6
diff changeset
135 \end{verbatim}
8de3a0461beb *** empty log message ***
atsuki
parents: 6
diff changeset
136 \end{itembox}
8de3a0461beb *** empty log message ***
atsuki
parents: 6
diff changeset
137 \end{center}
8de3a0461beb *** empty log message ***
atsuki
parents: 6
diff changeset
138
8de3a0461beb *** empty log message ***
atsuki
parents: 6
diff changeset
139 \verb|assertion violated 0 (at depth 56)|がデッドロック検知を報告している部分である。
8de3a0461beb *** empty log message ***
atsuki
parents: 6
diff changeset
140 \verb|212 states, stored|が生成されたユニークな状態の数である。
8de3a0461beb *** empty log message ***
atsuki
parents: 6
diff changeset
141
8de3a0461beb *** empty log message ***
atsuki
parents: 6
diff changeset
142 \subsection{Java PathFinderによるDining Philosophers Problemの検証}
12
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
143 JPFには、例題としてDiningPhil.java\cite{bib:jpf}が用意されているのでこれを用いる。
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
144 %ソースコード\ref{src:dpp.java}はJava PathFinderのWebページ\cite{bib:jpf}
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
145 %から引用したJavaによるDining Philosophers Problemの記述である。
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
146
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
147 \lstinputlisting[caption=JavaによるDining Philosophers Problemの記述,label=src:dpp.java]{src/DiningPhil.java}
7
8de3a0461beb *** empty log message ***
atsuki
parents: 6
diff changeset
148
8de3a0461beb *** empty log message ***
atsuki
parents: 6
diff changeset
149 使い方としては、\verb|javac|によりJavaのバイトコードを生成して、
8de3a0461beb *** empty log message ***
atsuki
parents: 6
diff changeset
150 それを\verb|jpf|で実行するだけである。
8de3a0461beb *** empty log message ***
atsuki
parents: 6
diff changeset
151
10
a4babe6179a7 *** empty log message ***
atsuki
parents: 7
diff changeset
152 JPFの実行結果は、状態数が出力されないため実行時間のみ比較する。
a4babe6179a7 *** empty log message ***
atsuki
parents: 7
diff changeset
153 表\ref{tab:jpf_dpp}に計測結果を示す。
7
8de3a0461beb *** empty log message ***
atsuki
parents: 6
diff changeset
154
12
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
155 \begin{table}[htbp]
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
156 \begin{center}
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
157 \caption{Dining Philosophers Problemのタブロー展開結果}
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
158 \begin{tabular}{|r|r|r|} \hline
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
159 プロセス数 & 状態数 & 実行時間(秒) \\ \hline
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
160 3 & 1,340 & 0.01 \\ \hline
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
161 4 & 6,115 & 0.08 \\ \hline
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
162 5 & 38,984 & 0.66 \\ \hline
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
163 6 & 159,299 & 3.79 \\ \hline
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
164 7 & 845,529 & 27.59 \\ \hline
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
165 8 & 3915,727 & 199.80 \\ \hline
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
166 \end{tabular}
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
167 \end{center}
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
168 \label{tab:dpp_tableau}
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
169 %\end{table}
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
170
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
171 %\begin{table}
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
172 \begin{center}
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
173 \caption{Dining Philosophers Problemにデッドロック検知を組み込んだ計測結果}
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
174 \begin{tabular}{|r|r|r|} \hline
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
175 プロセス数 & 状態数 & 実行時間(秒) \\ \hline
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
176 5 & 38,984 & 0.68 \\ \hline
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
177 6 & 159,299 & 3.90 \\ \hline
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
178 7 & 845,529 & 28.48 \\ \hline
17
4c4dd3e3fc09 *** empty log message ***
atsuki
parents: 12
diff changeset
179 8 & 3,915,727 & 201.04 \\ \hline
12
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
180 \end{tabular}
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
181 \end{center}
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
182 \label{tab:ltl_tableau}
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
183 %\end{table}
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
184
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
185 %\begin{table}
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
186 \begin{center}
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
187 \caption{SPINによるDining Philosophers Problemの検証の計測結果}
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
188 \begin{tabular}{|r|r|r|} \hline
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
189 プロセス数 & 状態数 & 実行時間(秒) \\ \hline
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
190 5 & 94 & 0.008 \\ \hline
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
191 6 & 212 & 0.01 \\ \hline
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
192 7 & 494 & 0.03 \\ \hline
17
4c4dd3e3fc09 *** empty log message ***
atsuki
parents: 12
diff changeset
193 8 & 1,172 & 0.04 \\ \hline
12
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
194 \end{tabular}
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
195 \end{center}
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
196 \label{tab:spin_dpp}
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
197 %\end{table}
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
198
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
199 %\begin{table}
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
200 \begin{center}
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
201 \caption{JPFによるDining Philosophers Problemの検証の計測結果}
7
8de3a0461beb *** empty log message ***
atsuki
parents: 6
diff changeset
202 \begin{tabular}{|r|r|} \hline
8de3a0461beb *** empty log message ***
atsuki
parents: 6
diff changeset
203 プロセス数 & 実行時間(秒) \\ \hline
8de3a0461beb *** empty log message ***
atsuki
parents: 6
diff changeset
204 5 & 3.98 \\ \hline
8de3a0461beb *** empty log message ***
atsuki
parents: 6
diff changeset
205 6 & 7.33 \\ \hline
12
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
206 7 & 26.29 \\ \hline
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
207 8 & 123.16 \\ \hline
7
8de3a0461beb *** empty log message ***
atsuki
parents: 6
diff changeset
208 \end{tabular}
12
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
209 \end{center}
7
8de3a0461beb *** empty log message ***
atsuki
parents: 6
diff changeset
210 \label{tab:jpf_dpp}
8de3a0461beb *** empty log message ***
atsuki
parents: 6
diff changeset
211 \end{table}
8de3a0461beb *** empty log message ***
atsuki
parents: 6
diff changeset
212
11
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
213
12
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
214 \newpage
11
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
215 \subsection{状態数と探索時間に関する考察}
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
216
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
217 SPINによる結果は、
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
218 CbCでの検証と比べて、状態数が少ない。
12
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
219 生成される状態数が少ないことが探索時間の短さにつながっていると考えられる。
11
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
220
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
221 PROMELAの記述では、Philosopher 内部での状態遷移記述は、\verb+do/od+
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
222 の中に閉じ込められており、\verb+atomic+の内部は複数の状態に分割されない。
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
223 また、変数は{\tt fork}の配列のみなのでメモリの量的にも少なくなっている。
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
224 SPINでは PROMELAをCに変換して探索を行うので、探索自体がコンパイル
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
225 されて実行するようになっており高速である。
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
226
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
227 CbCの場合は、実際に実行可能なプログラムであり、プログラムで渡される
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
228 引数全体と大域変数全体がメモリの量となる。CbC では、
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
229 継続を表すコードセグメントへのポインタが状態を表す。CbC での記述では、
12
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
230 Philosopher の状態は8つあるので、状態数自体も指数関数的に多くなっている。
11
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
231
12
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
232 JPFは、Javaのスレッドを使った記述を使っており、Interleaving はJavaの
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
233 バイトコード単位で起きる。もちろん、完全なバイトコード単位のInterleaving
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
234 を調べているわけではなく、複数のスレッドが相互に干渉する場合の
11
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
235 組合せを調べることになる。
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
236
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
237 Java による記述ではプログラム中のオブジェクトのインスタンス変数
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
238 全体がメモリの量となる。状態は実行しているバイトコードのアドレス
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
239 によって表される。さらに、{\tt synchronized} などの記述には、
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
240 それに対応したロックがあり、それを実現するためのメモリ領域が必要である。
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
241
12
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
242 JPFの探索時間が、プロセス数が6個まではCbCの探索時間よりも遅く、
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
243 プロセス数が7個以上になるとCbCより速いのは、
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
244 CbCの実装によるものだと推測される。
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
245 CbCの実装では、メモリのBinary Treeをバランスさせていないため、
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
246 探索時間が長くなっていると考えられる。
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
247 %JPF の探索時間がCbCの探索時間よりも遅いのは、JPFがbyte code の
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
248 %実行をSimulateしていることが大きい。また、メモリ量自体と状態数もCbCに
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
249 %よる記述よりも多いと推定される。状態数自体は JPFに測定する昨日が
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
250 %ないので、これは推定である。
11
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
251
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
252 \subsection{CbCによる検証方法の利点と欠点}
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
253
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
254 [プログラムの記述方法]
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
255
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
256 SPINは、PROMELAを用いた抽象的な記述を用いているので、
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
257 検証するアルゴリズムと性質を PROMELA で書き直す必要がある。
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
258 PROMELAでは、検証する部分だけを記述することになる。
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
259 それにより探索空間自体が小さくなり、
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
260 SPINのコンパイラ的な実装とも合わせて高速な検証が可能になっている。
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
261
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
262 しかし、PROMELAでは、実際のプログラムのバグを直接見つけるこ
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
263 とは出来ない。実際、PROMELAへの変換でミスが出る場合もある。
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
264 PROMELA自体は非決定性を含む抽象的な言語であり、{\tt atomic}
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
265 の意味や、チャネルの動作などを理解するのは難しい。
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
266
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
267 CbC では、実際のプログラムの{\tt goto}文を変換する形で
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
268 検証系を生成する。したがって、PROMELAのような別な言語に
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
269 変換する必要はない。それは、つまり、新しい言語を習得する
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
270 必要がないということである。CbC言語は、Cのサブセットなので、
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
271 Cを理解しているプログラマには用意に理解できる。これは
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
272 CbCによる検証の利点である。
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
273
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
274 [同期の抽象度]
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
275
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
276 PROMELAは、もともと抽象的な言語であり、抽象的な同期を
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
277 小さく記述するのに優れている。
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
278
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
279 今回作成した検証系は、CbC のコードセグメント単位で
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
280 並列実行(Interleaving)を行う。これは実際にマルチスレッド
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
281 なので実行される並列実行とは異なる。しかし、コードセグメント
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
282 単位の実行なので、探索するべき状態遷移数は小さくなる。
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
283
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
284 実際のプログラムの並列実行と、コードセグメント単位の並列
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
285 実行は、一般的には一致しない。それらを一致させるためには、
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
286 スレッドの同期機構や、同期のための機械語を用いる必要がある。
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
287 この部分でエラーが出る可能性はある。このため、この検証系で
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
288 エラーが出ないことが、実際のCbCの並列でエラーが出ないことを
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
289 保証するわけではない。今回のCbCの検証手法は、コードセグメント
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
290 単位の同期という抽象化が入っており、抽象化された分の誤差
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
291 が入るという欠点がある。
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
292
12
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
293 JPFによる検証は、実際のプログラムをバイトコードレベルで実行する
11
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
294 ので、より正確な検証が可能である。しかし、そのために状態数
12
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
295 は多くなり、バイトコードシミュレータのオーバヘッドもあって、
11
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
296 検証に要する時間とメモリが大きくなってしまっている。
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
297
12
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
298 JPFはバイトコードによるシミュレーションであり、SPINはPROMELA を
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
299 コンパイルしたCのコードによるシミュレータにより検証を行っている。
11
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
300 CbC は、他の二つと異なり、コードセグメント部分は直接実行
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
301 される。この部分にエラーが入ることはないのがCbCによる
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
302 検証の利点であると言える。
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
303
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
304 [検証する性質の記述]
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
305
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
306 検証するときには、検証する性質を記述する必要がある。
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
307 SPINでは、LTLをPROMLEAに変換するプログラムがあり、
12
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
308 LTLにより、性質を記述する。しかし、これにより
11
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
309 状態数自体は増えるが、変換したPROMELAの記述は
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
310 Cのコンパイルされるので比較的高速にチェックすることが
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
311 可能である。
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
312 また、PROMELA中に
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
313 assert を使って式の検証をすることも出来る。
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
314
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
315 JPFでは、もっぱらassertを使った性質の記述を用いる。
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
316 時相論理的な記述は自分で、それをチェックするプログラム
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
317 をスレッドで記述する必要がある。
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
318
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
319 CbCでは、性質の記述はCbCそのもので行う。本論文で示したように
12
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
320 タブロー展開と同時に(限られた)時相論理で記述された性質を
11
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
321 ほとんどオーバヘッドなくチェックすることが出来る。
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
322 これは時相論理式のチェック自体がCbCプログラムとして
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
323 コンパイルされているからである。
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
324 これは検証系自体が、検証される言語と同じ言語で記述されている
12
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
325 ことの利点である。タブロー展開を行う{\tt goto文}
11
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
326 を適切に選択することにより、同期の抽象度を選択できることも
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
327 利点であると言える。
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
328
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
329 JPFでは一見同じ言語で検証系を記述しているように見えるが、
12
9b2553e32341 *** empty log message ***
atsuki
parents: 11
diff changeset
330 実際の検証対象はJava バイトコードであり、実装はインタプリタ
11
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
331 的にならざるを得ない。つまり、JPFでは、検証の抽象度を
fd717f2d19ab *** empty log message ***
kono
parents: 10
diff changeset
332 上げて、状態数を少なくすると言うことが出来ない。
7
8de3a0461beb *** empty log message ***
atsuki
parents: 6
diff changeset
333
8de3a0461beb *** empty log message ***
atsuki
parents: 6
diff changeset
334
8de3a0461beb *** empty log message ***
atsuki
parents: 6
diff changeset
335 %%%end%%%