0

次のプログラムは、3 つの並行プロセスと 3 つのバイナリ セマフォで構成されます。セマフォは、S0=1 S1=0 S2=0 として初期化されます。

プロセス P0:

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

プロセス P1:

wait(S1);
release (S0);

プロセス P2:

wait(S2);
release (S0);

PO 印刷 '0' は何回処理されますか??

(A) 少なくとも 2 回 (b) ちょうど 2 回 (c) ちょうど 3 回 (d) ちょうど 1 回

これで、プロセス P1 と P2 が 1 回実行されるか、プロセス P0 のような while ループがないため、1 回実行した後に続行するという混乱があります。1 回だけ実行する場合、私によると、答えは (b) 、そしてそれらが再び実行される場合、答えは (A) になります。

事前に感謝を助けてください

4

6 に答える 6

3

だけなので、最初P0は実行されS0=1ます。単一の 0 を出力します。

S1S2がリリースされるとP0、それらのいずれかを実行できます。

P1 が S0 を実行してリリースするとします (S0 の値は 1 です)。

P0実行できるか実行できるかの 2 つの可能性がありますP2

P2execute とreleaseを取りましょうS0。最後に P0 は 0 を実行して出力します (2 つの 0 を意味します)。しかし、P0それより前に実行するP2と、合計 3 つの 0 が出力されます (一度に 1 つ、P0次にP2releaseS0P0再度実行されます)。

したがって、完璧な答えは少なくとも 2 つの 0 です。

于 2012-10-05T18:10:48.870 に答える
1

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

  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:44:14.643 に答える
0

質問とコードを読んで、私も言います(A)。タスクを完了する前にプロセスをプリエンプトすることはできないと想定しています。

初期状態はS0=1 S1=0 S2=0であり、私たちが知っていることから、P1正確P2に 1 回実行されます。

並行プロセスは複雑になる可能性がありますが、私が考える方法で人々が欠点を見つける流れを説明しようとしています。それは問題ありません。私も学ぶためにここにいます。

ここで、プロセスの順序に応じて異なる結果が得られる状況がいくつかあります。

P0 -> P1 -> P0 -> P2 -> P0 = Three times

P0 -> P1 -> P2 -> P0 = Twice

P0 -> P2 -> P1 -> P0 = Twice

これにより、少なくとも 2 倍の答えが得られます。

編集:

これはすべて、semaphore == 0 のときに wait() がブロックされ、release() が semaphore = 1 を設定するという仮定の下で行われます。

プロセスがいつでも中断できる場合、物事は興味深いものになります。

P0 starts out running because S0=1 at start
P0 print '0';
P0 release(S1);
-- here S1 may take over or not --
P0 release(S2);
-- here S2 may take over or not --
P0 goes back to wait(S0)
-- here P0 continues or if S1 *and* S2 have not run blocks --
-- it may also be that only S1 or S2 ran and now the other will run --

今、私は物事がどのようにうまくいくかを視覚化する方法を見つけようとしましたが、それをコードブロックに入れる良い方法を見つけることができませんでした.

S1 と S2 の両方ができるだけ早く実行された場合、セマフォはバイナリであり、2 つの状態のうちの 1 つしか存在できないため、P0 は 2 回しか実行されませんが、P0 が通過するまで S1 または S2 のいずれかを遅らせるほどスケジューリングがひねくれている場合P0 が 3 回実行されます。

しかし、この質問は中断可能なプロセスを意図したものではなかったと思います。

于 2012-08-22T11:21:24.560 に答える
0

私は、wait() がセマフォをデクリメントし、<= 0 になるとブロックすると想定していますが、リリースするとカウンターが増加し、次のプロセスが起動します。

コードを考えると、P1 と P2 は 1 回実行されます (それらの周りにループはありません)。これは、それぞれが S0 を 1 回トリガーすることを意味します。また、P0 はすべての印刷の前に S0 を待機するブロックとして、最終的に「0」を 2 回印刷します。

P0 は S0 が 0 の場合にのみブロックされるため、S0 の初期状態を確認する必要があります。これは、ステートメントが与えられた場合です。したがって、答えは、P0 が 0 を正確に2 回出力するということです。

于 2012-08-22T08:48:21.037 に答える
0

S0 = 1、S1 = 0、S2 = 0 として、最初は P0 のみが while ループ内に入ることができます。P0 は最初に「0」を出力し、次に S1 と S2 を解放した後、P1 または P2 のいずれかが実行され、S0 が解放されます。したがって、0 が再度出力されます。

于 2015-12-29T17:00:46.827 に答える
0

S0=1 のみであるため、P0 が最初に実行されます。したがって、(初めて) 0 が出力されます。また、P0 は S1 と S2 をリリースします。S1=1かつS2=1なので、P1またはP2のいずれかを実行することができる。P1 が S0 を実行して解放すると仮定します (S0 の値 = 1)。P1 プロセスが完了していることに注意してください。ここで、S0=1 および S2=1 であるため、P0 または P2 のいずれかを実行できます。両方の条件を確認しましょう:-

  1. P2 が実行され、S0 を解放してその実行が完了すると仮定します。ここで P0 が実行されます。S0=0 であり、0 (つまり、秒の 0) を出力します。その後、S1 と S2 をリリースします。ただし、P1 プロセスと P2 プロセスはすでに実行を終了していることに注意してください。再び P0 が実行を試みると、S0=0 のためスリープ状態になります。したがって、「0」が出力される最小回数は 2 です。

  2. ここで、P0 が実行されたとします。したがって、S0=0 (wait(S0) のため) となり、0 (秒の 0) を出力し、S1 と S2 を解放します。P1 は既に実行を完了しており、S0 = 0 であるため P0 は実行できないため、P2 のみが実行できます。P2 は S0 を実行して解放し (つまり、S0=1)、実行を終了します。ここで P0 が実行を開始し、再び 0 (thrid 0) を出力し、S1 と S2 を解放します (現在 S0=0 であることに注意してください)。P1 と P2 は既に実行を完了しているため、再び P1 の番になりますが、S0=0 であるため、スリープ状態になります。また、P0 をウェイクアップできるプロセス P1 と P2 はすでに実行を終了しています。したがって、「0」が出力される最大回数は 2 です。

参照: http://www.btechonline.org/2013/01/gate-questions-os-synchronization.html

于 2013-01-22T10:59:46.550 に答える