【でっどろっく】

デッドロック とは?

💡 「お互いに道を譲らない」膠着状態
📌 このページのポイント
デッドロック(Deadlock) プロセスA リソース1を保持中 プロセスB リソース2を保持中 リソース1 リソース2 保持 保持 要求(待ち) 要求(待ち) ! 互いに相手のリソースを待ち続け、永遠に進めない状態 解決策:ロック順序の統一・タイムアウト・デッドロック検出
2つのプロセスが互いのリソースを待ち合い永久に停止する状態
ひよこ ひよこ

どういう状況で起きるの?

ペンギン先生 ペンギン先生

スレッドAがリソースXをロックしてからリソースYをロックしようとする。同時にスレッドBがリソースYをロックしてからリソースXをロックしようとする。AはBがYを解放するのを待ち、BはAがXを解放するのを待つ。お互い永遠に待ち続けてどちらも進めない。これがデッドロックだよ

ひよこ ひよこ

データベースでも起きるの?

ペンギン先生 ペンギン先生

起きるよ。トランザクションAが行1をUPDATEしてロック→行2をUPDATE。トランザクションBが行2をロック→行1をUPDATE。互いにロック待ちになる。RDBMSはデッドロック検出機能を持っていて、検出するとどちらかのトランザクションロールバックしてくれる。エラーを受けたらリトライするのが定石だよ

ひよこ ひよこ

デッドロックの予防法は?

ペンギン先生 ペンギン先生

①ロック順序を統一(全スレッドリソースA→B→Cの順でロック)、②タイムアウトを設定(一定時間ロックが取れなかったら諦める)、③ロックの粒度を小さく(テーブルロックではなく行ロック)、④楽観的ロック(ロックせずに更新時にバージョンチェック)。4条件のうち1つでも潰せばデッドロックは発生しないよ

ひよこ ひよこ

IPA試験での出題パターンは?

ペンギン先生 ペンギン先生

「デッドロックの4条件(コフマンの条件)を答えよ」→相互排除、保持と待機、横取り不可、循環待ち。「デッドロックが発生するかの判定」にはリソース割当グラフ(待ちグラフ)で循環を検出する問題が出る。「銀行家のアルゴリズム」でデッドロック回避する問題もあるよ

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「デッドロック」って出てきたら「お互いのロック解放を待ち続けて動けなくなる状態」と思えればだいたいOK!
📖 おまけ:英語の意味
「Deadlock」 = 行き詰まり
💬 Dead(死んだ)Lock(錠前)。鍵がかかったまま解除不能になるイメージだよ
← 用語集にもどる