13 デッドロック - 九州大学(kyushu...
TRANSCRIPT
13 デッドロック
1
デッドロックとは? 暗礁! にっちもさっちもいかなくなった状態
2
・・・
図8.1 川の横断
・・・
図8.2 川の横断中に発生するデッドロック状態
デッドロックの防止
何か約束事(プロトコル)を決めないといけない. (例) 河を渡っている人数を1人にする. ↓ 河を渡る時に,横断中の人数を知る.
決定すべき事項 横断中の検知機構 同時に2人が渡りたい場合は,どうするか? 1人の決定 優先度
飢餓状態(starvation)の回避
3
システムモデル
資源の構成要素 資源の型
プロセッサ,メモリ,ファイル,入出力装置(プリンタ,CDなど)
実体 同一型内の数
– 例:プロセッサ3台,プリンタ2台,...
資源の使用順序 要求 使用 解放
資源の要求,解放はシステムコール ファイルのオープン,クローズ
4
デッドロックの性質
デッドロックであるための必要条件
以下の4つを全て満たしていると,システムはデッドロック状態になっている.
1)相互排除(mutual exclusion) 少なくとも1つの資源が非共有モードで確保されなけばならない.
一度に1つのプロセスのみが,その資源を使用できる.
2)確保と待機 以下の状態のプロセスが少なくとも1つは存在する.
– 少なくとも1つの資源を確保し,かつ他のプロセスが確保している資源を獲得しようとしている.
3)横取り不能 資源の横取りは不可能
4)循環待機 待機待資源が循環している.
{p0, p1, p2, …., pn}
Pi: プロセス
P0は,p1が確保している資源を待つ
注意:必要条件2)確保と待機は,必要条件4)循環待機に含まれる.
5
資源割当てグラフ(1/2)
6
プロセスと資源からなる有向グラフ
図8.3 プロセスと資源からなる有向グラフ
p1 p2 p3
r1 r3
r2
r4
資源 プロセス
資源割当てグラフ(2/2)
7
循環の存在は,デッドロックが生じているための必要条件 十分条件ではない.
p1 p2 p3
r1 r3
r2
r4
図8.4 デッドロックが存在する資源割当グラフ
r2
r1
p1
p2
p3
p4
図8.5 循環はあるが,デッドロックは存在しない資源割当グラフ
デッドロック処理技法
デッドロックに対する対処
種類
1)デッドロックにならないことを保証する.
1-1)デッドロック防止
1-2)デッドロック回避
2)デッドロックからの回復
8
デッドロック防止
必要条件の少なくとも1つが成立しないことを保証
1)相互排除
2)確保と待機
3)横取り不能
4)循環待機
不成立させることの可能性を考察
9
1)相互排除について
すべての資源を非共有にできるか?(相互排除しないようにできるか?)
非共有:複数プロセスからの同時アクセスを許す.
(例)
読出し専用ファイル
非共有OK
読書きファイル
非共有できない!
全ての資源を非相互排除的アクセスにすることは不可能!
10
2)確保と待機について(1/2) (確保と待機)必要条件を不成立にする方法
確保と待機が同時に生じないようにする.
1)待機が生じないようにする.
各プロセスが実行中に必要な資源を,実行前にあらかじめ全て確保しておくこと.
2)待機の時,確保していないようにする.
実行中に資源を要求するときは,確保している資源を解放した後で資源を要求する.
(例)
データのソーティング
1)カードリーダ → ディスクファイルへのコピー
2)ディスクファイル内のデータのソーティング
3)ソーティング結果をプリンタに出力
4)磁気テープにコピー
方法:1)待機が生じないようにする.
実行前に,ハードウェアローダ,ディスクファイル,プリンタ,磁気テープ装置を全て確保する.
方法:2)待機の時,確保していないようにする.
最初:カードリーダとディスクファイル,の確保
次: カードリーダ,ディスクファイル,を解放
ディスクファイル,プリンタ,の確保
最後:ディスクファイル,プリンタ,の解放
ディスクファイル,磁気テープ装置の確保
11
2)確保と待機について(2/2)
欠点
方法:1)待機が生じないようにする.
資源の使用効率が低下する.
あまり使わないのに最初から確保
飢餓状態が発生する可能性大
全ての資源が最初に確保できないと実行できない.
方法:2)待機の時,確保していないようにする.
プロセスの実行が非効率
実行中,常時使用する資源でも,他の資源を要求する度に,
解放,確保しなければならない.
解放,確保はシステムコール
12
3)横取り不能について
3)横取り不能,を生じさせないようにする.
資源の横取りを可能にする.
方法1: 確保できないときは,確保した資源も解放する.
要求した資源を確保できない時,今まで確保している
資源を解放して,他プロセスからの横取りを許す.
方法2: 確保できない時,(可能ならば)欲しい資源を無
理やり確保する.
可能ならば:
欲しい資源を他プロセス(プロセスP)が確保しているが,そ
のプロセスPが別の資源を確保できないため待機中になっ
ている場合,プロセスPが確保している資源(欲しい資源)を
横取りして確保する.
13
4)循環待機について
循環待機にならないことを保証する.
↓
資源を順序付けて管理する.
順序付け関数:F
F(カードリーダ)=1
F(ディスク装置)=5
F(テープ装置)=7
F(プリンタ)=12
方法: 資源 i を要求する時,
F(j)≧F(i) なる資源 j を解放した後,資源 i を要求する.
関数Fの決め方
通常の使用順序に従って決定
F(カードリーダ) < F(プリンタ)
14
デッドロックの回避
デッドロック防止の問題点
装置の使用率,スループット
↓
低下!
デッドロックの回避
時々刻々変化する状態をみて,制御する.
15
デッドロックの回避:イメージ:例題(1/2)
プロセス(3つ):P0, P1,,P2
磁気テープ:12台
最大磁気テープ要求数
16
プロセス 最大要求数
P0 10台
P1 4台
P2 9台
プロセス 最大要求数 現在の割当数 不足数
P0 10 5 5
P1 4 2 2
P2 9 2 7
時刻T0の状態
3台空き
今後の割当をうまく制御すれば,デッドロックにはならない.
デッドロックの回避:イメージ:例題(2/2)
17
プロセス 割当許可数 空き装置数
P1 2 1
↓
P1 解放 5
↓
P0 5 0
↓
P0 解放 10
↓
P2 7 3
OK!
P1, P0, P2の順に割当て要求を満たしてやる. 時刻T0の状態は安全な状態
割当制御方法
プロセス 最大要求数
P0 10台
P1 4台
P2 9台
デッドロック回避の方法
18
負荷情報を利用して,いつも安全な状態になるように制御する. 負荷情報: 最大要求数
安全な状態とは?
安全な順序が存在する状態
安全な順序とは? プロセスの順序<P0,P1,…Pn>が次の条件を満たすとき,現在の状態に対して安全な順序である.
任意のi (0 ≦i ≦ n)に対して, Pi がまだ要求できる数 ≧ 空き数 + ∑ (Pj が確保している数)
割当方法
P0, P1, ..., Pn の順に割当要求を許可する.
防止と回避の違い
19
防止: 強い安全策 必要条件を不成立にするよう制御
回避: 弱い制御
様子をみて制御
デッドロック 不安全
安全
図8.6 安全,不安全およびデッドロック状態空間
銀行家アルゴリズム(banker’s algorithm)
20
デッドロック回避アルゴリズム プロセス数 =n 資源タイプ数 = m
データ構造 Availabe
利用可能数(空き数)を表すベクトル(長さ:m) Avalable[j] = k: 資源タイプ rj の利用可能数がk(k個空いている)
Max 各プロセスの最大要求数 Max[i, j ] = k : プロセスpi が資源タイプ rj に要求する最大数がk
Allocation 各プロセスに現在割り当てられている数 Allocation[i , j] = k : プロセス pi に資源タイプ rj がk個割当てられている.
Need 不足数 Need[i, j] = k : プロセス pi に資源タイプ rj がk個不足している.
Need[i, j] = Max[i, j] - Allocation[i, j]
銀行家アルゴリズムー表記法ー
21
表記法 Need(i):
= ( Need[i, 0], Need[i, 1], ..., Need[i, m], )
Allocation(i)も同じ
X, Y :長さnのベクトル
X ≧ Y : すべてのi( 0≦i ≦n)に対して,X[i] ≧ Y[i] X > Y: X ≧ Y ,かつ X≠Y
銀行家アルゴリズムーアルゴリズム概要ー
22
プロセスpiが資源タイプrjの割り当てを要求したとき,その割当を許可するか否か?
要求数: Request[i, j] 要求ベクトルをRequest(i)とする.
①Request(i) ≦ Need(i)ならば②へ. そうでない場合は,誤り(宣言した数以上の数を要求したから)
②Request(i) ≦ Available ならば③へ
そうでない場合は,pi を待たせる(許可しない) (資源が利用できないから
③次の状態に更新する.
Available := Available - Request(i) ; Allocation(i) := Allocation(i) + Request(i) ; Need(i) := Need(i) - Request(i) ;
割り当てた結果が安全な状態であれば,pi に資源を割り当てる. 〃 でなければ,pi を待たせて,状態(変数の値)を元に戻す.
安全アルゴリズム ー安全な状態かどうかを判定するアルゴリズムー
23
①Work, Finish: それぞれ長さm,nのベクトル 初期化: Work := Available ; Finish[i] := false; 全てのi
②次を満たすi を(1つ)見つける.
a) Finish[i] := false,かつ b) Need(i) ≦ Work なければ,④へ.
③ Work := Work + Allocation(i) ; Finish[i] := true ; ②へ. (上記③が意味するもの:プロセスiに残りの要求数を割り当てることができたら,プロセスiは最大数を確保できるから,プロセスiは最後まで実行することができる.その後,いずれプロセスiは実行を終了し,確保した資源を解放して,workに戻すことになる.) ④全てのiに対してFinish[i] = true ならば,システムは安全な状態である.
銀行家アルゴリズム:例題(1/3)
24
プロセス(5つ): p0, p1, …., p4 資源タイプ(3つ): A, B, C: A: 10個,B: 5個,C:7個
Allocation Max Available
プロセス ABC ABC ABC
P0 010 753 332
P1 200 322
P2 302 902
P3 211 222
p4 002 433
時刻T0の状態
行列Needの内容は, Max-Allocationで定義され,右の表のようになる.
Need
プロセス ABC
P0 743
P1 122
P2 600
P3 011
p4 431
銀行家アルゴリズム:例題(2/3)
25
時刻T0での状態は,安全な状態である 安全な順序
<p1, p3, p4, p2, p0>.
銀行家アルゴリズム:例題(3/3)
26
時刻T0後,プロセスp1がAを1個,Cを2個要求するとする.この要求を許可してよいか? 上記をチェックする. ①Request(i) ≦ Need(i)ならば②へ.
そうでない場合は,誤り(宣言した数以上の数を要求したから) (チェック):Request(1) = ( 1, 0, 2),Need(1) = ( 7, 4, 3)で,OKなので,②へ
②Request(i) ≦ Available ならば③へ そうでない場合は,pi を待たせる(許可しない) (資源が利用できないから) (チェック):Request(1) = ( 1, 0, 2),Available = ( 3, 3, 2)で,OKなので,③へ
③次の状態に更新する. Available := Available - Request(i) ; Allocation(i) := Allocation(i) + Request(i) ; Need(i) := Need(i) - Request(i) ;
Allocation Max Available
プロセス ABC ABC ABC
P0 010 743 230
P1 302 020
P2 302 600
P3 211 011
p4 002 431
更新した状態(右の状態)が安全な状態かどうかをチェックする.
安全アルゴリズムでチェックした結果,OK(安全な状態)(詳細は,省略)
以上
27