5

相互排除とデッドロックをそれぞれ次のように定義します。相互排除条件は、各共有リソースが常に 1 つのプロセスに割り当てられているか、使用可能である場合に存在します。セット内の各プロセスが、セット内の別のプロセスのみが発生できるイベントを待機している場合、プロセスのセットはデッドロック状態になります。

たとえば、バイナリ セマフォが使用され、そのうちの 1 つだけが同時にクリティカル領域に入ることができるようにします。各プロセスはクリティカル領域に入る直前にダウンし、クリティカル領域から出た直後にアップするため、相互排除が保証されます。

デッドロックが発生するには 4 つの条件がすべて満たされている必要があることを理解しています。そのうちの 1 つは、相互排除条件です (2 つのプロセスがクリティカル セクション内に同時に存在することはできません)。

相互排除が保証されているので、この場合、プログラムはデッドロックフリーですか?

よろしく。

4

1 に答える 1

6

必ずしも。これらの2つのスレッドを想像してみてください。

 Thread 1          Thread 2
 ============      =============
 Acquire A         Acquire B
 Acquire B         Acquire A
 Release B         Release A
 Release A         Release B

ここでは、相互排除が実際に保証されています-各瞬間に、セマフォAとBはスレッドの1つによって所有されているか、システム全体で使用可能です-しかし、スレッド1と2がそれぞれ最初のロック(スレッド1、Bの場合はA)を取得すると、デッドロックが発生する可能性がありますスレッド2)の場合、ただし、もう一方が保持しているリソースを待機してデッドロックします。

お役に立てれば!

于 2013-03-05T04:20:44.563 に答える