1

あるシステムでは、以下に示すように、S1、S2、および S3 の 3 つのセマフォを使用して、3 つのスレッドの実行が同期されます。セマフォ S1 と S2 はゼロに初期化され、セマフォ S3 は 1 に初期化されます。3 つのセマフォはすべて、以下に示すコードのセクションでのみ使用されます。

Thread A   Thread B  Thread C
...        ...       ...
P(S1)      P(S2)     P(S3)
P(S1)      P(S1)     V(S1)
x=3*x+4    x=x+7     x=x*5
V(S2)      V(S2)     V(S1)
V(S1)      V(S1)     V(S3)

... ... ...

変数 x が整数の共有変数として定義され、1 に初期化され、上記以外のコードのセクションで値が割り当てられていない場合、すべてのスレッドの実行が終了したときの値はどうなるでしょうか? 3 つのセマフォの値はどうなるでしょうか?

オペレーティング システム試験の準備のために、この過去の論文を解こうとしています。変数 x がどのように変更されるか、および 3 つのセマフォがどのように連携するかがわかりません。セマフォがどのように連携し、変数がどのように変更されるかを順を追って説明していただければ幸いです。

他にも練習用の同様の例がある場合は、ためらわずにリンクしてください。

4

1 に答える 1

1

このプロセスを見ていきましょう。

開始する前に、ウィキペディアの記事: セマフォ プログラミング: セマンティクスと実装のセクションをお読みください。P() および V() 演算子の機能について説明します。

初期:S1=0、S2=0、S3=1

  1. スレッド A は S1 を減分し、スレッド B は S2 を減分します。S1=-1、S2=-1。これらの値は負であるため、これらのスレッドは両方ともブロックされます。

    ステータス: S1=-1、S2=-1、S3=0、S1 でスレッド A がブロック中 (命令 1)、S2 でスレッド B がブロック中 (命令 1)、スレッド C がブロックされていない (命令 1)、x = 1

  2. スレッド C は、現在 0 である S3 をデクリメントします。これは負ではないため、このスレッドはブロックされません。スレッド C は S1 をインクリメントします。S1 でブロックしているスレッド 1 は、すぐに S1 のブロックを解除して再度デクリメントし、再びブロックさせます。

    ステータス: S1=-1、S2=-1、S3=0、S1 でスレッド A がブロックされている (命令 2)、S2 でスレッド B がブロックされている (命令 1)、スレッド C がブロックされていない (命令 3)、x = 1

  3. スレッド C はx=x*5、x を 1 から 5 に変更する を実行します。次に、スレッド C は S1 をインクリメントします。S1 でブロックしているスレッド 1 は、すぐにブロックを解除します。その後、スレッド C は S3 を再びインクリメントして終了します。

    ステータス: S1=0、S2=-1、S3=1、スレッド A はブロックしていない (命令 3)、スレッド B は S2 でブロックしている (命令 1)、スレッド C は完了、x = 5

  4. スレッド A が を実行するx=3*x+4と、x が 5 から 19 に変更されます。次に、スレッド A は S2 をインクリメントします。S2 でブロックしているスレッド B は、すぐにブロックを解除します。その後、スレッド A は S1 を再度インクリメントして終了します。

    ステータス: S1=1、S2=0、S3=1、スレッド A が完了、スレッド B がブロックされていない (命令 2)、スレッド C が完了、x = 19

  5. スレッド B は S1 を減分し、現在はゼロです。これは負ではないため、継続して を実行しx=x+7、x を 19 から 26 に変更します。次に、スレッド B は S2 をインクリメントし、次に S1 をインクリメントして終了します。

    最終ステータス: S1=1、S2=1、S3=1

次に、各セマフォの P() および V() 呼び出しを数えて結果を再確認し、何も見落としていないことを確認しましょう。ループがなく、3 つのスレッドすべての各命令が 1 回だけ実行されたため、これを簡単に行うことができます。

  • S1 の初期値は 0 です。3 回の P(S1) 呼び出しで、-3 にデクリメントされます。4 回の V(S1) 呼び出しにより、それが 1 にインクリメントされました。結果は、最終的な S1 = 1 を示しています
  • S2 の初期値は 0 です。1 回の P(S2) 呼び出しで、その値が -1 に減少しました。2 つの V(S2) 呼び出しにより、それが 1 にインクリメントされました。結果は、最終的な S2 = 1 を示しています
  • S3 の初期値は 1 です。1 回の P(S3) 呼び出しで、その値が 0 に減少しました。1 回の V(S3) 呼び出しで、それが 1 に増加しました。結果は、最終的な S3 = 1 を示しています

テストうまくいくといいね!

于 2014-01-08T20:41:09.093 に答える