deadlock
「deadlock」の意味・「deadlock」とは
「deadlock」とは、英語の単語であり、日本語では「行き詰まり」や「僵局」などと訳されることが多い。具体的には、議論や交渉などが進展しない状況、または互いに譲歩できずに進行不能に陥った状態を指す。例えば、労使交渉で双方が譲歩しないために話し合いが進まない状況は、「deadlock」に陥ったと表現される。「deadlock」の発音・読み方
「deadlock」の発音は、IPA表記では /ˈdɛdlɒk/ となる。IPAのカタカナ読みでは、「デッドロック」と読む。日本人が発音するカタカナ英語では「デッドロック」となる。この単語は発音によって意味や品詞が変わる単語ではない。「deadlock」の定義を英語で解説
「deadlock」は、a situation in which no progress can be made or no advancement is possibleと定義される。つまり、何も進展しない、または進歩が不可能な状況を指す。例えば、政治的な交渉で双方が譲歩しないために進展が見られない状況は、「deadlock」と表現される。「deadlock」の類語
「deadlock」の類語としては、「stalemate」、「standstill」、「impasse」などがある。これらの単語も同様に、進展が見られない状況や進行不能に陥った状態を表す。「deadlock」に関連する用語・表現
「deadlock」に関連する用語としては、「negotiation」(交渉)、「compromise」(妥協)、「concession」(譲歩)などがある。これらの単語は、「deadlock」が生じる議論や交渉の過程で頻繁に用いられる。「deadlock」の例文
1. The negotiations ended in a deadlock.(交渉は行き詰まりに終わった)2. The two parties are in a deadlock over the budget.(二つの党は予算についての僵局に陥っている)
3. We need to break the deadlock and move forward.(僵局を打開し、前に進む必要がある)
4. The deadlock in the talks has caused concern among the public.(交渉の行き詰まりが公衆の間で懸念を引き起こしている)
5. The union and the management reached a deadlock in their negotiations.(労組と経営陣は交渉で行き詰まった)
6. The committee is at a deadlock over the issue.(委員会はその問題について僵局に陥っている)
7. The deadlock was finally broken by a compromise.(僵局はついに妥協によって打開された)
8. The deadlock has delayed the project.(僵局がプロジェクトを遅らせている)
9. The deadlock in the Senate is preventing the bill from being passed.(上院の僵局が法案の成立を阻んでいる)
10. The dispute has reached a deadlock and seems unlikely to be resolved soon.(紛争は行き詰まりに達し、近く解決する見込みはなさそうだ)
デッドロック【deadlock】
デッドロック
ドアロックに採用されている機構で、ドアロックが、完全にブロックされるもの。ウインドウガラスを砕いてもドアは内側からも外側からも開けることができない。ドアロックをまわしても解錠されずドアロックの操作は不可能になる。サーブに採用されている盗難防止機構。
デッドロック
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2024/09/29 19:32 UTC 版)
この記事は検証可能な参考文献や出典が全く示されていないか、不十分です。(2021年9月) |
デッドロック(英: deadlock)とは、複数の処理単位が互いの終了を待ち続け、結果としてどの処理も進まないことである。
また、合弁契約書などにおいてパートナーと利害関係がぶつかるような問題が生じた場合の解決方法を定めた条項を「デッドロック条項(Deadlock Clause)」と言う。 英語ではもともと行き詰まりの意味である。
古い文献では、デッドロックのことをチェス用語と同様のステイルメイトと呼称して説明をしている場合がある[1]。
プログラム上の例
デッドロックが発生する原因
基本的にデッドロックは資源数が2以上の場合に発生する(たとえばクリティカルセクションが1つあれば資源は1つと数えられる。2つのクリティカルセクションがあれば資源数は2である)。資源数が1の場合、セマフォ等はバイナリセマフォとなり、振る舞いはミューテックスと同じになるのでデッドロックは発生しない(ライブロックする。これを回避する方法は数多く考案されており、たとえばCSMA/CDでは乱数を用いて回避する)。
資源数を1にすることは、デッドロックを回避する根本的な解決方法であるが、その場合プログラムの並列性は著しく損なわれるため、現代のコンピュータープログラミングにおいて現実的な手段とは言えない。資源を多数用い、なおかつデッドロックを回避する手段については以下に述べる。
例
クリティカルセクションで排他制御を用いた場合の例をあげる。 変数Aと変数Bの2つのデータと、BにAの値を加算し、Aを0にする処理AとAにBの値を加算し、Bを0にする処理Bの2つの処理があったとする。マルチスレッドで処理をするため変数Aと変数BにアクセスするためのクリティカルセクションA(以下CSA)とクリティカルセクションB(以下CSB)の2つのクリティカルセクションを用意する。
処理Aは以下の手順であるとする。
- CSAに入る
- CSBに入る
- BにAの値を加算
- Aに0を代入
- CSBから出る
- CSAから出る
また同様に処理Bは以下の手順であるとする。
- CSBに入る
- CSAに入る
- AにBの値を加算
- Bに0を代入
- CSAから出る
- CSBから出る
この場合は以下のようにプログラムが動作するとデッドロックが発生する。 処理Aを実行するスレッドAが生成され、処理が開始する。処理Aの1でCSAに入った直後にコンテキストスイッチが発生し、処理Bを実行するスレッドBが生成され、処理Bの1でCSBに入る。そして再びコンテキストスイッチが発生しスレッドAがアクティブになり、2でCSBに入ろうと試みる。しかし、スレッドBが既にCSBに入っているためスレッドAは待機状態に入り、スレッドBがアクティブになる。スレッドBは同じく2でCSAに入ろうと試みるがスレッドAが既にCSAに入っているためスレッドBは待機状態に入ってしまう。
こうして両方のスレッドが待機状態になり、プログラムが停止してしまう。この状態がデッドロックである。
以上の処理を時間に沿ってまとめたものが以下の表である。
スレッドA | スレッドB | CSAの所有者 | CSBの所有者 |
---|---|---|---|
スレッド発生 | |||
処理Aを開始 | |||
CSAに入る | スレッドA | ||
コンテキストスイッチ A→B | |||
待機 | スレッド発生 | ||
処理Bを開始 | |||
CSBに入る | スレッドB | ||
コンテキストスイッチ B→A | |||
CSBへ入ることに失敗 | 待機 | ||
コンテキストスイッチ A→B | |||
CSBの解放を待機 | CSAへ入ることに失敗 | ||
CSAの解放を待機 | |||
デッドロックの発生 |
回避方法
以上のようなデッドロックを回避するには以下のような方法がある。
- CSAとCSBに入る順番を2つの処理で同じにする
- “変数Aと変数Bにアクセスする”というミューテックスを用いる
- クリティカルセクションに入れない場合は、既に入っているクリティカルセクションから出て処理を終了するようにする
他にも様々な回避方法が存在する。
優先度上限プロトコル機能が拡張されたミューテックスを利用することでも、デッドロックを回避することが可能である。優先度上限プロトコルは組み込みシステムで主に使われ、使うことで効果があるプログラムも限定的であり、汎用的に使える方法ではない。
オブジェクト指向プログラミングでの回避方法
オブジェクト指向プログラミングでは、クラス間の依存関係を単方向にし、クラス間の依存関係の構造が階層構造になるように設計するのが、必須ではないものの定石である。en:Hierarchy (object-oriented programming)。ここでは、独立している方を下と定義する。つまり、上の階層のクラスは、下の階層のクラスについて知っている。下の階層のクラスは、上の階層のクラスについて知らない。上の階層のクラスから、下の階層のクラスへの呼び出しは、普通のメソッド呼び出しで行う。下の階層から、上の階層に戻すときは、Observerパターンを使う。階層構造をとる軍隊にたとえると、メソッド呼び出しが上官からの命令であり、Observerパターンが部下から上官への報告である。
そして、デッドロックを回避するには、ロックをかけるオブジェクトのクラスの順番を統一するというのが一つの方法である。そして、クラスの依存関係が階層構造になっているときは、必ず、上の階層のクラスから順番にロックをかけるということで統一する。そうすると、上の階層でロックをかけたまま、下の階層のオブジェクトのメソッドを呼び出すことが可能になる。軍隊の比喩でいうと、上官が部下よりも先にリソースを独占する。
また、Observerパターンで上の階層に戻す場合は、自分のかけているロックを全て解放してから、上の階層に戻す。そうすることにより、「下の階層でロック→上の階層でロック」の発生を防げる。また、同じ階層同士ではロックをかけない。それが必要な場合は、上の階層でロックをかける。こうすることにより、デッドロックを回避できる。
Lock-free での回避
Lock-freeとWait-freeアルゴリズムでもデッドロックを回避できる。
交通での例
日本の兵庫県加古川市加古川町には、兵庫県道148号線の道中に、4方向に止まれ標識がある十字路がある。3方向に同時に車両が来た場合については、道路交通法第36条で、交差点中心を見て左側の車両を優先的に通過させるよう定められている。しかしながら、4方向に同時に車両が来た場合について明確な定めはない。なお、兵庫県警察は同件の取材者に対し、身振り手振りで意思疎通し、徐行しながら通り過ぎることを推奨する見解を提示している。 https://kuruma-news.jp/post/574471
脚注
- ^ J.DONOVAN 1972, p. 393-395,475.
参考文献
- J.DONOVAN, JOHN (1972). systems programming. ISBN 0-07-085175-1
関連項目
- ナッシュ均衡
- ジョン・フォーブス・ナッシュ
- 排他制御
- クリティカルセクション
- セマフォ
- マルチスレッド
- スレッド
- 食事する哲学者の問題
- ダチョウ・アルゴリズム
- SPINモデルチェッカ - 形式手法によりシステムがデッドロックに陥らないことを検証できるモデル検査ツール
- グリッドロック - 自動車交通におけるデッドロック状態
デッドロック
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/06/15 08:56 UTC 版)
「トランザクション処理」の記事における「デッドロック」の解説
詳細は「デッドロック」を参照 場合によっては、2つのトランザクションの処理中にデータベース内の同じ部分に同時にアクセスしようとして、互いの処理の進行を妨げる場合がある。例えば、トランザクション A が X にアクセスし、トランザクション B が Y にアクセスしているとしよう。その状態で、A が Y にアクセスしようとし、B が X にアクセスしようとしたとき「デッドロック」が発生し、どちらのトランザクションも先に進めなくなる。トランザクション処理システムはそのようなデッドロックが発生するのを検出するよう設計されている。通常、両方のトランザクションをキャンセルし、ロールバックする。そして、自動的に順序を変えて再実行し、デッドロックが再度発生しないようにする。
※この「デッドロック」の解説は、「トランザクション処理」の解説の一部です。
「デッドロック」を含む「トランザクション処理」の記事については、「トランザクション処理」の概要を参照ください。
- デッドロックのページへのリンク