対象試験と出題頻度

デッドロックは、基本情報技術者・応用情報技術者で出題されるテーマです。

OS分野のタスク管理やデータベース分野の排他制御(ロック)と絡めた出題が定番化しており、「発生条件の判定」と「防止策の選択」を正確に判断できるかが問われます。

詳細をクリックして確認
対象試験:
基本情報技術者
応用情報技術者
出題頻度:
★★★★☆
ランクA(重要)必ず覚えておくべき

用語の定義

情報処理試験を勉強していると、「デッドロックって結局どんな状態?ただのエラーとどう違うの?」と混乱しがちです。

デッドロック(Deadlock)とは、一言で言うと

 「複数のプロセスやトランザクションが、互いに相手が保持する資源の解放を待ち合い、どちらも先に進めなくなる状態

のことです。

イメージとしては、狭い一本道での対向車のすれ違いです。

車Aと車Bが狭い道の両端から進入してきて、真ん中で鉢合わせしたとします。どちらも「相手が下がってくれれば通れる」のに、お互い譲らず待ち続ける。結果として両方とも永遠に止まったまま。これがデッドロックです。

📊 デッドロックの基本情報

項目 内容
英語名 Deadlock
分野 OS(タスク管理)・データベース(トランザクション制御)
発生場面 排他制御を行う複数のプロセス間 / トランザクション間
対処方法 防止(資源の獲得順序を統一)、検出(待ちグラフ)、回復(ロールバック)

解説

OSやDBMSが複数の処理を並行実行する場面では、データの整合性を守るために排他制御が不可欠です。しかし、排他制御はデータを守る一方で、資源の取り合いという副作用を生みます。

この副作用が最悪の形で現れたものがデッドロックです。

デッドロックが起きる仕組み

具体的な例で流れを追います。プロセスAが資源Xを占有した状態で資源Yを要求し、同時にプロセスBが資源Yを占有した状態で資源Xを要求する。

この状況では、AはBがYを手放すのを待ち、BはAがXを手放すのを待ちます。どちらも相手の終了を待っているため、永久に待機状態が続きます。

デッドロック発生の流れ(時系列)

STEP 1

プロセスA 資源X を占有(ロック取得)

STEP 2

プロセスB 資源Y を占有(ロック取得)

STEP 3 ― 待ち発生

プロセスA 資源Y を要求 → Bが占有中のため待ち

STEP 4 ― 循環待ち成立

プロセスB 資源X を要求 → Aが占有中のため待ち

A は B の資源Y 解放を待ち、B は A の資源X 解放を待つ ― 双方が永久に停止

デッドロックの4つの成立条件(コフマン条件)

デッドロックは、以下の4条件がすべて同時に満たされたときに発生します。

これは1971年にコフマン(Coffman)らが整理した有名な条件です。

条件名 意味
相互排除 資源を同時に複数のプロセスが使えない(排他的に占有される)
保持と待機 資源を保持したまま、追加の資源を要求して待ち状態になる
横取り不可 他のプロセスが保持中の資源を強制的に奪えない
循環待ち プロセス間で資源の待ちが環状(A→B→…→A)になっている
なんとなくで覚えたい人向け:コフマン条件をざっくり理解

4条件を一言でまとめると「独占×抱え込み×奪えない×ぐるぐる」です。どれか1つでも崩せばデッドロックは起きません。試験では4条件そのものを問われることは稀ですが、「防止策がなぜ有効か」を理解する土台になります。

3つの対処アプローチ

デッドロックへの対処は、防止・検出・回復の3段階に分かれます。

アプローチ 具体的な方法 ポイント
防止 資源の獲得順序を全プロセスで統一する 循環待ちの条件を崩す方法。AP・FEで最も出題される
検出 待ちグラフ(資源割当てグラフ)で循環を監視する グラフに閉路(サイクル)があればデッドロック状態
回復 一方のプロセスを強制終了してロールバックする 犠牲にするプロセスの選択基準はDBMSの実装による

ライブロック・スタベーションとの違い

デッドロックと混同されやすい概念が2つあります。

用語 状態 デッドロックとの違い
ライブロック プロセスは動いているが、互いに譲り合い続けて実質進まない 待ち状態ではなく「動いているのに進まない」点が異なる
スタベーション 特定のプロセスだけが資源を永遠に獲得できない 全体が止まるのではなく「一部だけ飢餓状態になる」点が異なる

では、この用語が試験でどのように出題されるか見ていきましょう。

💡 デッドロックの核心を3行で

・複数のプロセスが互いに相手の持つ資源を待ち合い、全体が停止する状態
・4つの成立条件(コフマン条件)がすべて揃うと発生する
・防止の基本は「資源の獲得順序を統一する」こと


試験ではこう出る!

デッドロックは、FE・APの午前問題で繰り返し出題される定番テーマです。OS分野(タスク管理)とデータベース分野(トランザクション制御)の両方から出題されます。

出題パターンは大きく3つに分かれます。

📊 過去問での出題実績

