デッドロックと排他制御

luagate/deadlock-introデッドロック入門25データベース・SQL

上から下へ、全 25 枚そのまま並べています。

発表モードで開く

デッドロック入門

デッドロックと排他制御

資源の取り合いを防ぐ 〜にらみ合いの解消〜

1
1

目次

今日の流れ

1. 資源を同時に使う問題

2. 排他制御とロック

3. デッドロックとは

4. 発生する4条件と対策

5. まとめと振り返り

2
2
デッドロック入門 - イントロ

今日のゴール

この時間で身につけてほしいことです。

  • 資源の取り合いで起きる問題が分かる
  • 排他制御とロックの役割が分かる
  • デッドロックの仕組みをイメージできる
  • 発生する4つの条件を説明できる
  • 予防と回避の考え方が分かる
10
3
デッドロック入門 - イントロ

資源を同時に使う問題

1つの資源を複数の処理が同時に触ると、内容が壊れたり食い違ったりします。

  • プリンタや残高など共有する資源がある
  • 2つの処理が同時に書き込むと結果が壊れる
  • 片方の更新がもう片方に上書きされる
  • 順番が前後すると意図しない値になる
  • だから同時利用を整理する仕組みが要る
11
4
デッドロック入門 - イントロ

排他制御 とは

共有する資源を、一度に1つの処理だけが使えるように調整する仕組みです。

排他制御(Mutual Exclusion)

複数の処理が同じ資源を取り合わないよう、使用中は他の処理を待たせる仕組み。トイレの個室に鍵をかけて、使っている間は他の人が入れないようにするのに似ている。

共有資源を一度に1つの処理だけに使わせる

使用中は他の処理を待たせる

資源の整合性を守る

代表的な道具がロック

12
5
デッドロック入門 - イントロ

ロック とは

資源に付ける鍵のようなものです。鍵を持つ処理だけがその資源を使えます。

ロック(Lock)

資源を使う前に取得し、使い終えたら解放する鍵のような印。鍵を持つ処理だけが資源を操作でき、他の処理は解放されるまで待つ。

資源を使う前にロックを取得する

使い終えたら必ず解放する

鍵を持つ処理だけが操作できる

解放を忘れると他が待ち続ける

以前学んだトランザクションのロックと同じ考え方

13
6

デッドロック入門 - 競合

2

第2部 取り合いが招くにらみ合い

競合状態とデッドロック

20
7
デッドロック入門 - 競合

競合状態 とは

複数の処理が同じ資源に同時に触れて、結果が実行の順番に左右される状態です。

競合状態(Race Condition)

複数の処理が同じ資源を同時に読み書きし、どちらが先かによって結果が変わってしまう状態。残高を2人が同時に引き出すと、合計が合わなくなることがある。

同じ資源を同時に読み書きする

実行順で結果が変わる

残高や在庫の数がずれる

ロックで順番を整理して防ぐ

21
8
デッドロック入門 - 競合

デッドロック とは

お互いが相手の持つ資源を待ち合い、どちらも進めなくなる膠着状態です。

デッドロック(Deadlock)

2つ以上の処理が、互いに相手が持つ資源の解放を待ち続けて、誰も先に進めなくなる状態。狭い道で2台の車が譲らずに止まってしまうのに似ている。

互いに相手の資源を待つ

誰もロックを解放できない

全員が永遠に止まる

放置すると処理が固まったまま

22
9
デッドロック入門 - 競合

にらみ合いのイメージ

AはBの持つ資源を、BはAの持つ資源を待っています。どちらも譲らず止まります。

  • 処理Aは資源1を持ち資源2を待つ
  • 処理Bは資源2を持ち資源1を待つ
  • お互いが相手の解放を待ち合う
  • 待ちの輪が閉じて動けなくなる
  • これがデッドロックの典型形
23
10
デッドロック入門 - 競合

順調な処理とデッドロック

資源を取る順番が揃っていれば進み、ばらばらだと止まることがあります。

順調に進む

  • 資源を同じ順番で取る
  • 片方が終われば次が取れる
  • ロックが順に解放される
  • 処理が前に進む

デッドロック

  • 資源を逆の順番で取り合う
  • 互いに相手を待ち続ける
  • ロックが解放されない
  • どちらも止まったまま
24
11

デッドロック入門 - 4条件

3

第3部 発生する4条件

そろうとデッドロックになる

30
12
デッドロック入門 - 4条件

デッドロックの4条件(前半)

