デッドロックに必要な 4 つの条件
相互排他条件: リソースは排他的かつ排他的に使用され、プロセスはリソースを相互に使用します。つまり、リソースは常に 1 つのプロセスによってのみ使用できます。他のプロセスがリソースを申請し、そのリソースが別のプロセスによって占有されている場合、申請者は占有者によってリソースが解放されるまで待機します。 (推奨される学習: MySQL ビデオ チュートリアル )
非剥奪条件: プロセスによって取得されたリソースは、使い果たされる前に他のプロセスによって強制的に剥奪されません。ただし、リソースを解放できるのは、リソースを取得したプロセスだけです。
リクエストと保持の条件: プロセスが必要なリソースの一部を申請するたびに、新しいリソースを申請しながら、割り当てられたリソースを占有し続けます。
ループ待機条件: デッドロックが発生した場合、P1 が占有されるリソースを待機しているプロセス待機キュー {P1, P2,...,Pn} が存在する必要があります。 P2、P2 は P3 が占有するリソースを待機しています。リソース、...、Pn は P1 が占有するリソースを待機し、プロセス待機ループを形成します。ループ内の各プロセスが占有するリソースは、別のプロセスによって申請されます。同時に、つまり、前のプロセスは、後のプロセスが占有しているリソースを占有します。
上記はデッドロックを引き起こす 4 つの必要条件を示していますが、システム内でデッドロックが発生している限り、上記 4 つの条件のうち少なくとも 1 つは当てはまります。実際、ループ待ちが成立するということは、最初の 3 つの条件が成立することを意味しており、列挙する必要はないと思われますが、これらの条件を考慮することは、デッドロックの発生を防ぐことができるため、デッドロックの防止に有益です。 4 つの条件のいずれかを破棄します。
デッドロックの防止
デッドロックの発生に必要な 4 つの条件を破ることでデッドロックを防ぐことができます。リソースの相互排他はリソース使用に固有の機能であるため、変更することはできません。
「不可分」状態の破棄: プロセスが必要なすべてのリソースを取得できない場合、プロセスは待機状態になります。待機期間中、プロセスが占有しているリソースは暗黙的に解放され、再度追加されます。システムのリソース リストは他のプロセスによって使用されており、待機中のプロセスは、元のリソースと新しく適用されたリソースを回復した場合にのみ再起動して実行できます。
「リクエストとホールドの条件」を破棄します。最初の方法は静的割り当てです。つまり、各プロセスは、実行開始時に必要なすべてのリソースに適用されます。 2 つ目は動的割り当てです。これは、各プロセスが必要なリソースを適用するときに、システム リソースを占有しないことを意味します。
「循環待機」状態を打破する: リソースの秩序ある割り当てを採用します。基本的な考え方は、システム内のすべてのリソースに順番に番号を付け、供給が不足していて希少なものには大きな番号を使用することです。リソースの場合は、番号付けに従う必要があります。プロセスは、より小さい番号を取得した場合にのみ、より大きい番号のプロセスを申請できます。
MySQL 関連の技術記事の詳細については、MySQL チュートリアル 列にアクセスして学習してください。
以上がデッドロックが発生するための必要条件の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。