【でっどろっく】

デッドロック とは?

最終更新:
💡 「お互いに道を譲らない」膠着状態
📌 このページのポイント
デッドロック(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(錠前)。鍵がかかったまま解除不能になるイメージだよ
← 用語集にもどる