デッドロックとは?複数のプロセスが互いに待ち続けて永久に進めない状態

公開: 更新: カテゴリ: テクノロジ系

30秒で結論

デッドロックとは(全体像)

デッドロックは、お互いが相手の持っているものを待ち合って、どちらも先に進めなくなる状態のこと。たとえば、AがBの持つ鍵を待ち、BがAの持つ鍵を待つと、両方とも永久に動けない。

身近にたとえると、狭い道での対向車のすれ違い失敗だ。お互いに「そっちが先に下がって」と思い続けると、どちらも動けず止まったまま。これがデッドロックだ。

押さえるのは、デッドロックはバグではなく、正常なプログラムでも起こりうる並行処理の問題だということ。だから、設計のときに回避策を組み込むのが本質的な対策になる。


詳しく:コフマンの4条件と3つの対策だけ覚えれば戦える

ここが記事の心臓部。デッドロックが起きるには、コフマンの4条件がすべてそろう必要があります。

コフマンの4条件(すべてそろうと発生)

条件意味
相互排他1つの資源は1プロセスだけが占有でき、共有できない
保持と待機資源を持ったまま、別の資源も待つ
非横取り持っている資源を強制的に取り上げられない
循環待ち待ちの関係が輪になっている(A→B→C→A)

ここで一番のひっかけが、「4条件のどれか1つでデッドロックが起きる」という誤解。正しくは、4つすべてがそろって初めて発生します。逆に言えば、どれか1つを崩せば防げるということです。

次に、対策は大きく3系統あります。

デッドロックの3つの対策

対策内容代表
予防4条件のどれか1つを崩す資源をまとめて取る・順序を決めて取る
回避危ない状態にならないよう動的に判断銀行家アルゴリズム
検出と回復起きてから見つけて直す資源の関係図で見つけ、強制終了で解消

予防は、たとえば「資源を順番どおりに取る」というルールで循環待ちを崩す、現実的でよく使われる方法。回避は、危険な状態に近づかないよう毎回判断する方法で、代表が銀行家アルゴリズムです。検出と回復は、起きてしまったら見つけて、プロセスを強制終了するなどして解消します。

なお、デッドロックの有名な例題に「食事する哲学者問題」があります。

わかりやすく言い換えると

要するに、狭い道のたとえで覚えるとラクです。

4条件 … 相互排他・保持と待機・非横取り・循環待ち。全部そろうと発生(1つ崩せば防げる)

予防 … 一方通行ルールを作る(順序を決めて資源を取る)

回避と検出回復 … 通行管理員(銀行家アルゴリズム)/警察を呼んで強制移動(検出と回復)

つまり、「4条件は全部そろって発生」「対策は予防・回避・検出回復」、この2点が試験の急所です。


試験のツボ

🔴 一番出る:コフマンの4条件はすべて必要

①相互排他・保持と待機・非横取り・循環待ちの4つ

②4つすべてそろって発生(1つでも崩せば防げる)

🔴 次に出る:対策の3系統

①予防(条件を1つ崩す)/回避(安全な状態を保つ・銀行家アルゴリズム)

②検出と回復(起きてから見つけて強制終了などで解消)

🟡 押さえると安定:性質と例題

①デッドロックはバグではなく、正常なプログラムでも起こる並行処理の問題

②有名な例題は「食事する哲学者問題」


よくある間違い

「4条件のどれか1つでデッドロックが起きる」→ ✗  4つすべてそろって初めて発生する。1つでも崩せば防げる。

「デッドロックはプログラムのバグである」→ ✗  正常な並行プログラムでも起こりうる現象。設計で回避策を組み込むのが対策。

「銀行家アルゴリズムは検出と回復の手法である」→ ✗  銀行家アルゴリズムは「回避」の手法。安全な状態を保つように資源を割り当てる。


試験での出題パターン

実際の問題でたしかめてみよう。

オリジナル問題1(コフマンの4条件)

📝 オリジナル問題 1 コフマンの4条件

デッドロックのコフマンの4条件に関する次の記述のうち、正しいものはどれか。

  1. 4条件はそろう必要がなく、どれか1つを満たした時点でデッドロックが起きるとされている
  2. 相互排他・保持と待機・非横取り・循環待ちの4条件がすべてそろうとデッドロックが起きる
  3. コフマンの4条件はすべて満たしてもデッドロックは起きず、別の原因で発生するとされている
  4. コフマンの4条件は紙に印刷する手順のことで、デッドロックとは無関係なものとされている
テクマスター
テクマスター 解答・解説

解答は 2 ですよ。

相互排他・保持と待機・非横取り・循環待ちの4条件がすべてそろうとデッドロックが起きますね。逆に1つでも崩せば防げます。

選択肢1の「1つで起きる」、選択肢3の「満たしても起きない」、選択肢4の「印刷する手順」はどれも誤りですよ。

選択肢判定理由
14条件すべて必要
24条件がそろうと発生
3すべて満たすと発生する
4印刷する手順ではない

オリジナル問題2(対策の3系統)

📝 オリジナル問題 2 デッドロックの対策

デッドロックの対策に関する次の記述のうち、正しいものはどれか。

  1. 対策は予防の1種類しかなく、回避や検出と回復といった手法は存在しないものとされている
  2. 銀行家アルゴリズムは予防の手法で、4条件をすべて同時に強める方法とされているものだ
  3. 対策には予防・回避・検出と回復があり、回避の代表が銀行家アルゴリズムだとされている
  4. デッドロックの対策は紙に印刷する手順のことで、プログラムとは無関係なものとされている
テクマスター
テクマスター 解答・解説

解答は 3 ですよ。

対策には予防・回避・検出と回復があり、回避の代表が銀行家アルゴリズムですね。予防は条件を1つ崩す、検出と回復は起きてから直す方法です。

選択肢1の「予防だけ」、選択肢2の「銀行家は予防」、選択肢4の「印刷する手順」はどれも誤りですよ。

選択肢判定理由
1予防・回避・検出回復の3系統
2銀行家アルゴリズムは回避の手法
33系統あり回避が銀行家アルゴリズム
4印刷する手順ではない

オリジナル問題3(デッドロックの性質)

📝 オリジナル問題 3 デッドロックの性質

デッドロックの性質に関する次の記述のうち、正しいものはどれか。

  1. デッドロックは紙に印刷する装置のことで、プロセスの待ち合いとは無関係なものとされる
  2. デッドロックはハードウェアの電源装置の一種で、並行処理には関係しないものとされている
  3. デッドロックは必ずプログラムのバグが原因で、正常なプログラムでは決して起きないとされる
  4. デッドロックは複数のプロセスが互いに資源を待ち合い、永久に先へ進めなくなる状態である
テクマスター
テクマスター 解答・解説

解答は 4 ですよ。

デッドロックは複数のプロセスが互いに資源を待ち合い、永久に進めなくなる状態ですね。正常な並行プログラムでも起こりうる現象です。

選択肢1の「印刷する装置」、選択肢2の「電源装置」、選択肢3の「必ずバグが原因」はどれも誤りですよ。

選択肢判定理由
1印刷する装置ではない
2電源装置ではない
3正常なプログラムでも起こる
4互いに待ち合い進めない状態

まとめ

押さえどころ

次に学ぶ


執筆: SikakuQuest編集部

勉強は、クエストになった。

資格の勉強を、冒険に変えるRPG学習アプリ

App Storeで見る