デッドロック
デッドロックとは、オペレーティング システムまたはソフトウェアが実行されている状態です。マルチタスク状態で、1 つ以上のプロセスが待機しているときです。システム リソースがシステム自体または他のプロセスによって占有されている場合、デッドロックが形成されます。発生するデッドロックの最も一般的な形式は、2 つ以上のスレッドが別のスレッドによって占有されるリソースを待機する場合です。
両方のシーケンスが同時に発生すると、スレッド 1 は決して実行できなくなります。ロック B はスレッド 2 によって所有されているため、ロック B が取得されます。同時に、ロック A はスレッド 1 によって所有されているため、スレッド 2 はロック A を取得できません。
デッドロックの発生条件
デッドロックが発生するには、次の4つの条件を満たす必要があります。
①相互排他的条件: は、プロセスによる割り当てられたリソースの排他的使用を指します。つまり、リソースは一定期間内に 1 つのプロセスによってのみ占有されます。この時点でリソースを要求している他のプロセスがある場合、要求者はリソースを占有しているプロセスが使い果たされて解放されるまで待つことしかできません。
②要求と保持の条件: は、プロセスが少なくとも 1 つのリソースを保持しているが、新しいリソース要求を行っており、そのリソースが他のプロセスによって占有されていることを意味します。要求元のプロセスはブロックされていますが、彼は取得したリソースをまだ保持しています。
③ 非剥奪条件: はプロセスが取得したリソースを指し、使用終了前に剥奪することはできず、使用終了後にのみ解放できます。
④ループ待機条件: は、デッドロックが発生したときに、プロセス (つまり、プロセス セット {P0, P1,...) 内にリソースの循環チェーンが存在する必要があることを意味します。 ,Pn} P0 は P1 によって占有されるリソースを待機し、P1 は P2 によって占有されるリソースを待機します。...、Pn は P0 によって占有されるリソースを待機します。
デッドロックの回避方法と対処方法
デッドロックの回避:デッドロックを回避する方法は、4 つの条件のうち 2 番目と 3 番目を満たしていることです。 、デッドロックを回避するために 4 つの条件のうち 1 つが成立することはできません。
① ロック順序: 同じ順序でロックします。
複数のプロセスが同じロックを必要とし、異なる順序でロックを追加すると、デッドロックが発生しやすくなります。すべてのプロセスが同じ順序でロックを取得することが保証できれば、デッドロックは発生しません。
②ロック時間制限: プロセスがロックを取得しようとするときに、特定の時間制限を追加します。
つまり、ロックの申請時に制限時間を超過すると、プロセスはロックの要求を放棄し、取得したすべてのロックを解放します。その後、ランダムな時間が経ってからもう一度試してください。このランダムな時間により、他のスレッドに同じロックの取得を試行する機会が与えられ、アプリケーションはロックを取得せずに続行できるようになります。問題は、同じバッチのリソースを同時に競合するプロセスが多数ある場合、タイムアウトとロールバックのメカニズムがある場合でも、一部のプロセスが繰り返し試行してもロックを取得できないという問題が依然として発生する可能性があることです。
デッドロックの回避: この方法も事前の予防戦略ですが、デッドロックの 4 つの必要条件を破壊するために事前にさまざまな制限措置を講じる必要はありません。リソースの動的割り当て中にシステムが安全でない状態に陥るのを防ぎ、デッドロックを回避する方法です。
デッドロック検出: これは主に、順次ロックが達成できず、ロック時間制限が実現できない状況を目的としています。
設定された検出メカニズムにより、デッドロックの発生をタイムリーに検出し、デッドロックに関連するプロセスとリソースを正確に特定します。その後、システムで発生したデッドロックを解消するための適切な措置を講じてください。
プロセスがロックを取得すると、そのロックはプロセスとロックに関連するデータ構造に記録されます。そして、プロセスがロックを要求するたびに、それがこのデータ構造に記録されます。プロセスがロックの要求に失敗した場合、スレッドはプロセスを走査してデータ構造をロックし、デッドロックが発生したかどうかを判断できます。
例:
プロセス A はロック 2 を要求しますが、ロックはプロセス B によって 2 回占有されているため、プロセス A はプロセス B を待ちます。同様に、プロセスBはプロセスCを待ち、プロセスCはプロセスDを待ち、プロセスDはプロセスAを待ちます。プロセス A がデッドロックを検出するには、B によって要求されたすべてのロックを段階的に検出する必要があります。プロセス B が要求した場所から開始して、プロセス A はプロセス C を見つけ、次にプロセス D を見つけます。プロセス D が要求したロックがプロセス A 自身によって占有されていることがわかり、デッドロックが検出されます。
プロセス A がデッドロックを検出した場合、実行可能な方法は、プロセス A が保持しているロックを解放し、ロールバックし、ランダムな時間が経過した後に再試行することです。これは、デッドロックがすでに発生していることを除けば、ロック時間制限と似ています。
デッドロック救済: デッドロックの検出に合わせた措置です。
プロセスがデッドロックしていることが判明した場合、そのプロセスは直ちにデッドロック状態から解放される必要があります。1 つの方法は、リソースを奪うことです。デッドロック状態を緩和するために、デッドロックプロセスに対して他のプロセスから十分な量のリソースを奪います。 もう 1 つの方法は、プロセスをキャンセルすることです。プロセスをキャンセルする最も簡単な方法は、デッドロックしたプロセスをすべて強制終了することです。もう少し穏やかな方法は、使用可能なリソースが十分にある場合に、何らかの順序でプロセスを 1 つずつキャンセルすることです。 推奨チュートリアル: PHP ビデオ チュートリアル
以上がPHP開発におけるファイルのデッドロックを回避する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。