annotate paper/chapter3.tex @ 3:23fe35aec32b

*** empty log message ***
author atsuki
date Wed, 13 Feb 2008 20:34:13 +0900
parents e1214989942e
children 1bf023e03779
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a67653fda270 Initial revision
atsuki
parents:
diff changeset
1 \chapter{線形時相論理によるCbCプログラムの検証手法}
1
e1214989942e *** empty log message ***
atsuki
parents: 0
diff changeset
2 \label{chapter3}
0
a67653fda270 Initial revision
atsuki
parents:
diff changeset
3
a67653fda270 Initial revision
atsuki
parents:
diff changeset
4 \section{CbCによる並列プログラミング}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
5 ここでは、例題に用いるサンプルプログラムの概要と、
a67653fda270 Initial revision
atsuki
parents:
diff changeset
6 そのプログラムの状態の分割およびCbCプログラムとの対応について説明する。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
7 また、並列プログラムのシミュレーション方法についても述べる。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
8
a67653fda270 Initial revision
atsuki
parents:
diff changeset
9 \subsection{Dining Philosophers Problemの概要}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
10 検証用のサンプルプログラムとしてDining Philosophers Problemを用いる。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
11 これは資源共有問題の一つで、次のような内容である。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
12
a67653fda270 Initial revision
atsuki
parents:
diff changeset
13 5人の哲学者が円卓についている。各々の哲学者にはスパゲッティーを持った皿が出されている。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
14 スパゲッティーはとても絡まっているので、2本のフォークを使わないと食べられない。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
15 お皿の間には1本のフォークが置いてあるので、
a67653fda270 Initial revision
atsuki
parents:
diff changeset
16 5人の哲学者に対して5本のフォークが用意されていることになる(図\ref{fig:dpp_image})。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
17 哲学者は思索と食事を交互に繰り返している。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
18 空腹を覚えると、左右のフォークを手に取ろうと試み、
a67653fda270 Initial revision
atsuki
parents:
diff changeset
19 2本のフォークを取ることに成功するとしばし食事をし、
a67653fda270 Initial revision
atsuki
parents:
diff changeset
20 しばらくするとフォークを置いて思索に戻る。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
21 隣の哲学者が食事中でフォークが手に取れない場合は、
a67653fda270 Initial revision
atsuki
parents:
diff changeset
22 そのままフォークが空くのを待つ。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
23
a67653fda270 Initial revision
atsuki
parents:
diff changeset
24 \begin{figure}[htpb]
a67653fda270 Initial revision
atsuki
parents:
diff changeset
25 \begin{center}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
26 \includegraphics[scale=.5]{figure/dpp_image.pdf}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
27 \end{center}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
28 \caption{Dining Philosophers Problemのイメージ}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
29 \label{fig:dpp_image}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
30 \end{figure}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
31
a67653fda270 Initial revision
atsuki
parents:
diff changeset
32 各哲学者を一つのプロセスとすると、この問題では5個のプロセスが並列に動くことになる。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
33 プロセスの並列実行はスケジューラによって制御することで実現する。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
34
a67653fda270 Initial revision
atsuki
parents:
diff changeset
35 \subsection{状態の定義とコードセグメントとの対応}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
36 Dining Philosophers ProblemをCbCで実装するにあたり、
a67653fda270 Initial revision
atsuki
parents:
diff changeset
37 プロセスを次のような8個の状態に分割した。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
38 \begin{itemize}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
39 \item 思索
a67653fda270 Initial revision
atsuki
parents:
diff changeset
40 \item フォークを持っていない場合の飢餓
a67653fda270 Initial revision
atsuki
parents:
diff changeset
41 \item 左手にフォークを持つ
a67653fda270 Initial revision
atsuki
parents:
diff changeset
42 \item 左手にフォークを持っている場合の飢餓
a67653fda270 Initial revision
atsuki
parents:
diff changeset
43 \item 右手にフォークを持つ
a67653fda270 Initial revision
atsuki
parents:
diff changeset
44 \item 食事
a67653fda270 Initial revision
atsuki
parents:
diff changeset
45 \item 右手のフォークを置く
a67653fda270 Initial revision
atsuki
parents:
diff changeset
46 \item 左手のフォークを置く
a67653fda270 Initial revision
atsuki
parents:
diff changeset
47 \end{itemize}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
48
a67653fda270 Initial revision
atsuki
parents:
diff changeset
49 CbCではconcurrencyがコードセグメント単位であるため、
a67653fda270 Initial revision
atsuki
parents:
diff changeset
50 実装の方法により任意に細分化することができる。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
51 今回は、状態数を8個とし、各状態に対応したコードセグメントを実装した。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
52 以下にコードセグメントの例を示す。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
53
a67653fda270 Initial revision
atsuki
parents:
diff changeset
54 \lstinputlisting[caption=「左手でフォークを持つ」コードセグメント,label=src:pickupL]
a67653fda270 Initial revision
atsuki
parents:
diff changeset
55 {src/pickupL.cbc}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
56
a67653fda270 Initial revision
atsuki
parents:
diff changeset
57 ソースコード\ref{src:pickupL}はDining Philosophers Problemの
a67653fda270 Initial revision
atsuki
parents:
diff changeset
58 プログラムの一部である。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
59 このコードセグメントは、「左手にフォークを持つ」状態に対応したものである。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
60
a67653fda270 Initial revision
atsuki
parents:
diff changeset
61 処理の具体的な内容は、左手側のフォークがあればそのフォークを取り、
a67653fda270 Initial revision
atsuki
parents:
diff changeset
62 フォークを取ったプロセス(哲学者)のIDとフォークのIDを表示する。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
63 その後、次の遷移先として「右手にフォークを持つ」状態である
a67653fda270 Initial revision
atsuki
parents:
diff changeset
64 pickup\_rforkコードセグメントをセットする。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
65 もし、フォークがなければ次の遷移先として「フォークを持っていない場合の飢餓」状態である
a67653fda270 Initial revision
atsuki
parents:
diff changeset
66 hungry1コードセグメントをセットする。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
67
a67653fda270 Initial revision
atsuki
parents:
diff changeset
68 各コードセグメントは、スケジューラに遷移するようにしている。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
69 これは、複数のプロセスをスケジューラを用いて制御するためである。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
70 状態遷移に必ずスケジューラを介すことで、
a67653fda270 Initial revision
atsuki
parents:
diff changeset
71 任意のプロセスのコードセグメントを実行することができる(図\ref{fig:scheduler})。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
72
a67653fda270 Initial revision
atsuki
parents:
diff changeset
73 \begin{figure}[htpb]
a67653fda270 Initial revision
atsuki
parents:
diff changeset
74 \begin{center}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
75 \includegraphics[scale=.7]{figure/scheduler.pdf}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
76 \end{center}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
77 \caption{スケジューラによる複数プロセスの制御}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
78 \label{fig:scheduler}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
79 \end{figure}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
80
a67653fda270 Initial revision
atsuki
parents:
diff changeset
81 CbCプログラムはオートマトンと似た構造になっており、
a67653fda270 Initial revision
atsuki
parents:
diff changeset
82 コードセグメントと状態、引数付きgotoと状態遷移、
a67653fda270 Initial revision
atsuki
parents:
diff changeset
83 if制御文と遷移条件がそれぞれ対応している(表\ref{tab:automaton-cbc})。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
84
a67653fda270 Initial revision
atsuki
parents:
diff changeset
85 \begin{table}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
86 \centering
a67653fda270 Initial revision
atsuki
parents:
diff changeset
87 \begin{tabular}{|c|c|} \hline
a67653fda270 Initial revision
atsuki
parents:
diff changeset
88 オートマトン & CbC \\ \hline
a67653fda270 Initial revision
atsuki
parents:
diff changeset
89 状態 & コードセグメント \\
a67653fda270 Initial revision
atsuki
parents:
diff changeset
90 状態遷移 & 引数付きgoto \\
a67653fda270 Initial revision
atsuki
parents:
diff changeset
91 遷移条件 & if制御文 \\ \hline
a67653fda270 Initial revision
atsuki
parents:
diff changeset
92 \end{tabular}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
93 \caption{オートマトンとCbCの対応}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
94 \label{tab:automaton-cbc}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
95 \end{table}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
96
a67653fda270 Initial revision
atsuki
parents:
diff changeset
97 コードセグメントと状態の対応に関しては、実際にはコードセグメントを抜けるときに状態が
a67653fda270 Initial revision
atsuki
parents:
diff changeset
98 確定する。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
99
a67653fda270 Initial revision
atsuki
parents:
diff changeset
100 並列実行をシミュレーションするために必要なスケジューラについて説明する。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
101 スケジューラは、最初にプロセスの生成と初期化を行い、それをタスクリストに登録する。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
102 その後、各プロセスに対してラウンドロビンやランダムといった任意の方式で実行する。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
103 ラウンドロビンとは、各プロセスを一定時間ずつ順番に実行することである。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
104
a67653fda270 Initial revision
atsuki
parents:
diff changeset
105 並列実行のシミュレーションに関しては、SPINを参考に各プロセスをランダムに
a67653fda270 Initial revision
atsuki
parents:
diff changeset
106 実行することで実現する。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
107
a67653fda270 Initial revision
atsuki
parents:
diff changeset
108 \section{CbCプログラムのタブロー展開}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
109 CbCプログラムのタブロー展開の特徴を以下に示す。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
110 \begin{itemize}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
111 \item プログラムの可能な実行の組み合わせすべてを調べる。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
112 \item 状態の探索はDepth First Searchで行う。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
113 \item プログラムの実行によって生成される状態は木構造で記録する。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
114 \item 同じ状態はすべて共有される。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
115 \end{itemize}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
116
a67653fda270 Initial revision
atsuki
parents:
diff changeset
117 \subsection{状態の展開}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
118 提案する手法では、プログラムの可能な実行の組み合わせをすべて調べることができる。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
119 CbCプログラムにおける可能な実行の組み合わせとは、
a67653fda270 Initial revision
atsuki
parents:
diff changeset
120 CbCプログラムをオートマトンとみなすと、オートマトンの遷移経路にあたる。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
121
a67653fda270 Initial revision
atsuki
parents:
diff changeset
122 例としてDining Philosophers Problemのプロセス(哲学者)を
a67653fda270 Initial revision
atsuki
parents:
diff changeset
123 状態遷移図で示す(図\ref{fig:dpp_automaton})。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
124 本研究では、CbCで実装するにあたり状態を8個に分割している。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
125 ここで、それぞれの状態をABCDEFGHと定義する。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
126
a67653fda270 Initial revision
atsuki
parents:
diff changeset
127 \begin{description}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
128 \item[A] 思索
a67653fda270 Initial revision
atsuki
parents:
diff changeset
129 \item[B] 飢餓
a67653fda270 Initial revision
atsuki
parents:
diff changeset
130 \item[C] 左手にフォークを持っている
a67653fda270 Initial revision
atsuki
parents:
diff changeset
131 \item[D] 左手にフォークを持つ場合の飢餓
a67653fda270 Initial revision
atsuki
parents:
diff changeset
132 \item[E] 両手にフォークを持っている
a67653fda270 Initial revision
atsuki
parents:
diff changeset
133 \item[F] 食事
a67653fda270 Initial revision
atsuki
parents:
diff changeset
134 \item[G] 右手のフォークを置いた
a67653fda270 Initial revision
atsuki
parents:
diff changeset
135 \item[H] 左手のフォークを置いた
a67653fda270 Initial revision
atsuki
parents:
diff changeset
136 \end{description}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
137
a67653fda270 Initial revision
atsuki
parents:
diff changeset
138 このオートマトンは「プロセスを終了する」という入力がないと、
a67653fda270 Initial revision
atsuki
parents:
diff changeset
139 例えば、$A\to B\to B\to B\to\cdots$というように探索が無限に続いてしまう場合がある。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
140 そうなると、一つの遷移経路が無限に続くことになり、
a67653fda270 Initial revision
atsuki
parents:
diff changeset
141 このオートマトンが取り得るすべての遷移経路を調べることができない。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
142 そこで、「ひとつの遷移経路で同じ状態が表れた場合はその経路の探索を終了する」
a67653fda270 Initial revision
atsuki
parents:
diff changeset
143 という条件を付加する。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
144 これにより、先ほどの経路の探索は$A\to B$で終了することができる。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
145
a67653fda270 Initial revision
atsuki
parents:
diff changeset
146 このようにして、遷移経路を図\ref{fig:dpp_automaton}から求めると、
a67653fda270 Initial revision
atsuki
parents:
diff changeset
147 \begin{itemize}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
148 \item $A\to B$
a67653fda270 Initial revision
atsuki
parents:
diff changeset
149 \item $A\to B\to C\to D$
a67653fda270 Initial revision
atsuki
parents:
diff changeset
150 \item $A\to B\to C\to D\to E\to F\to G\to H$
a67653fda270 Initial revision
atsuki
parents:
diff changeset
151 \item $A\to B\to C\to E\to F\to G\to H$
a67653fda270 Initial revision
atsuki
parents:
diff changeset
152 \end{itemize}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
153 という結果が得られる。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
154 これが、Dining Philosophers Problemのプロセスの可能な実行の組み合わせとなる。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
155
a67653fda270 Initial revision
atsuki
parents:
diff changeset
156
a67653fda270 Initial revision
atsuki
parents:
diff changeset
157 \begin{figure}[htpb]
a67653fda270 Initial revision
atsuki
parents:
diff changeset
158 \begin{center}
3
23fe35aec32b *** empty log message ***
atsuki
parents: 1
diff changeset
159 \includegraphics[scale=.75]{figure/dpp_automaton.pdf}
0
a67653fda270 Initial revision
atsuki
parents:
diff changeset
160 \end{center}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
161 \caption{Dining Philosophers Problemの状態遷移図}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
162 \label{fig:dpp_automaton}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
163 \end{figure}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
164
a67653fda270 Initial revision
atsuki
parents:
diff changeset
165 例では単一のプロセスの場合を述べたが、実際には5個のプロセスを並列に実行することになる。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
166 その場合、状態数は指数オーダーで増加する。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
167 状態数が多い場合、特に並列プログラムに対する状態の展開を手作業で行うのは不可能に近い。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
168
a67653fda270 Initial revision
atsuki
parents:
diff changeset
169 \newpage
a67653fda270 Initial revision
atsuki
parents:
diff changeset
170 \subsection{タブロー展開器の実装}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
171 CbCプログラムの状態を自動的に展開するためのツールを作成した。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
172 これをタブロー展開器と呼ぶ。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
173
a67653fda270 Initial revision
atsuki
parents:
diff changeset
174
a67653fda270 Initial revision
atsuki
parents:
diff changeset
175 タブロー展開器は、スケジューラと同様にCbCプログラムに組み込み、
a67653fda270 Initial revision
atsuki
parents:
diff changeset
176 複数プロセスを制御することで並列実行をシミュレーションすることができる。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
177 また、タブロー展開器は、コードセグメントを一つずつ実行しながら状態を探索していく。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
178 状態の探索はDFS(Depth First Search)で行う。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
179 例えば、Dining Philosophers Problemの単一プロセスの状態探索木は
a67653fda270 Initial revision
atsuki
parents:
diff changeset
180 図\ref{fig:dpp_dfs}のようになる。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
181
a67653fda270 Initial revision
atsuki
parents:
diff changeset
182 \begin{figure}[htpb]
a67653fda270 Initial revision
atsuki
parents:
diff changeset
183 \begin{center}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
184 \includegraphics[scale=.8]{figure/dpp_dfs.pdf}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
185 \end{center}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
186 \caption{Dining Philosophers Problemの状態遷移図}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
187 \label{fig:dpp_dfs}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
188 \end{figure}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
189
a67653fda270 Initial revision
atsuki
parents:
diff changeset
190 探索が終了すると、すべての状態が展開されたことになる。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
191
a67653fda270 Initial revision
atsuki
parents:
diff changeset
192
a67653fda270 Initial revision
atsuki
parents:
diff changeset
193 タブロー展開器の具体的な実装について説明する。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
194
a67653fda270 Initial revision
atsuki
parents:
diff changeset
195 まず、始めに状態として扱う変数をすべて登録する。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
196 変数はBinary Tree構造で記録する(図\ref{fig:memory_pattern})。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
197 このBinary Treeをメモリパターンと呼ぶ。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
198
a67653fda270 Initial revision
atsuki
parents:
diff changeset
199 \begin{figure}[htpb]
a67653fda270 Initial revision
atsuki
parents:
diff changeset
200 \begin{center}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
201 \includegraphics[scale=.8]{figure/memory_pattern.pdf}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
202 \end{center}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
203 \caption{メモリパターンの例}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
204 \label{fig:memory_pattern}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
205 \end{figure}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
206
a67653fda270 Initial revision
atsuki
parents:
diff changeset
207 新たに追加される変数がメモリパターンに既に登録されている場合、
a67653fda270 Initial revision
atsuki
parents:
diff changeset
208 その変数は登録されない。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
209
a67653fda270 Initial revision
atsuki
parents:
diff changeset
210
a67653fda270 Initial revision
atsuki
parents:
diff changeset
211 メモリパターンは変数の集合である。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
212 コードセグメントを実行することでいくつかの変数が変化した場合、
a67653fda270 Initial revision
atsuki
parents:
diff changeset
213 メモリパターンも変化したことになる(図\ref{fig:change_mem_pat})。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
214
a67653fda270 Initial revision
atsuki
parents:
diff changeset
215 \begin{figure}[htpb]
a67653fda270 Initial revision
atsuki
parents:
diff changeset
216 \begin{center}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
217 \includegraphics[scale=.9]{figure/change_mem_pat.pdf}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
218 \end{center}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
219 \caption{コードセグメントの実行にともなうメモリパターンの変化}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
220 \label{fig:change_mem_pat}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
221 \end{figure}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
222
a67653fda270 Initial revision
atsuki
parents:
diff changeset
223 変化したメモリパターンを新しいメモリパターンとしてBinary Tree構造で記録していく。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
224 このBinary Treeを状態データベースと呼ぶ。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
225 状態データベースのノード(状態ノード)は、メモリパターンのアドレスと
a67653fda270 Initial revision
atsuki
parents:
diff changeset
226 そのメモリパターンのハッシュ値を保持する(図\ref{fig:state_db})。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
227
a67653fda270 Initial revision
atsuki
parents:
diff changeset
228 \begin{figure}[htpb]
a67653fda270 Initial revision
atsuki
parents:
diff changeset
229 \begin{center}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
230 \includegraphics[scale=.9]{figure/state_db.pdf}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
231 \end{center}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
232 \caption{状態データベースの構成}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
233 \label{fig:state_db}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
234 \end{figure}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
235
a67653fda270 Initial revision
atsuki
parents:
diff changeset
236 新たにメモリパターンを追加する場合、メモリパターンのハッシュ値をもとに
a67653fda270 Initial revision
atsuki
parents:
diff changeset
237 状態データベースを検索する。もし、同じハッシュ値のメモリパターンが見つかった場合は
a67653fda270 Initial revision
atsuki
parents:
diff changeset
238 そのメモリパターンは状態データベースに追加されない。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
239 見つからなかった場合、新たな状態ノードとして状態データベースに追加される。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
240
a67653fda270 Initial revision
atsuki
parents:
diff changeset
241 メモリパターンの追加方法は、変化したメモリパターンのコピーを生成して
a67653fda270 Initial revision
atsuki
parents:
diff changeset
242 コピーの方を状態データベースに登録する。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
243 これは、もとのメモリパターンは次のコードセグメントを実行すると変化してしまうからである
a67653fda270 Initial revision
atsuki
parents:
diff changeset
244 (図\ref{fig:mem_pat_entry})。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
245
a67653fda270 Initial revision
atsuki
parents:
diff changeset
246 \begin{figure}[htpb]
a67653fda270 Initial revision
atsuki
parents:
diff changeset
247 \begin{center}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
248 \includegraphics[scale=.9]{figure/mem_pat_entry.pdf}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
249 \end{center}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
250 \caption{メモリパターンの状態データベースへの追加方法}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
251 \label{fig:mem_pat_entry}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
252 \end{figure}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
253
a67653fda270 Initial revision
atsuki
parents:
diff changeset
254
a67653fda270 Initial revision
atsuki
parents:
diff changeset
255 しかし、コードセグメントを実行してもメモリパターンに登録されているすべての変数が
a67653fda270 Initial revision
atsuki
parents:
diff changeset
256 変化するわけではない。変化するのは一部の変数のみである。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
257 したがって、メモリパターン全体をコピーし、
a67653fda270 Initial revision
atsuki
parents:
diff changeset
258 状態データベースに登録するのはメモリ使用に関して無駄がある。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
259
a67653fda270 Initial revision
atsuki
parents:
diff changeset
260 そこで、変化があった変数のみをコピーし、残りの変化のなかった部分は前回の状態を
a67653fda270 Initial revision
atsuki
parents:
diff changeset
261 そのまま使用するようにする。つまり、同じ状態を共有するようにする(図\ref{fig:mem_share})。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
262 これにより、メモリ使用量を減らすことができる。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
263
a67653fda270 Initial revision
atsuki
parents:
diff changeset
264 \begin{figure}[htpb]
a67653fda270 Initial revision
atsuki
parents:
diff changeset
265 \begin{center}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
266 \includegraphics[scale=.9]{figure/mem_share.pdf}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
267 \end{center}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
268 \caption{同じ状態の共有}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
269 \label{fig:mem_share}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
270 \end{figure}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
271
a67653fda270 Initial revision
atsuki
parents:
diff changeset
272
a67653fda270 Initial revision
atsuki
parents:
diff changeset
273
a67653fda270 Initial revision
atsuki
parents:
diff changeset
274 次にDepth First Search(DFS)による状態の探索の実装について述べる。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
275
a67653fda270 Initial revision
atsuki
parents:
diff changeset
276 本研究では、イテレータを用いてDFSを実装した。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
277 イテレータとは、配列やリストなどのデータ構造の各要素に対する
a67653fda270 Initial revision
atsuki
parents:
diff changeset
278 繰り返し処理を抽象化する手法のことである。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
279
a67653fda270 Initial revision
atsuki
parents:
diff changeset
280 タブロー展開器はスケジューラとしての機能を備えている。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
281 そのため、プロセスを実行する順番をリストとして持ち、制御する。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
282 これをタスクリストと呼ぶ(図\ref{fig:task_list})。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
283
a67653fda270 Initial revision
atsuki
parents:
diff changeset
284 \begin{figure}[htpb]
a67653fda270 Initial revision
atsuki
parents:
diff changeset
285 \begin{center}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
286 \includegraphics[scale=.9]{figure/task_list.pdf}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
287 \end{center}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
288 \caption{タスクリストの例}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
289 \label{fig:task_list}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
290 \end{figure}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
291
a67653fda270 Initial revision
atsuki
parents:
diff changeset
292 状態を展開する際に、このタスクリストに登録された順番にプロセスを実行していく。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
293 したがって、プログラムの状態を一つ進めるためにタスクリストからタスクを取りだし、
a67653fda270 Initial revision
atsuki
parents:
diff changeset
294 実行するという処理が繰り返し必要になる。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
295 その繰り返し処理を抽象化することで、データ構造の要素に対して行いたい処理を
a67653fda270 Initial revision
atsuki
parents:
diff changeset
296 簡潔に記述することができる。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
297
a67653fda270 Initial revision
atsuki
parents:
diff changeset
298
a67653fda270 Initial revision
atsuki
parents:
diff changeset
299 DFSの実装の具体的な内容について述べる。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
300
a67653fda270 Initial revision
atsuki
parents:
diff changeset
301 タスクリストからタスクを取り出す機構としてタスクイテレータを実装した。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
302 タスクイテレータはその時点のタスクリストと状態データベースおよび
a67653fda270 Initial revision
atsuki
parents:
diff changeset
303 ひとつ前の時点のタスクイテレータを保持している(図\ref{fig:task_iterator})。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
304
a67653fda270 Initial revision
atsuki
parents:
diff changeset
305 \begin{figure}[htpb]
a67653fda270 Initial revision
atsuki
parents:
diff changeset
306 \begin{center}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
307 \includegraphics[scale=.9]{figure/task_iterator.pdf}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
308 \end{center}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
309 \caption{タスクイテレータ}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
310 \label{fig:task_iterator}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
311 \end{figure}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
312
a67653fda270 Initial revision
atsuki
parents:
diff changeset
313 まず、最初のメモリパターンを状態データベースに登録後、
a67653fda270 Initial revision
atsuki
parents:
diff changeset
314 タスクイテレータの処理によりタスクを取りだしコードセグメントを実行する。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
315 その実行によって、変化したメモリパターンを状態データベースからハッシュ値をもとに検索する。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
316 同じメモリパターンがなかった場合、状態データベースに追加する。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
317 その後、1段深く探索するために新たにタスクイテレータを生成し、
a67653fda270 Initial revision
atsuki
parents:
diff changeset
318 その時点の状態データベースを登録する(図\ref{fig:dfs1})。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
319
a67653fda270 Initial revision
atsuki
parents:
diff changeset
320 \begin{figure}[htpb]
a67653fda270 Initial revision
atsuki
parents:
diff changeset
321 \begin{center}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
322 \includegraphics[scale=.9]{figure/dfs1.pdf}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
323 \end{center}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
324 \caption{タスクイテレータを用いたDFS 1}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
325 \label{fig:dfs1}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
326 \end{figure}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
327
a67653fda270 Initial revision
atsuki
parents:
diff changeset
328 同じメモリパターンがあった場合は、その経路の探索を終了し、
a67653fda270 Initial revision
atsuki
parents:
diff changeset
329 タスクイテレータにより次のタスクを取りだしコードセグメントを実行する。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
330
a67653fda270 Initial revision
atsuki
parents:
diff changeset
331 タスクイテレータのタスクリストをすべて実行した場合、
a67653fda270 Initial revision
atsuki
parents:
diff changeset
332 そのタスクイテレータを破棄し、ひとつ前のタスクイテレータに戻る(図\ref{fig:dfs2})。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
333 そこで探索可能な経路があればメモリパターンをレストアし探索を行う。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
334
a67653fda270 Initial revision
atsuki
parents:
diff changeset
335 \begin{figure}[htpb]
a67653fda270 Initial revision
atsuki
parents:
diff changeset
336 \begin{center}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
337 \includegraphics[scale=.8]{figure/dfs2.pdf}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
338 \end{center}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
339 \caption{タスクイテレータを用いたDFS 2}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
340 \label{fig:dfs2}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
341 \end{figure}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
342
a67653fda270 Initial revision
atsuki
parents:
diff changeset
343 これを繰り返していき、タスクイテレータが根に到達した場合、
a67653fda270 Initial revision
atsuki
parents:
diff changeset
344 全状態の探索が完了したことになる(図\ref{fig:dfs3})。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
345
a67653fda270 Initial revision
atsuki
parents:
diff changeset
346 \begin{figure}[htpb]
a67653fda270 Initial revision
atsuki
parents:
diff changeset
347 \begin{center}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
348 \includegraphics[scale=.8]{figure/dfs3.pdf}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
349 \end{center}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
350 \caption{状態探索の完了}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
351 \label{fig:dfs3}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
352 \end{figure}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
353
a67653fda270 Initial revision
atsuki
parents:
diff changeset
354
a67653fda270 Initial revision
atsuki
parents:
diff changeset
355 \newpage
a67653fda270 Initial revision
atsuki
parents:
diff changeset
356 ソースコード\ref{src:tableau}に実際にタブロー展開を行っているコードセグメントを示す。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
357
a67653fda270 Initial revision
atsuki
parents:
diff changeset
358 \lstinputlisting[caption=タブローコードセグメント,label=src:tableau]
a67653fda270 Initial revision
atsuki
parents:
diff changeset
359 {src/tableau.cbc}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
360
a67653fda270 Initial revision
atsuki
parents:
diff changeset
361 タブローコードセグメントは、関数呼び出しを使用するためCwCで記述している。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
362
a67653fda270 Initial revision
atsuki
parents:
diff changeset
363 \verb|get_memory_hash()|関数によってメモリパターンのハッシュ値を取得する。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
364 そのハッシュ値をもとに\verb|lookup_StateDB()|関数で状態データベースの検索を行っている。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
365 \verb|next_task_iterator()|関数は次に実行するタスクを取り出すものである。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
366
a67653fda270 Initial revision
atsuki
parents:
diff changeset
367 \verb|restore_memory()|関数は任意の時点の状態に戻すための関数である。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
368
a67653fda270 Initial revision
atsuki
parents:
diff changeset
369 実際にコードセグメントを実行するのは\verb|goto list->phils->next()|である。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
370 引数付きgotoで検証対象のプログラムのコードセグメントに遷移する。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
371
a67653fda270 Initial revision
atsuki
parents:
diff changeset
372 タスクイテレータが根に達した場合、探索を終了するために
a67653fda270 Initial revision
atsuki
parents:
diff changeset
373 \verb|goto ret(0),env|を実行している。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
374
a67653fda270 Initial revision
atsuki
parents:
diff changeset
375 %\section{LZW法を用いた状態の圧縮}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
376
a67653fda270 Initial revision
atsuki
parents:
diff changeset
377 \section{線形時相論理による仕様の検証手法}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
378 タブロー展開を行う際に、線形時相論理(Linear-time Temporal Logic、LTL)式より
a67653fda270 Initial revision
atsuki
parents:
diff changeset
379 生成されたコードセグメントを実行することで検証を行う。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
380
a67653fda270 Initial revision
atsuki
parents:
diff changeset
381 \subsection{検証の実装}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
382 検証対象のプログラムからスケジューラに遷移した後、タブローコードセグメントに遷移する前に
a67653fda270 Initial revision
atsuki
parents:
diff changeset
383 LTL式より生成された検証用コードセグメントを実行する。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
384 これにより、すべての状態において特定の性質を満たすことを調べることが可能である。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
385
a67653fda270 Initial revision
atsuki
parents:
diff changeset
386 実装したDining Philosophers Problemプログラムに対してデッドロックの検出を行う。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
387 デッドロックとは、複数のプロセスが互いに相手の占有している資源の開放を待ってしまい、
a67653fda270 Initial revision
atsuki
parents:
diff changeset
388 結果としてプログラムが停止してしまうことである。排他制御の欠陥で起こる。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
389
a67653fda270 Initial revision
atsuki
parents:
diff changeset
390 Dining Philosophers Problemにおいて、資源とはフォークのことである。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
391 つまり、この場合のデッドロックはすべての哲学者(プロセス)が左手でフォークを持ち、
a67653fda270 Initial revision
atsuki
parents:
diff changeset
392 右手のフォークが空くのを待っている状態である(図\ref{fig:dpp_deadlock})。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
393
a67653fda270 Initial revision
atsuki
parents:
diff changeset
394 \begin{figure}[htpb]
a67653fda270 Initial revision
atsuki
parents:
diff changeset
395 \begin{center}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
396 \includegraphics[scale=.5]{figure/dpp_deadlock.pdf}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
397 \end{center}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
398 \caption{Dining Philosophers Problemのデッドロック状態}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
399 \label{fig:dpp_deadlock}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
400 \end{figure}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
401
a67653fda270 Initial revision
atsuki
parents:
diff changeset
402
a67653fda270 Initial revision
atsuki
parents:
diff changeset
403 デッドロックを検知するために、 命題pを「すべての哲学者が左手にフォークを持っている」
a67653fda270 Initial revision
atsuki
parents:
diff changeset
404 として、 命題pが決して起こらないことを検査する。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
405 これをLTL式で表すと□~pである。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
406 これは、LTLで表現できる重要な特性の一つの安全性特性である。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
407
a67653fda270 Initial revision
atsuki
parents:
diff changeset
408 これを検査するための検証用コードセグメントをソースコード\ref{src:check}に示す。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
409
a67653fda270 Initial revision
atsuki
parents:
diff changeset
410 \lstinputlisting[caption=検証用コードセグメント,label=src:check]
a67653fda270 Initial revision
atsuki
parents:
diff changeset
411 {src/ltl.cbc}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
412
a67653fda270 Initial revision
atsuki
parents:
diff changeset
413 \verb|p()|関数は命題pに相当するものですべての哲学者(プロセス)が
a67653fda270 Initial revision
atsuki
parents:
diff changeset
414 左手にフォークを持っているかを判定するものである。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
415 checkコードセグメントがタブロー展開の際に実行されることで、
a67653fda270 Initial revision
atsuki
parents:
diff changeset
416 すべての状態において命題pが決して起こらないかどうかを検査することができる。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
417
a67653fda270 Initial revision
atsuki
parents:
diff changeset
418 %%% end %%%