目次
はじめに
今回も、応用情報技術者試験の過去問を解いていきます。
今回は「デッドロック」に関する問題です。
一見シンプルですが、「資源の取得順序」がポイントになる重要問題です。
問題
三つの資源 X〜Z を占有して処理を行う四つのプロセス A〜D がある。
各プロセスは処理の進行に伴い、表中の数値の順に資源を占有し、実行終了時に三つの資源を一括して解放する。
プロセスAと同時にもう一つプロセスを動かした場合に、デッドロックを起こす可能性があるプロセスはどれか。
資源の占有順序
| プロセス | 資源X | 資源Y | 資源Z |
|---|---|---|---|
| A | 1 | 2 | 3 |
| B | 1 | 2 | 3 |
| C | 2 | 3 | 1 |
| D | 3 | 2 | 1 |
選択肢
- ア:B, C, D
- イ:C, D
- ウ:Cだけ
- エ:Dだけ
解答
イ:C, D
解説
■ まずは前提:資源の取得順序
各プロセスの取得順序を整理すると以下の通りです。
| プロセス | 取得順序 |
|---|---|
| A | X → Y → Z |
| B | X → Y → Z |
| C | Z → X → Y |
| D | Z → Y → X |
■ デッドロックの本質
デッドロックは以下の状態で発生します:
お互いに資源を持ったまま、相手の資源を待ち続ける状態
つまり、
- Aが「X」を持っている
- 相手が「Z」を持っている
- 互いに次の資源を待つ
こうなると詰みます。
■ Aと他プロセスの関係
● A × B
- 両方とも「X → Y → Z」
→ 順序が同じ
→ デッドロックにならない
● A × C
- A:X → Y → Z
- C:Z → X → Y
👉 パターン:
- AがYを取得(Xは既に所持)
- CがZを取得
このとき
- AはZ待ち
- CはX待ち
→ お互い待ち状態 → デッドロック発生
● A × D
- A:X → Y → Z
- D:Z → Y → X
👉 パターン:
- AがXを取得
- DがYを取得(Zは既に所持)
このとき
- AはY待ち
- DはX待ち
→ デッドロック発生
問題の用語解説
■ デッドロック(Deadlock)
複数のプロセスが互いに資源を待ち続け、処理が進まなくなる状態。
■ 資源の占有順序
プロセスがどの順番で資源を取得するか。
■ 循環待ち(Circular Wait)
A → B → C → A のように、待ちがループする状態。
👉 デッドロックの発生条件の一つ
体系的位置づけ
この問題は以下の分野に属します:
- テクノロジ系
- コンピュータシステム
- OS(オペレーティングシステム)
- タスク管理
- デッドロック
- 排他制御
- 同期制御
- タスク管理
- OS(オペレーティングシステム)
- コンピュータシステム
今回の問題の重要ポイント
✔ ポイント①:取得順序がすべて
- 同じ順序 → 安全
- 異なる順序 → 危険
✔ ポイント②:逆順は特に危険
- A:X→Y→Z
- D:Z→Y→X
👉 完全逆順=高確率でデッドロック
✔ ポイント③:循環待ちを見抜く
「Aはこれ待ち、相手はそれ待ち」
👉 この構造を意識する
まとめ
今回の問題はシンプルながら非常に重要です。
- デッドロックは「順序のズレ」で発生する
- 同じ順序なら安全
- 逆順・バラバラ順は危険
👉 試験では頻出テーマなので必ず理解しておくべきポイントです
補足:A、Bの組み合わせでデッドロックが起きない理由
■ 結論
AとBでデッドロックが起きない理由は:
資源の取得順序が完全に同じだから(循環待ちが発生しない)
- どちらかが先に進む
- 解放されたらもう一方が進む
という動きになりますが、それは「順序が同じ」ことの結果です。
■ もう少し具体的に
AとBの順序は:
- A:X → Y → Z
- B:X → Y → Z
● 典型的な動き
ケース①:Aが先にXを取る
- A:X取得
- B:X待ち(何も持っていない)
- A:Y → Z と進む
- A:全部解放
- B:実行開始
👉 待ちが一方向だけなので安全
■ なぜデッドロックにならないのか
デッドロックには「循環待ち」が必要です。
例えば危険なパターンは:
- A:Xを持ってY待ち
- B:Yを持ってX待ち
👉 これが「ループ(循環)」です
■ AとBではそれが起きない
AとBの場合:
- 両方とも「Xから」取りに行く
- つまり「最初の資源が同じ」
👉 結果:
- どちらか一方しかXを取れない
- もう一方は「何も持たずに待つ」
■ ここが超重要ポイント
👉 デッドロックは
「お互いに何かを持っている状態」でないと発生しない
■ AとBの状態
- A:Xを持っている
- B:何も持っていない(ただ待っている)
👉 片方が資源を持っていないので、詰み状態にならない
補足2:デッドロックの具体的説明
■ 例①:ファイルのロック
状況
2つのプログラムがファイルを使うとします
- プログラムA
- ファイル① → ファイル② の順で使う
- プログラムB
- ファイル② → ファイル① の順で使う
● 実際に起こること
- Aがファイル①をロック
- Bがファイル②をロック
ここで…
- A:ファイル②が欲しい(でもBが持ってる)
- B:ファイル①が欲しい(でもAが持ってる)
👉 完全に止まる(デッドロック)
■ 例②:データベース
これはかなりリアルです👇
● トランザクション
- 処理A:
- ユーザー情報更新 → 注文情報更新
- 処理B:
- 注文情報更新 → ユーザー情報更新
● 実際の事故
- Aがユーザー表ロック
- Bが注文表ロック
👉 その後
- A:注文表待ち
- B:ユーザー表待ち
👉 DBが固まる
■ 実際に起きるとどうなる?
- プログラムが止まる
- CPUは動いてるのに処理進まない
- サーバーが固まる
👉 本番環境で普通に事故になる
■ 実際の対策例
✔ 解決策(実務でやること)
① 順序を統一する
👉 全部「X→Y→Z」で取る
(今回のAとBの状態)
② タイムアウト
👉 一定時間待ったら諦める
③ 強制解除(OSがやる)
👉 どれかの処理を殺す
■ まとめ
- デッドロックは実際に起こる
- OS・DB・アプリ全部で発生する
- 原因は「資源取得順序の不一致」
- IPA 独立法人 情報処理推進機構 応用情報技術者試験 過去問 https://www.ipa.go.jp/shiken/mondai-kaiotu/index.html

コメント