1つ:デッドロックとは?
- 2つ以上のプロセスがリソースを占有すると、それらはすべて互いに一定量のリソースを占有します。ただし、他のリソースを取得したいのですが、リソースが他のプロセスによって占有されている可能性が高く、これにより閉塞が発生します。前進できなくなります。それによりデッドロック。
たとえば、AとBの2つのプロセスがあります。Aはリソースaを保持してbリソースを待機し、Bはリソースbを保持してリソースを待機しています。どちらのプロセスも別のリソースを待機しており、デッドロックを形成している間はリソースを解放しません。
1. 次に、デッドロックを回避したい場合は、デッドロックの状態を理解します。
① 条件
- 相互に排他的な状態:プロセスは、割り当てられたリソースの排他制御を必要とします。つまり、特定のリソースは、ある期間だけプロセスによって占有されます。
-
リクエストアンドホールド条件:リソースのリクエストによりプロセスがブロックされた場合、取得したリソースをホールドします。
- 剥奪されない条件:プロセスが取得したリソースは、それが使い切られる前に剥奪することはできず、それが使い果たされた場合にのみそれ自体によって解放できます。
- ループ待機状態:デッドロックが発生すると、プロセス(リソースの循環チェーン)が存在する必要があります。
2.デッドロックを生成する方法を理解し、それを回避または解決する方法を教えてください。
- 1回限りのリソース割り当て:すべてのリソースが一度に割り当てられるため、これ以上リクエストはありません:(リクエスト条件を破棄します)
- 1つのリソースを割り当てることができない限り、他のリソースはこのプロセスに割り当てられません:(破棄して条件を維持してください)
- Deprivable resources:つまり、プロセスが一部のリソースを取得しても他のリソースを取得できない場合、占有されているリソースを解放します(不可分の状態の破壊)
- 順序付けされたリソース割り当て方法:システムは各タイプのリソースに番号を割り当て、各プロセスは増加する番号順にリソースを要求し、解放は反対です(ループ待機状態を解除)
①デッドロックを検出
- 最初に、各プロセスと各リソースに一意の識別子を指定します
- 次に、リソース割り当てテーブルとプロセス待機テーブルを作成します
デッドロックを検出するユーティリティツール:
- jstackコマンドjstackは、Java仮想マシンに付属するスタックトレースツールです。jstackは、特定のJavaプロセスID、コアファイル、またはリモートデバッグサービスのJavaスタック情報を出力するために使用されます。Jstackツールを使用して、現時点でのJava仮想マシンのスレッドスナップショットを生成できます。スレッドスナップショットは、現在のJava仮想マシンの各スレッドによって実行されているメソッドスタックのコレクションです。スレッドスナップショットを生成する主な目的は、スレッド間のデッドロック、デッドループ、外部リソースによって引き起こされる長期的な要求など、スレッドの長い一時停止の原因を特定することです。待つ時間。スレッドが一時停止したら、jstackを介して各スレッドの呼び出しスタックを確認します。応答しないスレッドがバックグラウンドで実行していること、またはスレッドが待機しているリソースを確認できます
- JConsoleツールJconsoleは、JDKに付属する監視ツールで、JDK / binディレクトリにあります。これは、実行中のローカルまたはリモートJVMを接続し、Javaアプリケーションのリソース消費とパフォーマンスを監視し、多数のチャートを描画して強力な視覚的インターフェースを提供するために使用されます。そして、それ自体が占有するサーバーメモリは非常に小さく、ほとんど消費されていないとさえ言えます。
②デッドロックの解消方法
- リソースの奪取:デッドロック状態を解放するために、他のプロセスからデッドロックプロセスに十分な量のリソースを奪います
- 元に戻すプロセス:十分なリソースが利用可能になり、デッドロック状態が解消されるまで、デッドロックプロセスまたは最小コストのプロセスを直接元に戻すことができます。いわゆるコストとは、優先度、ランニングコスト、プロセスの重要性と値などを指します。