1

次の質問が現れたとき、私はバイナリセマフォを研究していました。

3 つの同時プロセスと 3 つのバイナリ セマフォがあるとします。セマフォは S0=1、S1=0、S2=0 として初期化されます。プロセスには次のコードがあります。

Process P0:                   Process P1:                       Process P2:

while (true){                 wait(S1);                         wait(S2);
wait (S0);                    release (S0);                     release(S0);
print '0';
release (S1);
release (S2);
}

問題は、プロセスが 0 を何回出力するかです。

私がどのようにそれを解決していたかを説明しましょう.. 3 つのプロセスの最初の 3 つのステートメントが同時に実行されるとします! つまり、プロセス p0 の while ステートメント、プロセス p1 の wait(S1) およびプロセス P2 の wait(S2) .. ここで、wait(S1) と wait(S2) の両方がセマフォ値を -1 にし、プロセス P1そして P2 はブロックされます。次に、プロセス P0 の wait(S0) が実行されます。これが発生すると、S0 の値が 0 になり、プロセス P0 がブロック状態になり、その結果、すべてのプロセスがブロックされ、デッドロック状態になります!! しかし、残念ながらそれは答えではありません。. どこが間違っているのか、解決方法を教えてください。:|

編集

バイナリ セマフォに対する私のアプローチは間違っていました.. 0 と 1 しか取りません!

4

1 に答える 1

0

わかりました..だからここで私は自分の質問に答えています:P ..

解決策は次のように進みます。

  1. プロセス P0 のみが最初に実行できます。これは、プロセス P0 によって使用されるセマフォ、つまり S0 の初期値が 1 であるためです。P0 が S0 で待機を呼び出すと、S0 の値は 0 になり、S0 が P0 によって取得されたことを意味します。プロセス P1 と P2 に関する限り、S1 と S2 でそれぞれ wait を呼び出すと、セマフォが既に取得済み、つまり 0 として初期化されているため、先に進むことができず、S1 と S2 が解放されるまで待機する必要があります。

  2. P0 が最初に実行され、0 が出力されます。次のステートメントは S1 と S2 を解放します。S1 が解放されると、プロセス P1 の待機は終了し、S1 の値が 1 だけ上がり、取得されていないというフラグが立てられます。P1 は S1 を取得し、S1 を取得済みにします。プロセス P2 も同様です。

  3. さて、only one of P1 or P2 can execute, because either of them can be in the critical section at a given time.. P2 が実行されたとします。S0 を解放して終了します。

  4. 次に P1 を実行させます。P1 は S0 のリリースを開始し、終了します。

  5. Now only P0 can execute because its in a while loop whose condition is set to true, which makes it to run always.P0 は印刷を 0 秒実行し、S1 と S2 を解放します。しかし、P1 と P2 は既に終了しているため、P0 は S0 の解放を永遠に待ちます。

0 を 3 回出力する 2 番目のソリューションを次に示します。

  1. P0 が開始され、0 が出力され、S1 と S2 がリリースされます。

  2. P2 を実行させます。P2 が開始し、S0 を解放して終了します。この後、P0 または P1 のみが実行できます。

  3. P0 を実行させます。2 回目に 0 を出力し、S1 と S2 を解放します。この時点で、P1 のみが実行できます。

  4. P1 が開始し、S0 を解放し、P1 が終了します。この時点では、条件が true に設定されている while ループ内にあるため、P0 のみが実行できます。

  5. P0 が起動し、3 回目に 0 を出力し、S1 と S2 を解放します。その後、誰かが S0 を解放するのを待ちますが、これは決して起こりません。

atleast twiceしたがって、答えはちょうど 2 倍またはちょうど 3 倍になり、「 」とも言えます。

どこか間違っていたら教えてください!!

于 2012-10-18T03:40:44.110 に答える