試験回 出題内容 問われたポイント
AP R7秋
午前 問18
二つのタスクが共用する資源の排他制御でデッドロックの発生を防ぐ方法を選ぶ。 ・正解は「資源獲得の順序を両方のタスクで同じにする」
・優先度の変更はデッドロック防止に無効
AP R6春
午前 問17
4つのプロセスの資源占有順が示され、プロセスAとデッドロックを起こす可能性があるプロセスを選ぶ。 ・占有順序が異なるプロセスが危険
・同一順序ならデッドロックは発生しない
FE R1秋
午前 問29
2相ロッキングプロトコルに従う2つのトランザクションで、デッドロックが発生しない処理順序を選ぶ。 ・共有ロック・専有ロックの衝突判定
・資源取得順がX→Y→Zで統一されていればデッドロックは回避
AP H29春
午前 問29
2つのトランザクションがテーブルa, bを更新するとき、デッドロックとなる時点を選ぶ。 ・ロック取得の時系列を追跡し、循環待ちが成立する時点を特定
・正解は「双方がロック待ちになった瞬間」
FE H16春
午前 問69
DBMSにおけるデッドロックの説明として適切なものを選ぶ。 ・「互いにロック解除を待ち続ける」が正解
・2相ロック自体の説明やロック粒度の説明がひっかけ

📝 IPA試験での出題パターン

パターン1:「防止策を選べ」
「タスクの優先度を変える」「資源の獲得順序を統一する」「獲得順序を逆にする」「優先度を同じにする」の4択から正しい防止策を選ぶ形式。正解は「獲得順序を統一する」。ここだけは確実に押さえてください。AP R7秋 問18・AP R4秋 問16・AP H31春 問18で繰り返し出題されている。

 

パターン2:「デッドロックが発生する/しない組み合わせを選べ」
プロセスの資源占有順序が表で示され、デッドロックが起きるペアを判定する形式。コツは「2つのプロセスの資源獲得順に逆順が含まれているか」を確認すること。同一順序なら安全、逆順があれば危険。

 

パターン3:「デッドロックとなる時点を選べ」
トランザクションの処理順序が表で示され、何番目の処理でデッドロックが成立するかを問う形式。ロック取得の時系列を1行ずつ追跡し、「双方がロック待ちになった時点」を選ぶ。

 

試験ではここまででOKです。コフマン条件の名前が直接問われることはほぼないので、深追いは不要です。


【確認テスト】理解度チェック

ここまでの内容を理解できたか、簡単なクイズで確認してみましょう。


Q. 二つのタスクが共用する二つの資源を排他的に使用するとき、デッドロックの発生を防ぐ方法として最も適切なものはどれでしょうか?

  • A. 一方のタスクの優先度を高くする。
  • B. 資源獲得の順序を両方のタスクで同じにする。
  • C. 両方のタスクの優先度を同じにする。

正解と解説を見る

正解:B

解説:
資源の獲得順序を統一すると、先にロックを取得したタスクが順番に処理を完了し、もう一方はその完了を待ってから資源を取得するため、循環待ちが発生しません。これがデッドロック防止の基本手法です。

選択肢Aは誤りです。タスクの優先度を変えても、他方のタスクが保持している資源は強制的に解放されないため、循環待ちは解消されません。選択肢Cも同様に誤りです。優先度を揃えることと資源の獲得順序は無関係であり、デッドロックの防止にはつながりません。


よくある質問(FAQ)

Q. デッドロックが発生したらDBMSは自動的に解決してくれるのですか?

主要なRDBMS(Oracle、PostgreSQL、MySQLなど)にはデッドロック検出機能が組み込まれています。一定時間ごとに待ちグラフを走査し、循環を検出した場合は、片方のトランザクションを自動的にロールバック(取り消し)して解消します。どのトランザクションを犠牲にするかの基準はDBMS製品ごとに異なります。

Q. デッドロックはデータベースだけで起きる現象ですか?

いいえ。OSのタスク管理でも発生します。複数のプロセスがファイルやメモリ領域などの共有資源を排他的に使用する場面であれば、どこでも起こり得ます。IPA試験でもOS分野(タスク管理)とDB分野(トランザクション制御)の両方から出題されるため、「デッドロック=DB限定の話」と思い込まないことが重要です。

Q. 2相ロッキングプロトコルはデッドロックを防止できますか?

防止できません。2相ロッキングプロトコルは「直列可能性(トランザクションの実行結果が直列実行と同じになること)」を保証するための手法であり、デッドロックの防止は目的に含まれていません。FE R1秋 問29がまさにこの点を問う問題で、2相ロッキングに従ってもデッドロックが発生するケースと発生しないケースを見分ける力が求められました。

Q. 実務でデッドロックが起きたとき、開発者はどう対応しますか?

まずDBMSのエラーログからデッドロックの発生箇所(どのテーブル・どのSQL)を特定します。次に、関係するトランザクションのSQL実行順序を見直し、テーブルへのアクセス順をアプリケーション全体で統一するように修正します。また、トランザクションの粒度を小さくして保持時間を短縮する、不要なロックを避ける(SELECT時の不必要なFOR UPDATEを削除する)といった対策も有効です。