デッドロックとは(全体像)
デッドロックは、お互いが相手の持っているものを待ち合って、どちらも先に進めなくなる状態のこと。たとえば、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条件)
デッドロックのコフマンの4条件に関する次の記述のうち、正しいものはどれか。
- 4条件はそろう必要がなく、どれか1つを満たした時点でデッドロックが起きるとされている
- 相互排他・保持と待機・非横取り・循環待ちの4条件がすべてそろうとデッドロックが起きる
- コフマンの4条件はすべて満たしてもデッドロックは起きず、別の原因で発生するとされている
- コフマンの4条件は紙に印刷する手順のことで、デッドロックとは無関係なものとされている
解答は 2 ですよ。
相互排他・保持と待機・非横取り・循環待ちの4条件がすべてそろうとデッドロックが起きますね。逆に1つでも崩せば防げます。
選択肢1の「1つで起きる」、選択肢3の「満たしても起きない」、選択肢4の「印刷する手順」はどれも誤りですよ。
| 選択肢 | 判定 | 理由 |
|---|---|---|
| 1 | ✗ | 4条件すべて必要 |
| 2 | ✓ | 4条件がそろうと発生 |
| 3 | ✗ | すべて満たすと発生する |
| 4 | ✗ | 印刷する手順ではない |
オリジナル問題2(対策の3系統)
デッドロックの対策に関する次の記述のうち、正しいものはどれか。
- 対策は予防の1種類しかなく、回避や検出と回復といった手法は存在しないものとされている
- 銀行家アルゴリズムは予防の手法で、4条件をすべて同時に強める方法とされているものだ
- 対策には予防・回避・検出と回復があり、回避の代表が銀行家アルゴリズムだとされている
- デッドロックの対策は紙に印刷する手順のことで、プログラムとは無関係なものとされている
解答は 3 ですよ。
対策には予防・回避・検出と回復があり、回避の代表が銀行家アルゴリズムですね。予防は条件を1つ崩す、検出と回復は起きてから直す方法です。
選択肢1の「予防だけ」、選択肢2の「銀行家は予防」、選択肢4の「印刷する手順」はどれも誤りですよ。
| 選択肢 | 判定 | 理由 |
|---|---|---|
| 1 | ✗ | 予防・回避・検出回復の3系統 |
| 2 | ✗ | 銀行家アルゴリズムは回避の手法 |
| 3 | ✓ | 3系統あり回避が銀行家アルゴリズム |
| 4 | ✗ | 印刷する手順ではない |
オリジナル問題3(デッドロックの性質)
デッドロックの性質に関する次の記述のうち、正しいものはどれか。
- デッドロックは紙に印刷する装置のことで、プロセスの待ち合いとは無関係なものとされる
- デッドロックはハードウェアの電源装置の一種で、並行処理には関係しないものとされている
- デッドロックは必ずプログラムのバグが原因で、正常なプログラムでは決して起きないとされる
- デッドロックは複数のプロセスが互いに資源を待ち合い、永久に先へ進めなくなる状態である
解答は 4 ですよ。
デッドロックは複数のプロセスが互いに資源を待ち合い、永久に進めなくなる状態ですね。正常な並行プログラムでも起こりうる現象です。
選択肢1の「印刷する装置」、選択肢2の「電源装置」、選択肢3の「必ずバグが原因」はどれも誤りですよ。
| 選択肢 | 判定 | 理由 |
|---|---|---|
| 1 | ✗ | 印刷する装置ではない |
| 2 | ✗ | 電源装置ではない |
| 3 | ✗ | 正常なプログラムでも起こる |
| 4 | ✓ | 互いに待ち合い進めない状態 |
まとめ
押さえどころ
- 🔴 コフマンの4条件 = 相互排他・保持と待機・非横取り・循環待ち。4つすべてそろって発生(1つ崩せば防げる)。
- 🔴 対策の3系統 = 予防(条件を崩す)・回避(銀行家アルゴリズム)・検出と回復(見つけて解消)。
- 🟡 性質と例題 = デッドロックはバグではなく並行処理の問題。有名な例題は「食事する哲学者問題」。
次に学ぶ
- 同期(ミューテックス・セマフォ) ── デッドロックの土台になる、資源のロックと同期のしくみ。
- スレッド ── デッドロックが起こる、メモリを共有するスレッドのしくみ。
執筆: SikakuQuest編集部