Presentation is loading. Please wait.

Presentation is loading. Please wait.

プロトコル検証器SPINの紹介 並列分散プログラミング講義 田浦.

Similar presentations


Presentation on theme: "プロトコル検証器SPINの紹介 並列分散プログラミング講義 田浦."— Presentation transcript:

1 プロトコル検証器SPINの紹介 並列分散プログラミング講義 田浦

2 正しい並列分散プログラムを書くことはなぜ易しくないか?
可能な状態遷移が多数 典型的にO(EXP(プロセス数))になる 選択は「(意地悪な)神にゆだねている」 正しいプログラム 全ての可能な実行において 望む動作する

3 正しいプログラムとは 典型的には, プログラムの正しさの検査=
safety : 初期状態から到達可能な状態Sで常に条件P(S)が成り立つ (always P) progress : 初期状態から有限回の遷移後に条件Qが成り立つ(eventually Q) プログラムの正しさの検査= 状態遷移グラフ上で上記が満たされているかどうかの検査

4 プログラムの正しさを確信するためのアプローチ
手による証明 自動検証(有限状態モデル検査) 状態数が有限の(コンピュータにとっては少ない)ときに使える方法 方法(概要) コンピュータが完全な状態遷移グラフをならべあげる 指定された条件が成り立つかどうかを調べる

5 PromelaとSPIN http://spinroot.com/spin/whatispin.html
メッセージパッシング,共有メモリ SPIN : プロトコル検証ツール 擬似実行 完全実行 Supertrace実行(大きな問題の一部検証)

6 Promela記述言語 基本概念 プロセス 共有メモリ(大域変数) メッセージ送受信(チャネル) C的syntax

7 例題1 (共有メモリ) bool done1 = false; bool done2 = false; int x = 0; proctype incrementer1(){ int t; t = x; x = t + 1; done1 = true; } proctype incrementer2() { /* ほぼ同様 */ } init { run incrementer1(); run incrementer2(); done1 && done2 --> assert(x == 2); }

8 構文(1) E --> F 条件Eが成り立つのを待ってFを実行
done1 && done2 --> assert(x == 2); 実はあらゆる式はその式の「実行可能条件」なる条件を待つ 論理式の「実行可能条件」はその論理式 代入式の「実行可能条件」はtrue 実は --> と ; は全く同じ意味

9 構文(2) proctype A(…) { … }: プロセスの雛形を定義 run A(…): プロセスAを生成して実行

10 メッセージタグ 例題2 (メッセージ) mtype = { read, reply }; chan pq = [1] of { mtype }; chan qp = [1] of { mtype, byte }; proctype P() { byte v; pq!read; qp?reply(v) --> printf("v = %d\n", v); } proctype Q() { byte x = 20; pq?read --> qp!reply(x) } init { run P(); run Q(); } メッセージの型 チャネル チャネル容量

11 構文(3) mtype = { id1, id2, … }; chan id = [N] of { T1, T2, … };
メッセージタグの種類を宣言(プログラム中に一度) 本質的には各idiに一意な定数を割り当てている chan id = [N] of { T1, T2, … }; メッセージをためるqueue 各要素の型は(T1, T2, …) このチャネルはN個まで要素を溜めることが出来る FIFO (チャネルに入った順に出てくる)

12 構文(4) E!F : EにFを送信 実行可能条件: Eが満杯でない E?tag(x, y, …) : Eの先頭からメッセージtag(?, ?, …)を取り出し,変数x, y, …を取り出された値にbindする 実行可能条件: Eの先頭のメッセージが上記パターンに合致する 注: 実はパターンの構文はもっと一般的 foo(1, x, 3) など mtypeは単なる特殊なデータ型.tagのないメッセージも許される

13 注意(1): atomicity ひとつの文の実行はatomic x++ はatomic!! 本物の計算機ではatomicではない!
正しいモデル化: t = x; x = t + 1; のようにあえて分けて書く

14 注意(2): FIFO 各チャネルはFIFO 以下はdeadlockする a!foo; a!bar; a?bar; a?foo;