次の4つがすべてそろうとデッドロックが起こり得ます。まず前半の2つです。

相互排他
  • 資源は一度に1つの処理だけ
  • 共有できない使い方をする
保持と待機
  • 資源を持ったまま別の資源を待つ
  • 手放さずに次を欲しがる
31
13
デッドロック入門 - 4条件

デッドロックの4条件(後半)

残りの2つです。4つすべてがそろって初めてデッドロックになります。

横取り不可
  • 持っている資源を奪えない
  • 本人が解放するまで待つ
循環待ち
  • 待ちの関係が輪になる
  • AはBを、BはAを待つ
32
14
デッドロック入門 - 4条件

4条件のまとめ

4つの条件と、その意味を一覧にしました。どれか1つを崩せば防げます。

意味

相互排他

資源を一度に1つの処理だけが使う

保持と待機

資源を持ったまま別の資源を待つ

横取り不可

他の処理の資源を奪い取れない

循環待ち

待ちの関係が輪になっている

33
15
デッドロック入門 - 4条件

食事する哲学者(たとえ)

デッドロックを説明する有名なたとえ話です。フォークの取り合いで全員が止まります。

食事する哲学者の問題

円卓に座る哲学者たちが、左右のフォークを2本そろえないと食べられない。全員が同時に左のフォークを取ると、右のフォークが永遠に空かず全員が止まる。

フォークが共有資源にあたる

全員が片方を持って片方を待つ

待ちの輪が閉じて誰も食べられない

資源の取り合いが招く膠着の例

34
16

デッドロック入門 - 対策

4

第4部 対策のしかた

予防・回避・検出・回復

40
17
デッドロック入門 - 対策

対策の4つの考え方

デッドロックへの向き合い方は、大きく4つに整理できます。

予防
  • 4条件のどれかを崩す
  • そもそも起きない設計にする
回避
  • 危険な状態に進ませない
  • 資源を渡す前に安全か判断
検出と回復
  • 起きたら見つける
  • 処理を止めて立て直す
無視
  • まれなら割り切ることも
  • 起きたら再起動で対処
41
18
デッドロック入門 - 対策

予防の代表例(取得順をそろえる)

資源を取る順番を全処理で統一すると、循環待ちが起きず予防できます。

全員が同じ順番で資源を取る
循環待ちの輪が作れなくなる
片方が先に2つ取って進む
解放されて次が取れる
42
19
デッドロック入門 - 対策

検出と回復の流れ

起きてしまった場合は、見つけて、止めて、立て直す、という流れで対処します。

1. 検出

待ちの輪ができていないか調べる

2. 選ぶ

止める処理を1つ決める

3. 中断

その処理を止めて資源を解放

4. 回復

あとでやり直して立て直す

43
20
デッドロック入門 - 対策

待ち時間の比較(イメージ)

対策をすると、止まったまま待ち続ける時間を大きく減らせます。あくまでイメージです。

60 待ち時間(イメージ)483624120
60待ち時間(イメージ)
12待ち時間(イメージ)
3待ち時間(イメージ)
対策なし
検出と回復
予防あり

出典: 対策の有無による待ち時間の傾向を示す概念図(概算)

44
21
デッドロック入門 - まとめ
クイズ

振り返りクイズ

今日の内容を確認しましょう。

デッドロックが発生する4条件にあてはまらないものはどれ?

A
相互排他
B
循環待ち
C
横取り不可
D
通信の暗号化
50
22
デッドロック入門 - まとめ
答え

振り返りクイズ 解答

デッドロックが発生する4条件にあてはまらないものはどれ?

A
相互排他
B
循環待ち
C
横取り不可
D
通信の暗号化

デッドロックの4条件は相互排他・保持と待機・横取り不可・循環待ちです。通信の暗号化は関係ありません。この4つのうちどれか1つを崩せばデッドロックは防げます。

51
23
デッドロック入門 - まとめ

質疑・次回予告

今日のまとめと、次に学ぶテーマです。質問があればここで受け付けます。

今日のおさらい
  • 排他制御で資源の取り合いを整理する
  • デッドロックは互いの待ち合い
  • 4条件のどれかを崩せば防げる
次回予告
  • Linuxとコマンドラインの基礎
  • 黒い画面に慣れる 〜サーバの共通語〜
52
24
"

排他制御は資源の取り合いを整理する交通整理。やり方を誤ると、互いに譲らずにらみ合うデッドロックが生まれる。4つの条件のどれか1つを崩せば、にらみ合いは解けます。

デッドロック入門

53
25