猫でもわかる! モデル検査器 SPIN 入門
- 2. リソース共有問題
● スキャナとプリンタを同時に使用したい
● スキャナ・プリンタの使用は一度に 1 人のみ
● クライアントが 2 人いる場合
– クライアント A がスキャナを確保
– クライアント B がプリンタを確保
– A はプリンタの、B はスキャナの解放待ち
– 両者ともに動けない (デッドロック)
● 並行プロセスの相互作用による不具合
- 3. 現実はさらに複雑
● イレギュラーな挙動
– 突然エラーが発生してプロセスが死ぬ
– パケットが通信中に消失・破損する
● プロセス間の複雑な相互作用
– 非同期処理と同期処理が混在している
– 通信に遅延が発生する
- 5. Promela / SPIN
● Promela (PROcess MEta LAnguage)
– プロセスの振る舞いを記述する DSL
– 手続き指向、C 言語風文法
● SPIN (Simple Promela INterpreter)
– Promela でモデル化されたシステムを検証
– モデルが取り得るすべての状態を全探索
- 6. 非決定的選択
● 複数の遷移の可能性を考えられる
● システムから制御不可能な要素をモデリング
● SPIN は発生し得るすべての分岐を検査
if
:: mode == 0 -> input = 0;
:: mode == 1 -> input = 0;
:: mode == 1 -> input = 1;
fi
- 7. インタリーブ実行
● 文ごとに割り込みが発生し得る
● 非同期マルチプロセスをモデリング
● SPIN は発生し得るすべての実行順序を検査
proctype incrementer() {
tmp = acc; /* A */
acc = tmp + 1; /* B */
}
proctype decrementer() {
tmp = acc; /* C */
acc = tmp – 1; /* D */
}
- 8. 線形時相論理
● LTL (Linear Temporal Logic) とも呼ばれる
● 時間的な前後関係を含む条件を検証
– □ … 現在以降の任意の状態で条件が成立
– ◇ … 現在以降のある状態で条件が成立
● 例 : リクエストに対しいつかは応答がある
[] (request => <> response)
● 例:初期化後は常に有効
[] (initialized => [] active)
- 9. 興味のある人は
● Basic Spin Manual
– http://whitewash-net.or.jp/~hs7m-kwgc/
spin/Man/Manual_japanese.html
● 書籍『SPIN モデル検査入門』
– Mordechai Ben-Ari 著、中島震ら訳
● 名古屋モデル検査勉強会 #2 資料
– https://gist.github.com/y-taka-23/8419128
presented by チェシャ猫 (@y_taka_23)