第5章 デッドロック検査

並行システムの検証と実装
第5章 デッドロック検査
PRINCIPIA Limited
初谷 久史
©2015 PRINCIPIA Limited
デッドロック検査
●
●
ミューテックスのモデル
ミューテックスによる排
他制御
●
2リソース問題
●
デッドロック検査
●
システムコールのモデル
●
抽象状態と継承
●
デッドロックの検出機構
©2015 PRINCIPIA Limited
●
●
プロセスが特定の状態に
いることを観測する
複数のプロセスがそれぞ
れ特定の状態に同時にい
ることを観測する
2
ミューテックスのモデル
P0
lock0
unlock0
P1
lock1
unlock1
MUTEX
P0
P1
lock
unlock
MUTEX
クライアントごとに
イベントを用意
©2015 PRINCIPIA Limited
インターリーブ結合
3
ミューテックス: クライアント毎
P0
lock0
unlock0
P1
lock1
unlock1
(define-event
(define-event
(define-event
(define-event
lock0)
unlock0)
lock1)
unlock1)
MUTEX
どちらがロックしているか
識別できる
©2015 PRINCIPIA Limited
4
ミューテックス: インターリーブ
P0
P1
(define-event lock)
(define-event unlock)
lock
unlock
MUTEX
抽象化
クライアントの識別不可
©2015 PRINCIPIA Limited
5
共有メモリモデル
P0
P1
rd
wr
(define-process P
(? rd (x)
(! wr ((+ x 1)) STOP)))
(define-process (SHMEM m)
(alt
(! rd (m) (SHMEM m))
(? wr (x) (SHMEM x)) ))
SHMEM
m=1
m=2
©2015 PRINCIPIA Limited
6
ミューテックスによる排他制御
P0
rd wr
SHMEM
©2015 PRINCIPIA Limited
P1
lock
unlock
MUTEX
7
インクリメントプロセスの修正
(define-process P
(? rd (x)
(! wr ((+ x 1)) STOP)))
(define-process P
(! lock
(? rd (x)
(! wr ((+ x 1))
(! unlock STOP)))))
©2015 PRINCIPIA Limited
8
インターリーブ結合
P0
P1
lock
unlock
rd wr
SHMEM
(define-process SYSTEM
(par (list rd wr lock unlock)
(par '() P P)
(par '() (SHMEM 0) UNLOCK)))
MUTEX
まず相互作用のない P0 と P1,
SHMEM と MUTEX をインターリーブ
で並行合成する
P0 ||| P1
rd wr lock unlock
SHMEM ||| MUTEX
©2015 PRINCIPIA Limited
2段階目の並行合成は左図のように見える
(||| はインターリーブ結合を表す記号)
9
計算木
example-5-0-mutex.ss
MUTEX がない場合
©2015 PRINCIPIA Limited
10
†
2リソース問題
P0
P1
Scanner
Printer
©2015 PRINCIPIA Limited
プロセス P0, P1 それぞれが
Scanner と Printer を同時に
利用しようとしている
MUTEX を2つ用意して排他制
御を行う
11
2リソース問題
P0
lock0
unlock0
MUTEX0
©2015 PRINCIPIA Limited
P1
lock1
unlock1
MUTEX1
12
イベント定義
(define-event use0)
(define-event use1)
(define-event lock0)
(define-event unlock0)
プロセス P0, P1 それぞれが
2つの資源を同時に使うこと
を表すイベント
(define-event lock1)
(define-event unlock1)
©2015 PRINCIPIA Limited
13
プロセス定義: プロセスP0, P1
(define-process P0
(! lock0
(! lock1
(! use0
(! unlock1
(! unlock0 P0))))))
(define-process P1
(! lock1
(! lock0
(! use1
(! unlock1
©2015 PRINCIPIA Limited
(! unlock0 P1))))))
MUTEX0, MUTEX1 を
順番にロックする
資源の使用
P0 とは逆順にロック
14
プロセス定義: ミューテックス
(define-process MUTEX0
(! lock0 (! unlock0 MUTEX0)))
イベント以外は同じ
(define-process MUTEX1
(! lock1 (! unlock1 MUTEX1)))
cf. 以前に作成した
状態遷移図バージョン
©2015 PRINCIPIA Limited
15
並行合成
(define-process SYSTEM
(par (list lock0 unlock0
lock1 unlock1)
(par '() P0 P1)
(par '() MUTEX0 MUTEX1)))
P0
lock0
unlock0
©2015 PRINCIPIA Limited
MUTEX0
P1
lock1
unlock1
MUTEX1
16
計算木
example-5-1-twores.ss
P0
P1
MUTEX0
©2015 PRINCIPIA Limited
MUTEX1
17
†
†
デッドロック検査
Process list ウィンドウの "Assertions" ボタンを押
すと Assertions ウィンドウが開く
右クリックメニューから
"add deadlock" を選択する
©2015 PRINCIPIA Limited
18
†
デッドロック検査
デッドロック検査式のテン
プレートが表示されるので
プロセス名 P を SYSTEM に
変える
項目上で右クリックし
"check" を選択する
©2015 PRINCIPIA Limited
19
デッドロック検査
デッドロックが発見される
記号の意味
未検査
問題なし
問題あり
©2015 PRINCIPIA Limited
20
†
デッドロックの分析
項目上で右クリックし
"explore" を選択する
初期状態からデッドロック状態
までの最短パスが表示される
デッドロックなので
©2015 PRINCIPIA Limited
遷移はない
21
†
プロセスの修正
(define-process P0
(! lock0
(! lock1
(! use0
(! unlock1
(! unlock0 P0))))))
(define-process P1
(! lock0
(! lock1
(! use1
(! unlock1
©2015 PRINCIPIA Limited
(! unlock0 P1))))))
同じ順序でロックする
再検査
デッドロックがないこ
とが確認できる
22
デッドロック検査のポイント
●
●
デッドロック検査の結果が
ならば
いかなる実行パスにもデッドロックはない
デッドロック検査の結果が
だった場合
初期状態からデッドロック状態への最短パスがわ
かるので,デッドロックが発生する原因を分析で
きる
–
プロセス木
–
環境
–
サブプロセスの計算木
©2015 PRINCIPIA Limited
23
ミューテックスのモデル
P0
lock0
unlock0
P1
P0
lock1
unlock1
ret
ret
lock0
unlock0
P1
lock1
unlock1
MUTEX
MUTEX
システムコールの
モデル
クライアントごとに
イベントを用意
詳細
©2015 PRINCIPIA Limited
P0
P1
lock
unlock
MUTEX
インターリーブ結合
抽象
24
システムコールのモデル
システムコールのモデル
P
抽象的な同期モデル
MUTEX
P
lock
lock
ret
呼び出しとリターンをイベン
トで表現する
(ret のみ待つという約束)
● ret イベント発生=ロック獲得
● クライアントがロックしよう
としていることを lock で知る
●
を返さないことでブロック
©2015ret
PRINCIPIA
Limited
を表現できる
MUTEX
●
●
●
lockイベント発生=ロック獲得
クライアントがロックしよう
としていることを知ることは
できない
25
システムコール型ミューテックス
ret イベントでロック獲得
P ロック中に
Q がロック要求
P がロック中で
かつ
Q がロック要求
している状態
©2015 PRINCIPIA Limited
unlock は単純なイベント同期
● システムコール型と混在可能
26
● 分析したい側面に注目する(抽象化)
デッドロック検出機構
目的: 実行時にデッドロックが発生したことを
検出し回避する仕組みを考える
資源
要求
P
R0
Q
lock
プロセス
P0
所有
P1
R1
資源グラフ(R. C. Holt, 1972)
©2015 PRINCIPIA Limited
MUTEX
ret
lock
デッドロックを検出するには
クライアントが要求している
ことを識別する必要がある
27
2リソース問題再び
P
P.lock0
P.ret0
P.unlock0
Q.lock0
Q.ret0
Q.unlock0
MUTEX0
©2015 PRINCIPIA Limited
Q
P.lock1
P.ret1
P.unlock1
Q.lock1
Q.ret1
Q.unlock1
MUTEX1
28
プロセス定義: プロセス P
©2015 PRINCIPIA Limited
29
プロセス定義: プロセスQ
©2015 PRINCIPIA Limited
30
問題設定
●
ミューテックスにデッドロック検出機構をつけ
プロセス P をそれに対応させることでデッド
ロックを回避できるようにすること
©2015 PRINCIPIA Limited
31
抽象状態と継承
抽象状態は点線枠で表される
抽象状態を作成し
共通の状態変数を
定義する
変更が容易になる
継承する状態を指定
継承した変数が表示される
©2015 PRINCIPIA Limited
個別に変数を
追加できる
32
抽象状態を使った MUTEX
イベントを切り替えることで
MUTEX0 と MUTEX1 になる
©2015 PRINCIPIA Limited
33
プロセス定義: MUTEX0, 1
(define-process MUTEX0
(LOCK P.lock0 P.unlock0 P.ret0
Q.lock0 Q.unlock0 Q.ret0))
(define-process MUTEX1
(LOCK P.lock1 P.unlock1 P.ret1
Q.lock1 Q.unlock1 Q.ret1))
©2015 PRINCIPIA Limited
34
並行合成
(define X
(list P.lock0
P.lock1
Q.lock0
Q.lock1
P.unlock0
P.unlock1
Q.unlock0
Q.unlock1
P.ret0
P.ret1
Q.ret0
Q.ret1))
(define-process SYSTEM
(par X
(par '() P Q)
(par '() MUTEX0 MUTEX1)))
©2015 PRINCIPIA Limited
P
Q
MUTEX0
MUTEX1
35
†
デッドロック検査
example-5-2-mutex-syscall.ss
©2015 PRINCIPIA Limited
36
デッドロックの検出
MUTEX0
(R0)
資源グラフ
R0
P
Q
R1
MUTEX1
(R1)
Q は R0 を所有
かつ R1 を要求中
P は R1 を所有
かつ R0 を要求中
©2015 PRINCIPIA Limited
この2つの状態に同時にいると
37
デッドロック
デッドロックの検出
MUTEX0
(R0)
資源グラフ
R0
P
Q
R1
MUTEX1
(R1)
©2015 PRINCIPIA Limited
逆順のケース
38
プロセスが特定の状態にいることを
観測する方法
出入りイベントを
観測する
状態にいることを
知らせるイベントを
追加して観測する
©2015 PRINCIPIA Limited
39
状態観測用イベントを追加
©2015 PRINCIPIA Limited
40
"同時"にいることの観測
MUTEX0
対応する2つの遷移に
同じイベントを指定し
同期させて観測する
(マルチ同期)
MUTEX1
©2015 PRINCIPIA Limited
41
デッドロック検出機構: MUTEX
(define-event detected0)
(define-event detected1)
観測用イベント定義
(define-process MUTEX0
(LOCK P.lock0 P.unlock0 P.ret0
Q.lock0 Q.unlock0 Q.ret0
detected0 detected1))
(define-process MUTEX1
(LOCK P.lock1 P.unlock1 P.ret1
Q.lock1 Q.unlock1 Q.ret1
detected1 detected0))
©2015 PRINCIPIA Limited
逆順
42
デッドロック検出機構: SYSTEM
(define X
(list P.lock0 P.unlock0 P.ret0
P.lock1 P.unlock1 P.ret1
Q.lock0 Q.unlock0 Q.ret0
Q.lock1 Q.unlock1 Q.ret1
detected0 detected1))
MUTEX‒P 間で同期
(define-process SYSTEM
(par X
MUTEX0−1 間で同期
(par '() P Q)
(par (list detected0 detected1)
MUTEX0 MUTEX1)))
©2015 PRINCIPIA Limited
43
デッドロック検出機構: P
©2015 PRINCIPIA Limited
44
†
デッドロック検査・計算木
example-5-3-dldetect.ss
©2015 PRINCIPIA Limited
45
デッドロック検査まとめ
●
デッドロック検査
–
デッドロックが存在しないことを確認できる
–
初期状態からデッドロック状態への最短パス
がわかる
©2015 PRINCIPIA Limited
46
デッドロック検査まとめ
●
ミューテックスのモデル
●
2リソース問題
–
●
デッドロックを避けるにはロックの獲得順序
を統一する
システムコールのモデル
–
呼び出しとリターンを表すイベントを導入
©2015 PRINCIPIA Limited
47
デッドロック検査まとめ
●
抽象状態と継承
–
●
●
状態変数の定義を集中してメンテナンスしやすくする
プロセスが特定の状態にいることを観測する
–
出入りイベントを観測する
–
状態にいることを通知するイベントを導入し観測する
複数のプロセスがそれぞれ特定の状態に同時にい
ることを観測する
–
マルチ同期を使用する
©2015 PRINCIPIA Limited
48