応用情報技術者試験過去問を解いてみた R6年度 春期 問17

はじめに

今回も、応用情報技術者試験の過去問を解いていきます。
今回は「デッドロック」に関する問題です。

一見シンプルですが、「資源の取得順序」がポイントになる重要問題です。


問題

三つの資源 X〜Z を占有して処理を行う四つのプロセス A〜D がある。
各プロセスは処理の進行に伴い、表中の数値の順に資源を占有し、実行終了時に三つの資源を一括して解放する。

プロセスAと同時にもう一つプロセスを動かした場合に、デッドロックを起こす可能性があるプロセスはどれか。

資源の占有順序

プロセス資源X資源Y資源Z
A123
B123
C231
D321

選択肢

  • ア:B, C, D
  • イ:C, D
  • ウ:Cだけ
  • エ:Dだけ

解答

イ:C, D


解説

■ まずは前提:資源の取得順序

各プロセスの取得順序を整理すると以下の通りです。

プロセス取得順序
AX → Y → Z
BX → Y → Z
CZ → X → Y
DZ → Y → X

■ デッドロックの本質

デッドロックは以下の状態で発生します:

お互いに資源を持ったまま、相手の資源を待ち続ける状態

つまり、

  • Aが「X」を持っている
  • 相手が「Z」を持っている
  • 互いに次の資源を待つ

こうなると詰みます。


■ Aと他プロセスの関係

● A × B

  • 両方とも「X → Y → Z」
    → 順序が同じ
    デッドロックにならない

● A × C

  • A:X → Y → Z
  • C:Z → X → Y

👉 パターン:

  1. AがYを取得(Xは既に所持)
  2. CがZを取得

このとき

  1. AはZ待ち
  2. CはX待ち

お互い待ち状態 → デッドロック発生


● A × D

  • A:X → Y → Z
  • D:Z → Y → X

👉 パターン:

  1. AがXを取得
  2. DがYを取得(Zは既に所持)

このとき

  1. AはY待ち
  2. DはX待ち

デッドロック発生


問題の用語解説

■ デッドロック(Deadlock)

複数のプロセスが互いに資源を待ち続け、処理が進まなくなる状態。


■ 資源の占有順序

プロセスがどの順番で資源を取得するか。


■ 循環待ち(Circular Wait)

A → B → C → A のように、待ちがループする状態。

👉 デッドロックの発生条件の一つ


体系的位置づけ

この問題は以下の分野に属します:

  • テクノロジ系
    • コンピュータシステム
      • 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を取る

  1. A:X取得
  2. B:X待ち(何も持っていない)
  3. A:Y → Z と進む
  4. A:全部解放
  5. B:実行開始

👉 待ちが一方向だけなので安全


■ なぜデッドロックにならないのか

デッドロックには「循環待ち」が必要です。

例えば危険なパターンは:

  • A:Xを持ってY待ち
  • B:Yを持ってX待ち

👉 これが「ループ(循環)」です


■ AとBではそれが起きない

AとBの場合:

  • 両方とも「Xから」取りに行く
  • つまり「最初の資源が同じ」

👉 結果:

  • どちらか一方しかXを取れない
  • もう一方は「何も持たずに待つ」

■ ここが超重要ポイント

👉 デッドロックは

「お互いに何かを持っている状態」でないと発生しない


■ AとBの状態

  • A:Xを持っている
  • B:何も持っていない(ただ待っている)

👉 片方が資源を持っていないので、詰み状態にならない


補足2:デッドロックの具体的説明

■ 例①:ファイルのロック

状況

2つのプログラムがファイルを使うとします

  • プログラムA
    • ファイル① → ファイル② の順で使う
  • プログラムB
    • ファイル② → ファイル① の順で使う

● 実際に起こること

  1. Aがファイル①をロック
  2. Bがファイル②をロック

ここで…

  • A:ファイル②が欲しい(でもBが持ってる)
  • B:ファイル①が欲しい(でもAが持ってる)

👉 完全に止まる(デッドロック)


■ 例②:データベース

これはかなりリアルです👇

● トランザクション

  • 処理A:
    • ユーザー情報更新 → 注文情報更新
  • 処理B:
    • 注文情報更新 → ユーザー情報更新

● 実際の事故

  • Aがユーザー表ロック
  • Bが注文表ロック

👉 その後

  • A:注文表待ち
  • B:ユーザー表待ち

👉 DBが固まる


■ 実際に起きるとどうなる?

  • プログラムが止まる
  • CPUは動いてるのに処理進まない
  • サーバーが固まる

👉 本番環境で普通に事故になる


■ 実際の対策例

✔ 解決策(実務でやること)

① 順序を統一する

👉 全部「X→Y→Z」で取る

(今回のAとBの状態)


② タイムアウト

👉 一定時間待ったら諦める


③ 強制解除(OSがやる)

👉 どれかの処理を殺す


■ まとめ

  • デッドロックは実際に起こる
  • OS・DB・アプリ全部で発生する
  • 原因は「資源取得順序の不一致」

コメント

タイトルとURLをコピーしました