応用情報技術者 2014年 秋期 午前2 問16
問題文
三つの資源X〜Zを占有して処理を行う四つのプロセスA〜Dがある。各プロセスは処理の進行に伴い、表中の数値の順に資源を占有し、実行終了時に三つの資源を一括して解放する。プロセスAとデッドロックを起こす可能性があるプロセスはどれか。

選択肢
ア:B, C, D
イ:C, D(正解)
ウ:Cだけ
エ:Dだけ
🔒 解説は解答すると表示されます
資源占有順序とデッドロック【午前2解説】
正解の理由
本問は、各プロセスが資源を占有する順序から「循環待ち(デッドロック)」が生じ得るかを判断する問題です。正しい選択は イ(プロセスCとD)です。
表から各プロセスの占有順序を読み替えると次の通りです。
- A: X → Y → Z
- B: X → Y → Z
- C: Z → X → Y (表の数値はX:2, Y:3, Z:1なのでZが1番目)
- D: Z → Y → X
AとCの具体的な相互作用を考えると、例えば次のように進行して循環待ちが発生します。
- AがまずXを占有(Aはその後Y, Zを順に要求する)。
- CがまずZを占有(Cはその後Xを要求する)。
- AがYを占有し、次にZを要求するがZはCが保持しているのでAは待ち状態。
- CはZを保持したまま次にXを要求するがXはAが保持しているのでCも待ち状態。
このときAはZを待ち、CはXを待つためA→Z→C→X→Aの循環待ちが成立します。
AとDの場合も同様に循環待ちが起こります。たとえば、
- AがXを占有。
- DがZを占有。
- AがYを占有し、次にZを要求するがZはDが保持しているのでAは待ち。
- DはZを保持したまま次にYを要求するがYはAが保持しているのでDも待ち。
このときAはZを待ち、DはYを待つためA→Z→D→Y→Aの循環が成立します。
一方BはAと同じ順序(X→Y→Z)で資源を取得するため、AとBの間では上のような循環待ちは発生しません(同一順序では資源間に逆向きの要求が生じず、循環が形成されないため)。
以上より、Aとデッドロックを起こす可能性があるのはCとD、つまり イ が正解です。
解法ステップ
- 表の数値を「占有順」に読み替える(数値1が最初に占有する資源)。
- 対象プロセス(ここではA)と他の各プロセスについて、それぞれの「先に占有する資源」と「後で要求する資源」を整理する。
- 循環待ちとなる典型パターンを探す:
- Aが先に占有している資源R1を、相手プロセスが後で要求する(相手がR1を待つ)。
- かつ相手プロセスが先に占有している資源R2を、Aが後で要求する(AがR2を待つ)。
- このような(AがR2を待ち、相手がR1を待つ)互いの待ちが成立すれば循環待ち。
- 上記を満たすプロセスをすべて選ぶ。
実務的には「各プロセスの資源順序から有向辺(占有中→要求中)を描き、閉路が存在するかを確認する」方法が抽象化として有効です。
選択肢別の誤答解説
-
ア: B, C, D
- 誤り。CとDは正しく含まれますが、BはAと同一順序(X→Y→Z)なのでAとBの間に循環待ちは発生しません。したがってBを含めるのは誤りです。
-
イ: C, D
- 正解。上で示したとおり、C(Z→X→Y)もD(Z→Y→X)もA(X→Y→Z)と互いに先に占有する資源と後で要求する資源が逆向きになり、循環待ちを作れます。
-
ウ: Cだけ
- 誤り。Cは確かにAとデッドロックを起こし得ますが、Dも同様に起こし得るためDを除外するのは不正確です。
-
エ: Dだけ
- 誤り。DはAとデッドロックを起こし得ますが、Cも同様に起こし得るためCを除外するのは不正確です。
よくある誤解
- 「数値をそのまま資源名と混同する」
- 表の数値は「占有順」を示します。例えばCのZが1であれば「CはまずZを占有する(Z→...)」です。順序の読み間違いで解釈が逆になることが多いので注意してください。
- 「同じ順序のプロセス同士でもデッドロックになる」
- 同一の総順序(全プロセスが同じ順で資源を要求)では循環待ちは発生しません。順序が一致する場合、要求の方向が揃うため閉路が作られません。
補足コラム
デッドロック(循環待ち)は一般に以下の4条件(Coffman条件)が同時に成立することで発生します:
- 相互排他(資源は同時に1つのプロセスだけが使用)
- 保持と待ち(資源を保持したまま他の資源を待つ)
- 非奪取(他のプロセスの資源を強制的に奪えない)
- 循環待ち(待ち関係が閉路を形成する)
本問は特に「循環待ち」が成立するかを判定する練習に適しています。実運用では資源に全体順序を設けることでデッドロックを予防することがよく行われます。
FAQ
Q. なぜ「AがXとYを保持してからZを要求する」ような中間状態を考えてよいのか?
A. 問題文に「実行終了時に三つの資源を一括して解放する」とあるため、取得した資源は処理の最後まで保持され続け、途中で解放されない前提で考えます。したがってAがXとYを保持したままZを要求する中間状態は実現可能です。
A. 問題文に「実行終了時に三つの資源を一括して解放する」とあるため、取得した資源は処理の最後まで保持され続け、途中で解放されない前提で考えます。したがってAがXとYを保持したままZを要求する中間状態は実現可能です。
Q. 資源に複数インスタンスがあれば結果は変わるか?
A. はい。複数インスタンスがある場合、同時に要求を満たせる可能性があり、循環待ちが回避される場面が増えます。本問は単一インスタンスを想定した典型問題です。
A. はい。複数インスタンスがある場合、同時に要求を満たせる可能性があり、循環待ちが回避される場面が増えます。本問は単一インスタンスを想定した典型問題です。
Q. 実際の判定を自動化する方法は?
A. 資源要求を有向グラフ(プロセス→資源、資源→プロセス)としてモデル化し、待ちグラフ(プロセス間の待ち辺)に閉路があるかどうかを深さ優先探索などで検出します。
A. 資源要求を有向グラフ(プロセス→資源、資源→プロセス)としてモデル化し、待ちグラフ(プロセス間の待ち辺)に閉路があるかどうかを深さ優先探索などで検出します。
関連キーワード: デッドロック、循環待ち、資源割当、占有順序、待ちグラフ、Coffman条件、資源順序化、閉路検出

\ せっかくなら /
応用情報技術者を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

