デッドロック検出の解説(応用情報技術者シラバス用語)

目次

デッドロック検出とは

デッドロック検出とは、データベースなどで複数の処理がお互いに相手が使っているデータの解放を待ち合ってしまい、処理が完全に停止(フリーズ)してしまう「デッドロック」という状態を、システムが自動的に見つけ出す仕組みのことです。

データを書き換える際、他の処理に邪魔されないようにデータに鍵をかける「ロック」を行います。2つの処理がそれぞれ異なるデータにロックをかけた後、お互いにもう一方のデータを使おうとすると、永久に終わらない「待ち合い状態」が発生します。デッドロック検出機能は、システム内部の待ち関係を監視(待ちグラフの作成など)し、ループ状態になっているのを検知すると、一方の処理を強制的にエラー(ロールバック)にして終了させることで、システム全体のフリーズを回避します。

具体例

処理Aが「テーブル1」に鍵をかけ、次に「テーブル2」を使おうとして待っています。同時に、処理Bが「テーブル2」に鍵をかけ、次に「テーブル1」を使おうとして待っています。この状態になると、お互いに鍵を開けるのを待ち続けるため、外から止めない限り永久に動きません。デッドロック検出システムは、この硬直を検知し、処理Bを強制終了させて処理Aを先に進めさせます。

もう少し詳しく

デッドロックを検出するための代表的なアルゴリズムは、リソースの所有関係とトランザクションの待ち状態をグラフ化した「待ちグラフ(Wait-For Graph:WFG)」を用いる手法です。このグラフにおいて、トランザクションをノード(頂点)、待ち関係をアーク(矢印)で表現し、グラフの中に「閉路(ループ)」が存在するかどうかを定期的に探索します。閉路が見つかった場合、デッドロックが発生していると判断します。検出後の回復フェーズでは、ループを構成するトランザクションの中から、処理の進捗が最も少ないものや、ロールバックのコストが低いものを「犠牲者(Victim)」として選択し、その処理を強制終了してコミット前の状態に戻すことでロックを解放させます。これにより、他のトランザクションが処理を再開できるようになり、システム全体のデッドロックが解消されます。

試験でのポイント

試験では、デッドロックが発生する4つの必要条件(相互排除、ホールド&ウェイト、非割り込み、循環待ち)や、デッドロックを「検出・解消」するアプローチと、事前に「予防・回避」するアプローチの違いが問われます。予防策としては、すべてのトランザクションでリソースにロックをかける「順序を一方向に統一する」設計ルールが有名です。試験問題で複数の処理とファイルのロック順序が示された場合、順序が逆になっている部分がデッドロックの原因になることを指摘できるかどうかがポイントになります。また、デッドロック発生時に、システムがどのトランザクションをロールバックするか(Victimの選定基準)についても問われます。

関連する用語

デッドロック検出に関連する用語としては、トランザクションの待ち関係を可視化する「待ちグラフ(WFG)」や、強制終了の対象となる「犠牲者(Victim)」があります。また、排他制御の基本である「ロック」や「ロールバック」、デッドロックを事前に防ぐ「デッドロック予防(ロック順序の統一など)」、そしてオペレーティングシステム分野でのデッドロック回避アルゴリズムである「銀行家のアルゴリズム」も重要な関連用語です。

読んだ内容を10問練習と実技で確認

記事で理解した用語を、StudyQuestの演習とクラウド実技ラボで定着させます。

10問練習 実技ラボ