0

以下の解決策がクリティカルセクション問題の解決基準を満たさないのはなぜですか?

3つの状況のうち、満足できないのはどれ?
1. 相互排除
2. 進歩
3. 限界待ち

相互排除を満たしていることはわかっていますが、2 & 3 はどうでしょうか。
宿題ではありませんのでご注意ください。いろいろ考えましたがまだはっきりしません。

[編集]
画像を削除し、コードを追加しました。

Pi’s Algorithm    
    Var flag : array [ i…j] of boolean    
    repeat  
    flag [i] = true;    
While ( flag [j]  == “ true ”) do no-op;        


            Critical section


Flag [i]=“ false ”;
 until false

別のプロセス

Pj’s Algorithm    
    Var flag : array [ i…j] of boolean
repeat  
  flag [ j ] = true;
While ( flag [ i ]  == “ true ”) do no-op;  


        Critical section


Flag [j]=“ false ”;
 until false
4

1 に答える 1

0

システムがデッドロックしている可能性があります。

2 つのプロセス: P1、P2。i と j はプロセスの ID であり、flags 配列と同様に共有変数であると仮定します。

次に、P1 が実行を開始します。

flag[1] := true;

-> ここで、P1 がスケジューラによって中断され、P2 が実行を開始します。

flag[2] := true;
while (flag[1] == true) do nop ;

→ P2 はこのループに留まります。その後、スケジューラは再び P1 を選択します。

while (flag[2] == true) do nop;

-> P1 もループに陥ります。進展なし。これはデッドロックになるため、#2 と #3 に違反します。さらに、プロセスの 1 つが枯渇する可能性もあります (もう 1 つのプロセスは常にコード全体を実行し、flag[i] := false と flag[i] := true の間で中断されることはないため、最初のプロセスは取得されません)。 while ループを抜けるチャンスです。

于 2012-06-20T11:48:19.957 に答える