Linux でデッドロックが発生する理由は次のとおりです: 1. プリエンプトできないリソースの競合によって発生するデッドロック、2. 消耗品リソースの競合によって発生するデッドロック、3. 不適切なプロセスの進行順序 (プロセスの実行中にプロセスが実行される) によって発生するデッドロックプロセス、リソースの要求と解放の順序が不適切であり、プロセスのデッドロックが発生します)。
#このチュートリアルの動作環境: linux5.9.8 システム、Dell G3 コンピューター。
1. デッドロックの概念:
プロセス (またはスレッド) のグループ内の各プロセス (またはスレッド) が待機中の場合プロセスのグループ内の他のプロセス (またはスレッド) によってのみトリガーできるイベントの場合、プロセス (またはスレッド) のグループはデッドロックになります (デッドロック)。
# 2. デッドロックの理由:
# (1) 非プリエンプティブル リソースの競合によるデッドロック例: ファイル共有時に発生するデッドロック
システムには 2 つのプロセス P1 と P2 があり、どちらも 2 つのファイル F1 と F2 を書き込む準備をしています。これらはどちらも再利用可能で、プリエンプティブルではないリソースです。プロセス P1 が F1 を同時に開くと、プロセス P2 はファイル F2 を開きます。P1 が F2 を開こうとすると、F2 はすでに占有されているためブロックされます。P2 が 1 を開こうとすると、F1 がすでに占有されているためブロックされます。時間が経過すると、ワイヤレス接続がなくなり、待機が続くとデッドロックが発生します。
# (2) 消耗品リソースの競合によるデッドロック
#例: プロセス通信によるデッドロック システムには 3 つのプロセス P1、P2、P3 があり、m1、m2、m3 は 3 つの消耗リソースです。一方では、プロセス P1 はメッセージ m1 を生成して P2 に送信し、他方では P3 からメッセージ m3 を受信します。一方では、プロセス P2 はメッセージ m2 を生成して P3 に送信し、他方では P1 からメッセージ m1 を受信します。同様に、プロセス P3 は、一方ではメッセージ m3 を生成して P1 に送信し、他方では P2 からメッセージ m2 を受信します。
3 つのプロセスが最初に自分で生成したメッセージを送信し、次に他のプロセスからのメッセージを受信する場合、デッドロックが発生することなくスムーズに実行できますが、3 つのプロセスすべてが最初に他のプロセスからのメッセージを受信する場合、メッセージが生成されない場合、永遠に待機することになり、デッドロックが発生します。
# (3) 不適切なプロセスの進行順序によるデッドロック: プロセスの実行中に、リソースの要求と解放の順序が不適切になり、プロセスのデッドロックが発生します。
上図では、曲線 1 の順に進めば 2 つの工程がスムーズに完了し、曲線 2 の順に進めば 2 つの工程がスムーズに完了できます。曲線 3、 の順に進むと 2 つのプロセスは正常に完了できますが、曲線 4 の順に進むと、2 つのプロセスは危険領域 D に入ります。このとき、P1 はリソース R1 を保持し、P2 はリソースを保持します。リソース R2 を保持します。システムは安全ではない状態です。このまま進むと、デッドロックが発生する可能性があります。
#3. デッドロックの必要条件
(1) 相互排他条件。プロセス (スレッド) によって要求されたリソースは、一定期間内に 1 つのプロセス (スレッド) ロックによってのみ占有できます。 (2) 条件の要求と保留。プロセス (スレッド) はすでに少なくとも 1 つのリソースを占有していますが、新しいリソース要求が行われ、そのリソースが別のプロセス (スレッド) によって占有されています。
(3) 非プリエンプション条件 (非プリエンプション条件)。プロセス (スレッド) によって取得されたリソースは、使い果たされる前にプリエンプトすることはできません。 (4) ループ待ち条件(ループ待ち条件)。デッドロックが発生した場合、プロセス (スレッド)、つまりリソースの循環チェーンが存在する必要があります。 4. デッドロックの回避、予防、解決策デッドロックの回避は、システムの動作中に発生するデッドロックを回避するための最後のステップです。 デッドロック発生の最初の 3 つの条件は、デッドロックが発生するための必要条件、つまりデッドロックが発生するために満たさなければならない条件であり、この 3 つの条件が存在するというよりも、論理的には、4 番目の条件を回避することでデッドロックを回避できます。
デッドロック回避の基本的な考え方: システムは、システムが満たせるプロセスによって発行された各リソース要求を動的にチェックし、チェック結果に基づいてリソースを割り当てるかどうかを決定します。割り当て後のデッドロック、その後は割り当てられず、それ以外の場合は割り当てられます。(1) デッドロックを回避するために一般的に使用される方法:
1. リソースの秩序ある割り当て2. バンカーのアルゴリズム、基本的な考え方:デッドロック回避方法では、プロセスはリソースを動的に適用できますが、リソースを割り当てる前に、システムは最初に割り当てられたリソースの安全性を計算する必要があります。割り当てによってシステムが安全でない状態にならない場合は、リソースを割り当て、そうでない場合は待機します。
(2) デッドロックの防止:1. 「不可分」条件の破棄: プロセスがリソースを占有し、別のリソースを申請してもそれを満たすことができない場合、プロセスは最初に占有されていたリソースを終了します。
この戦略は複雑で、実装には費用がかかります。リソースは一定期間使用されると強制的に剥奪されるため、前段階の作業が失敗します。
2. 「リクエストとホールド」条件を破棄します。静的な 1 回限りのリソース割り当て戦略を採用します。つまり、プロセスが実行される前にすべてのリソースに適用され、満たされていれば実行され、満たされていなければ待機するため、プロセスが占有されないようにします。そして申請しました。
3. 「相互排他」条件を破壊する: リソースの相互排他性はそれ自体の性質によって決定されるため、この戦略はほぼ不可能です。
4. 「循環待機」状態を打破する: システム内のすべてのリソースに順番に番号を付ける 一般原則として、希少なリソースほど大きな番号が付けられます。プロセスがリソースを申請するときは、リソース番号の順序に厳密に従う必要があります。そうでない場合、システムはリソースを割り当てません。つまり、プロセスは、小さい番号のリソースを取得する場合には、大きい番号のリソースのみを適用できます。リソースを解放する場合は、番号の降順で実行する必要があります。
(3) デッドロックを解決する方法:
現在、デッドロックを発生させないようにする方法と、デッドロックを発生させてしまう方法の 2 つの方法があります。後で解決されます。
具体的な方法は 4 つあります:
1. デッドロックを防止します。特定の厳格な制限を設定してデッドロックの条件を破ることによってデッドロックの発生を防ぎますが、この方法ではシステム リソースの使用率が低下します
2、デッドロックを回避してください。動的リソース割り当てのプロセスでは、システムが安全でない状態に入るのを防ぎ、デッドロックを回避するために何らかの方法が使用されます。このアプローチでは、制約が弱くなりますが、リソースの使用率は高くなります。
3. デッドロックを検出します。システム運用中にデッドロックが発生することを許容する システム内に検知機構を設けることで、実際にデッドロックが発生しているかどうかを迅速に検知し、デッドロックに関連するプロセスやリソースを正確に特定し、デッドロックを解消するための措置を講じることができます。
4. デッドロックを解放します。これはデッドロックの検出に伴う措置であり、プロセスをデッドロック状態から解放するために使用されます。
関連する推奨事項: 「Linux ビデオ チュートリアル 」
以上がLinux でデッドロックが発生する原因は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。