この概念が出た関連問題

この試験の対策ガイド

基本情報技術者試験 対策ガイド

合格率・勉強法・参考書の選び方をまとめています

見る →
答えと解説を見る(先に解くのがおすすめ)

正解は ウ

解説

2相ロッキングプロトコルにおけるデッドロックの問題です。トランザクション A は read W(共有ロック)→ update X → update Y → update Z の順にロックを取得します。デッドロックは「A がロック p を保持して q を待ち、B が q を保持して p を待つ」という循環待ちで発生します。B の処理順序がウ(update X → read W → update Y → update Z)の場合を検証します。A と B はどちらも最初の専有ロック対象が X です(A は W の共有ロック後すぐ X)。X のロックを先に取れたトランザクションが処理を先行し、もう一方は X の解放を待つだけになります。W への read は両者とも共有ロックなので競合しません。例えば B が X を先に取れば、B は W・Y・Z と順に取得して完走し、その後 A が実行されます。A が先なら逆も同様です。どちらの順でも待ちは一方向にしかならず、循環待ちが発生しないため、ウが正解です。他の選択肢はいずれも、A が X を保持して Y を待ち、B が Y を保持して X を待つ(またはその変形の)相互待ちに陥る可能性があります。

なぜ他の選択肢は違うのか

選択肢 ア
B が read W → update Y → update X → update Z の順の場合、A が update X まで進んで X を保持し、B が update Y まで進んで Y を保持した状態が起こり得ます。このとき A は次の update Y で B の解放を待ち、B は次の update X で A の解放を待つため、互いに相手のロックを待つ循環(デッドロック)が成立してしまいます。X と Y の取得順序が A と逆になっていることが原因です。
選択肢 イ
B が read W → update Y → update Z → update X の順の場合も、A が X を保持し B が Y(と Z)を保持した時点で、A は Y 待ち・B は X 待ちの相互待ちに陥る可能性があります。専有ロックの取得順序が A(X→Y→Z)と B(Y→Z→X)で循環関係になっているため、タイミングによってデッドロックが発生します。全トランザクションで資源の取得順序を統一することがデッドロック防止の基本です。
選択肢 エ
B が update Y → update Z → update X → read W の順の場合、B が最初に Y を取得するため、A が X を保持して Y を待ち、B が Y を保持して X を待つという最も典型的な相互待ちが発生し得ます。前問までと同様、A の取得順序(X が先、Y が後)と B の取得順序(Y が先、X が後)が逆転していることがデッドロックの原因です。

解くときのポイント

デッドロック判定は「最初に競合する専有ロックの取得順序が全トランザクションで同じ向きか」を見る。順序が統一されていれば先に取った方が完走するだけで循環待ちは起きない。