xv6から始めるSPIN入門	           @oraccha 2012-09-02 カーネル/VM勉強会
SPINって何?	¤ sleep1.p ??	                     本筋じゃなくてすいません。。。
SPINって何?	¤ 並行システムのモデル検査ツール   l ソフトウェアが「正しく」動くことを証明したり、      反証を示すことが可能   l テスト手法とは異なり、設計段階で使用   l 例:通信プロトコルの状態遷移チェック、 ...
SPINって何?	                            SPIN:	  Simple	  Promela	  Interpreter	     モデル                      Promela:	  Proce...
sleep1.p	¤ 生産者・消費者問題を使った、排他制御の  教材だと思われる   l ロックを取得して、共有資源にアクセスする   l テキスト “Sleep and wakeup” (P.55-57)¤ 同じパターンはソースコード...
“Hello, world!”	/* My first promela program. */active proctype main() {   printf(“Hello, world!n”);}$ spin hello.p !      ...
Promelaモデル	¤ 変数¤ プロセス¤ メッセージチャネル
データ型、配列	¤ 基本的にC言語と同じ   l 例外:初期値は0かfalse¤ スコープ   l グローバル変数   l プロセス内ローカル変数	  # define N 2                      #defineや...
プロセス	¤ SPINは実行可能なプロセスをランダムに1つ 選び、そこから1文を実行 l 例外:atomicで囲まれた文は不可分に実行¤ proctypeで定義し、activeでインスタンス化¤ プロセスIDはローカル変数_pidで取得...
inline文	¤ C言語の関数に似ているが、あくまでマクロ¤ Promela言語に関数は存在しない	  inline acquire(x) {        atomic { x == 0; x = 1 }  }             ...
assert文	¤ assert(3)と同じで、不変条件の表明に使用    l 偽だとエラー発生	  inline acquire(x) {        atomic { x == 0; x = 1 }  }  inline releas...
if式	¤ 真のガード条件をランダムに1つ選んで実行¤ 条件を満たすものがなければ待機	inline sleep(cond, lk) {      assert !sleeping[_pid];      if      :: cond -...
do式	¤ 基本的にif式と同じだが、永久に評価を繰り返す¤ break文で脱出	inline wakeup(){      w = 0;      do      :: w < N ->            sleeping[w] = ...
インストール for Mac OS X	¤ Mountain Lion + Xcode command line tools¤ spinroot.comからソースコードをダウンロード して、コンパイル  l  makefileのCFLAG...
デッドロック	¤ ソースコード冒頭のコメントに従い、間違った   ロックの使い方をするように改変すると、、、¤ エラーが発生すると、各プロセスの実行トレー   スを出力	$ ./spinp sleep1.p !...snip...!Stat...
まとめ	¤ モデル検査ツールSPINのPromela言語の ソースコードを読んでみた l 線形時間論理とかCSPとかわからなくても、  とりあえず使うことはできる¤ SPINはOS屋の嗜みの一つ   l 通信プロトコルの設計などをする人...
Upcoming SlideShare
Loading in...5
×

xv6から始めるSPIN入門

1,909

Published on

カーネル/VM勉強会 第2回OS基礎(xv6)

Published in: Technology
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,909
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
11
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

xv6から始めるSPIN入門

  1. 1. xv6から始めるSPIN入門 @oraccha 2012-09-02 カーネル/VM勉強会
  2. 2. SPINって何? ¤ sleep1.p ?? 本筋じゃなくてすいません。。。
  3. 3. SPINって何? ¤ 並行システムのモデル検査ツール l ソフトウェアが「正しく」動くことを証明したり、 反証を示すことが可能 l テスト手法とは異なり、設計段階で使用 l 例:通信プロトコルの状態遷移チェック、 排他制御アルゴリズムの検証¤ PromelaというC言語ライクなモデリング言語¤ 1980年ごろからベル研で開発¤ 現在、http://spinroot.com/から入手可能
  4. 4. SPINって何? SPIN:  Simple  Promela  Interpreter   モデル Promela:  Process  Meta  Language (Promela) SPIN pan.c C compiler spinpスクリプトは検証モードで動作:  あらゆる状態遷移を生成し、所定の   pan (protocol analyzer) 性質を満たしているか検証
  5. 5. sleep1.p ¤ 生産者・消費者問題を使った、排他制御の 教材だと思われる l ロックを取得して、共有資源にアクセスする l テキスト “Sleep and wakeup” (P.55-57)¤ 同じパターンはソースコード内に頻出 l 例:bio.c, console.c, fs.c, log.c, pipe.c, proc.c
  6. 6. “Hello, world!” /* My first promela program. */active proctype main() { printf(“Hello, world!n”);}$ spin hello.p ! Hello, world!!1 process created!
  7. 7. Promelaモデル ¤ 変数¤ プロセス¤ メッセージチャネル
  8. 8. データ型、配列 ¤ 基本的にC言語と同じ l 例外:初期値は0かfalse¤ スコープ l グローバル変数 l プロセス内ローカル変数 # define N 2 #defineや#include文は内部でcppにより bit lk; 処理されるので、C言語同様に利用可能   byte value; bit sleeping[N]
  9. 9. プロセス ¤ SPINは実行可能なプロセスをランダムに1つ 選び、そこから1文を実行 l 例外:atomicで囲まれた文は不可分に実行¤ proctypeで定義し、activeでインスタンス化¤ プロセスIDはローカル変数_pidで取得可能 active[N] proctype consumer() { ... } active[N] proctype producer() { ... }
  10. 10. inline文 ¤ C言語の関数に似ているが、あくまでマクロ¤ Promela言語に関数は存在しない inline acquire(x) { atomic { x == 0; x = 1 } } 式は真になるまでブロック。   「x==0」は次のコードと等価     inline release(x) {  while  (x  !=  0)      skip assert x==1; x=0 「;(セミコロン)」は、文の終端を示す } ものではなく、文の分割を意味する。 「-­‐>」も同じ意味  
  11. 11. assert文 ¤ assert(3)と同じで、不変条件の表明に使用 l 偽だとエラー発生 inline acquire(x) { atomic { x == 0; x = 1 } } inline release(x) { assert x==1; x=0 }
  12. 12. if式 ¤ 真のガード条件をランダムに1つ選んで実行¤ 条件を満たすものがなければ待機 inline sleep(cond, lk) { assert !sleeping[_pid]; if :: cond -> skip /* 何もしない文(Pythonのpassみたい) */ :: else -> atomic { release(lk); sleeping[_pid] = 1 }; sleeping[_pid] == 0; acquire(lk) fi}
  13. 13. do式 ¤ 基本的にif式と同じだが、永久に評価を繰り返す¤ break文で脱出 inline wakeup(){ w = 0; do :: w < N -> sleeping[w] = 0; w=w+1 :: else -> break od} この例は、forループを書きたいときのイディオムかな
  14. 14. インストール for Mac OS X ¤ Mountain Lion + Xcode command line tools¤ spinroot.comからソースコードをダウンロード して、コンパイル l  makefileのCFLAGSに-DMACを追加¤ 最新版はVersion 6.2.2 $ ./spinp sleep1.p ! ...snip...! State-vector 48 byte, depth reached 236, errors: 0! ...snip...!
  15. 15. デッドロック ¤ ソースコード冒頭のコメントに従い、間違った ロックの使い方をするように改変すると、、、¤ エラーが発生すると、各プロセスの実行トレー スを出力 $ ./spinp sleep1.p !...snip...!State-vector 48 byte, depth reached 236,errors: 5!...snip...!
  16. 16. まとめ ¤ モデル検査ツールSPINのPromela言語の ソースコードを読んでみた l 線形時間論理とかCSPとかわからなくても、 とりあえず使うことはできる¤ SPINはOS屋の嗜みの一つ l 通信プロトコルの設計などをする人は知って 損はないようです l OSを形式手法を用いて検証するというのは、 ここ数年のホットな話題らしいですよ
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×