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

Slides:



Advertisements
Similar presentations
プログラミング言語論 第10回(演習) 情報工学科 木村昌臣   篠埜 功.
Advertisements

OWL-Sを用いたWebアプリケーションの検査と生成
モデル検査の応用 徳田研究室 西村太一.
耐故障アルゴリズム.
Webサービスに関する基本用語 Masatoshi Ohishi / NAOJ & Sokendai
プログラミング基礎I(再) 山元進.
ラベル付き区間グラフを列挙するBDDとその応用
コンパイラ 2011年10月17日
プログラミング言語としてのR 情報知能学科 白井 英俊.
スレッドの同期と、スレッドの使用例 スレッドの同期 Lockオブジェクト: lockオブジェクトの生成
プログラミングができるようになるには…. 一週間に1回では無理! 自分の力でできるだけがんばる
基礎プログラミングおよび演習 第9回
5.チューリングマシンと計算.
5.チューリングマシンと計算.
プログラミング基礎I(再) 山元進.
条件式 (Conditional Expressions)
並列分散プログラミング.
プログラミング論 II 電卓,逆ポーランド記法電卓
コンパイラ 2012年10月15日
システムプログラミング 第11回 シグナル 情報工学科  篠埜 功.
大域的データフロー解析 流れグラフ 開始ブロック 基本ブロックをnodeとし、 基本ブロック間の制御関係をedgeとするグラフを、
Flyingware : バイトコード変換による 安全なエージェントの実行
MPIによる行列積計算 情報論理工学研究室 渡邉伊織 情報論理工学研究室 渡邉伊織です。
Occam言語による マルチプリエンプティブシステムの 実装と検証
プログラミング言語論 第3回 BNF記法について(演習付き)
モデル検査 状態遷移系 PLTL(propositional linear-time temporal logic) PLTLのモデル検査
7 ソフトウェア工学 Software Engineering モデル検査 MODEL CHECKING.
帰納変数 iが基本帰納変数 変数iに対して、 i := i±c という形の代入が一つのみ jがiに対する帰納変数
最適化の方法 中田育男著 コンパイラの構成と最適化 朝倉書店, 1999年 第11章.
Cプログラミング演習 第7回 メモリ内でのデータの配置.
プログラミング入門 電卓を作ろう・パートIV!!.
オーバレイ構築ツールキットOverlay Weaver
アルゴリズムとプログラミング (Algorithms and Programming)
プログラミング演習I 2003年5月7日(第4回) 木村巌.
プログラミング言語論 第五回 理工学部 情報システム工学科 新田直也.
モデル検査(3) 手続き型言語に基づくモデリング
25. Randomized Algorithms
計算量理論輪講 chap5-3 M1 高井唯史.
計算機構成 第3回 データパス:計算をするところ テキスト14‐19、29‐35
プログラミング言語論 第四回 理工学部 情報システム工学科 新田直也.
先週の復習: CPU が働く仕組み コンピュータの構造 pp 制御装置+演算装置+レジスタ 制御装置がなければ電卓と同様
復習 一定回数を繰り返す反復処理の考え方 「ループ」と呼ぶ false i < 3 true i をループ変数あるいはカウンタと呼ぶ
B演習(言語処理系演習)第2回 田浦.
モデル検査(5) CTLモデル検査アルゴリズム
環境モデリングによるモデル検査スクリプトの自動生成
アルゴリズムとプログラミング (Algorithms and Programming)
マイグレーションを支援する分散集合オブジェクト
4 形式的設計検証技術 検証 verification 形式的検証 (4.1.2)
5.チューリングマシンと計算.
「マイグレーションを支援する分散集合オブジェクト」
卒業研究 JCSPを用いたプログラム開発  池部理奈.
PROGRAMMING IN HASKELL
アルゴリズムとデータ構造1 2009年6月15日
C#プログラミング実習 第2回.
オペレーティングシステムJ/K (並行プロセスと並行プログラミング)
復習 if ~ 選択制御文(条件分岐) カッコが必要 true 条件 false 真(true)なら この中が aを2倍する 実行される
MPIを用いた並列処理計算 情報論理工学研究室 金久 英之
PROGRAMMING IN HASKELL
プログラミング基礎演習 第4回.
オブジェクト指向言語論 第二回 知能情報学部 新田直也.
コンパイラ 2012年10月11日
アルゴリズムとデータ構造 2010年6月17日
PROGRAMMING IN HASKELL
データ構造と アルゴリズムI 第三回 知能情報学部 新田直也.
システムプログラミング 第11回 シグナル 情報工学科  篠埜 功.
プログラミング入門2 第5回 配列 変数宣言、初期化について
情報処理Ⅱ 第3回 2004年10月19日(火).
情報処理Ⅱ 2006年10月20日(金).
情報処理Ⅱ 第8回:2003年12月9日(火).
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
Presentation transcript:

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

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

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

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

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

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

例題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); }

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

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

メッセージタグ 例題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(); } メッセージの型 チャネル チャネル容量

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

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

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

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

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

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

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

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

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

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

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

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

仕組み(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’ };

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

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

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

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

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

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

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