15 注意(3) Nノードからなるメッセージ送受信システムの近似として, ノード = プロセス + 受信用チャネル1個 とやると思わぬ考えおとしがありうる 正しいモデル: 各プロセス間に一個チャネルを用意する(現実のシステムでノード間のFIFOが成り立っていれば)

16 構文(5): if文みたいなもの if :: G1 --> E; E; …; E :: G2 --> E; E; …; E … fi 意味 Giのうちどれかが実行可能になるまで待つ 実行可能なものを非決定的にひとつ選択し,実行

17 構文(6): ループみたいなもの do :: G1 --> E; E; …; E :: G2 --> E; E; …; E … od if文とほとんど同じ.繰り返すところだけが違う breakでループを抜ける

18 構文(7): atomic構文 atomic { E; E; … } で{ … }をatomicに(他のプロセスをとめたまま)実行
compare-and-swapなどを記述可能 状態数を減らすために複数文を一まとめに しかし,実際にatomicに実行できないsequenceに使うと検証の意味がなくなる

19 実行法1 : シミュレーション spin オプション ファイル名 オプション -s メッセージ送信を表示 -r メッセージ受信を表示
-g 全ての大域変数変更を表示

20 実行法2 : 検証 全ての可能な状態を並べ上げ,指定した性質が成り立つことを検証 spin –a ファイル名
pan.cをコンパイル&実行 エラーが起きたら, spin –t ファイル名 でエラーに至るパスを再現

21 性質として記述できること assert(P) progress accept LTL formula
書かれた場所でPが成り立つこと(“always P”型) progress accept LTL formula Linear Temporal Logic formula

22 assert(P) 最も自然には「プログラムがこの場所を実行しているならばP」が書ける
注目: 余分なobserver processを用いて, proctype observer { assert(P); } と書けばそれがalways Pの検証になる(完全実行の強み!)

23 仕組み(assertionの検査) 本気で全状態を検査(本質的にはgraph 探索)
W = 初期状態集合; C = {} while (Wが空でない) pick s in W; sに割り当てられたassertを検査 for all s’ s.t. s -> s’ if s’  C W = W + { s’}; C = C + { s’ };

24 必要なメモリ 1状態のサイズ  到達可能状態の数
少し大きなプロトコルでは容易に,可能メモリ量を突破する(「有限ならよい」というのは近似ですらない)

25 SPINの面白いところ どうせメモリが溢れる場合にも“best effort”をする(Supertraceアルゴリズム)
状態遷移グラフ全体を公平にカバーする(unlike 深さ優先) おとずれた状態をなるべく少ないビット数(2 bit!)であらわす

26 Supertraceアルゴリズム C (すでに検査された状態)を巨大array (固定サイズ(H状態分=1/4 Hバイト)
状態s  [0, H) にハッシュ.その値をindexとしてCの対応するbitを見る 1だったら「探索済み」とみなす つまり,ハッシュ値がぶつかったら「同じ状態」とみなす(完全な探索ではなくなる)

27 さらに知りたい人,使ってみたい人へ SPIN ホームページ http://spinroot.com/spin/whatispin.html
Design and Validation of Computer Protocols Model Checking

28 いくつかの単位のとり方 スピード狂コース 安全狂コース 決められたプログラム(グラフの探索)をいかに速く並列化するか
少し込み入ったプロトコルを正しく書く(手で証明,SPINで検証,etc.)

29 スピード狂コース 問題: グラフの探索 プラットフォーム例 与えられたグラフのノード数を正しく数えるだけ! 近日詳細発表予定
情報理工SunFire 15K (72CPUs) ソフト自由(Pthreads, MPI, etc.) ハード自由,ソフト自由(クラスタ)

30 安全狂コース 「値交換プロトコル」よりちょっと複雑なプロトコルを設計・実装 SPINでモデル化・検証
オプション 1: 実プラットフォームに移植・実行 オプション 2: 証明ができればなおよし


Download ppt "プロトコル検証器SPINの紹介 並列分散プログラミング講義 田浦."

Similar presentations


Ads by Google