デッドロック Operating System: Circular Wait とは (例)
デッドロックとは何ですか?
Deadlock デッドロックは、別の待機中のプロセスが要求されたリソースを保持しているために、いずれかのプロセスが待機状態になったときに OS で発生する状況です。デッドロックは、複数のプロセスがソフト ロックまたはソフトウェアと呼ばれる特定の種類の相互に排他的なリソースを共有するマルチプロセスでよく発生する問題です。
デッドロックの例
- 現実世界の例としては、一方向にのみ進む交通が挙げられます。
- ここでは、ブリッジはリソースとみなされます。
- したがって、デッドロックが発生した場合、1 台の車がバックアップ (リソースを先取りしてロールバック) すると簡単に解決できます。
- 行き詰まりが発生した場合、複数の車両をバックアップする必要がある可能性があります。
- したがって、飢餓が発生する可能性があります。

循環待機とは何ですか?
XNUMX つのプロセスがリソースを待機しており、そのリソースは XNUMX 番目のプロセスによって保持され、そのリソースは XNUMX 番目のプロセスによって保持されるリソースも待機し、というようになります。これは、最後のプロセスが最初のプロセスによって保持されるリソースを待機するまで続きます。 これにより、円形のチェーンが作成されます。
たとえば、プロセス A はリソース A を要求しているため、リソース B が割り当てられます。同様に、プロセス B にはリソース A が割り当てられ、リソース B が要求されています。これにより、循環待機ループが作成されます。
循環待機の例
たとえば、コンピューターに 3 つの USB ドライブと 3 つのプロセスがあるとします。3 つのプロセスはそれぞれ、USB ドライブを 1 つずつ保持できます。そのため、各プロセスが別のドライブを要求すると、3 つのプロセスはデッドロック状態になります。これは、各プロセスが現在使用中の USB ドライブの解放を待機するためです。これにより、循環チェーンが発生します。
OS におけるデッドロック検出
デッドロックの発生はリソーススケジューラによって検出できます。リソーススケジューラは、OS がリソースを効率的に管理するのに役立ちます。 trackは、異なるプロセスに割り当てられているすべてのリソースのうちの1つです。したがって、デッドロックが検出された場合、以下の方法を使用して解決できます。
OSにおけるデッドロック防止
デッドロックが発生する前にそれを防ぐことが重要です。システムは、デッドロック状況が発生しないように、実行前にすべてのトランザクションをチェックします。そのため、将来デッドロックにつながる可能性のある操作に小さな変更が加えられると、プロセスの実行も許可されなくなります。
これは、少なくとも XNUMX つの条件が成立しないことを保証するための一連のメソッドです。
先制行動なし
プリエンプションなし – リソースは、プロセスがタスクを終了した後、それを保持しているプロセスによって自発的にのみ解放されます。
- いくつかのリソースを保持しているプロセスが、すぐに割り当てることができない別のリソースを要求した場合、その状況ではすべてのリソースが解放されます。
- プリエンプトされたリソースには、待機中のプロセスのリソースのリストが必要です。
- プロセスは、古いリソースと要求している新しいリソースを取り戻すことができる場合にのみ再起動されます。
- プロセスが他のリソースを要求している場合、それが利用可能な場合、そのリソースは要求元のプロセスに与えられます。
- 別のリソースを待っている別のプロセスによって保持されている場合は、それを解放し、要求元のプロセスに渡します。
相互排除
相互排除は、Mutex の完全な形式です。 これは、共有リソースへのアクセスを制御するために使用される特別なタイプのバイナリ セマフォです。 これには、拡張優先度逆転の問題を回避するための優先度継承メカニズムが含まれています。 これにより、現在優先度の高いタスクを可能な限り短時間ブロック状態に保つことができます。
読み取り専用ファイルなどの共有リソースがデッドロックを引き起こすことはありませんが、プリンターやテープ ドライブなどのリソースは、単一のプロセスによる排他的アクセスを必要とします。
待って待ってください
この状態では、プロセスが 1 つまたは複数のリソースを保持しながら同時に 1 つ以上の他のリソースを待機することを停止する必要があります。
循環待機
これにより、すべてのリソース タイプの全体的な順序が決まります。 循環待機では、すべてのプロセスが列挙の昇順でリソースを要求する必要もあります。
デッドロックの回避 Algorithms
デッドロックが発生した後にアクションを起こすのではなく、デッドロックを回避する方がよいでしょう。リソースの使用方法などの追加情報が必要です。デッドロック回避は、各プロセスが必要とする可能性のある各タイプのリソースの最大数を宣言する、最もシンプルで便利なモデルです。
回避 Algorithms
デッドロック回避アルゴリズムは、循環待機状況が発生しないように、リソース割り当て状態を動的に評価するのに役立ちます。
リソースタイプの単一インスタンス。
- リソース割り当てグラフを使用する
- デッドロックには十分なサイクルが必要である
リソースタイプの複数のインスタンス。
- サイクルは必要ですが、デッドロックには十分ではありません。
- 使用する 銀行家のアルゴリズム
飢餓とデッドロックの違い
デッドロックと飢餓の重要な違いは次のとおりです。
| Deadlock | 飢餓 |
|---|---|
| デッドロック状況は、プロセスの 1 つがブロックされたときに発生します。 | スターベーションとは、優先度の低いプロセスがすべてブロックされ、優先度の高いプロセスが実行される状況です。 |
| デッドロックは無限のプロセスです。 | 飢餓は長い待ち時間ですが、無限のプロセスではありません。 |
| すべてのデッドロックには必ず飢餓が伴います。 | すべての飢餓が必ずしも行き詰まりになるわけではありません。 |
| デッドロックは、相互排他、保留、待機の後に発生します。ここでは、プリエンプションと循環待機は同時に発生しません。 | これは、制御されていない優先順位とリソース管理が原因で発生します。 |
デッドロックの利点
デッドロック法の利点は次のとおりです。
- この状況は、単一のバーストアクティビティを実行するプロセスにうまく機能します。
- デッドロックにはプリエンプションは必要ありません。
- 状態の保存と復元が容易なリソースに適用すると便利な方法
- コンパイル時のチェックを通じて強制可能
- 問題はシステム設計で解決されるため、実行時の計算は必要ありません。
デッドロックのデメリット
デッドロック方式の短所/欠点は次のとおりです。
- プロセスの開始を遅らせる
- プロセスは将来のリソースの必要性を認識する必要がある
- 必要以上に頻繁に先制攻撃を行う
- 増分リソース要求を禁止します
- 固有の先取り損失。
製品概要
- デッドロックの定義: OS 別の待機プロセスが要求されたリソースを保持しているために、いずれかのプロセスが待機状態になったとき
- 循環待機は、XNUMX つのプロセスがリソースを待機しており、そのリソースが XNUMX 番目のプロセスによって保持され、そのリソースも XNUMX 番目のプロセスによって保持されているリソースを待機している場合などに発生します。
- デッドロックの発生はリソース スケジューラによって検出できます。
- デッドロックが発生する前にそれを防ぐことが重要です。
- リソースは、そのプロセスがタスクを終了した後、それを保持しているプロセスによって自発的にのみ解放できます。
- 相互排他は、Mutex の完全な形式です。 特殊なタイプのバイナリです セマフォ 共有リソースへのアクセスを制御するために使用されます。
- ホールド アンド ウェイトは、プロセスが単一または複数のリソースを保持しながら、同時に 1 つ以上の他のリソースを待機することを停止する必要がある状態です。
- デッドロック回避は、各プロセスが必要とする可能性のある各タイプのリソースの最大数を宣言する、最も単純で有用なモデルです。
- デッドロック回避アルゴリズムは、循環待機状況が発生しないように、リソース割り当て状態を動的に評価するのに役立ちます。
- デッドロックは無限のプロセスですが、飢餓は長時間待機しますが無限のプロセスではありません。
