0

それぞれ初期値が 1 で、3 つの変数 (x、y、z) を持つ 3 つのセマフォ (s1、s2、s3) を共有する 2 つのプロセス P1 と P2 があります。

P1:                  P2:
wait(s1);            wait(s2);  
x = x + 1;           y = y * 2;
wait(s2);            wait(s3);
y = y - x;           z = z - y;
wait(s3);            signal(s2);
z = x + 2 * y - z;   wait(s1);
signal(s3);          x = x + 2;
signal(s2);          signal(s1);
signal(s1);          signal(s3);

単一の CPU を搭載したコンピューターでそれらを同時に実行した場合、P1 と P2 がデッドロックに陥る可能性はありますか?

私が見ているのは、それらが実行を開始するとすぐに、両方とも wait() になり、何かがそれらにシグナルを送るまで座るようになるということです。他に何も実行されていないため、両方ともデッドロック状態ではありませんか? 理解を妨げている非常に単純な知識が欠けているように感じます。どんな洞察も大歓迎です!

4

4 に答える 4

0

この例の 3 つのセマフォは 1 で初期化されているため、各プロセスの最初の行でブロックされません。

次に、このサンプルの実行を検討してください。

  • P2 は、wait(s1) まで、そのステートメントが実行される直前まで実行されます。この時点で、セマフォ s2 と s1 のカウントは 1 で、s3 のカウントは 0 です。
  • P1 は、値が 0 であるため取得できない wait(s3) まで実行されますが、そこに到達するために、s1 と s2 の所有権を取得しています。
  • P2 は実行を再開しますが、s1 を待って即座にブロックされます

その時点で、両方のプロセスがデッドロック状態になります。

于 2013-03-29T01:08:48.160 に答える
0

二種類のデッドロック

1) シグナル (消耗品)

– 各タスクは別のタスクからのシグナルを待っています – バックアウトできません

2) ユニット(再利用資源)

  • 別のタスクがリソース ユニットを解放するのを待っている各タスク。他のタスクを解放するのに十分なリソースが利用可能になるまで、タスクを中止することでバックアウトできます。

信号デッドロック

図:信号のデッドロック

最初、セマフォ a と b は両方とも 1 です。デッドロック

 if P1 and P2 complete their
first wait’s simultaneously before
attempting their second wait’s

.

シグナルのデッドロックをテストするのは簡単ではないかもしれません:

簡単にテストできない

デッドロックが発生する可能性があります

 if P1 calls T(a,b) and
P2 calls T(b,a) at the same time.
于 2013-03-29T01:15:02.153 に答える
0

P2 が (s1) を待機するとき、s1 は P1 の手にある必要があるため、P2 はシグナル (S3) に進むことができず、P1 は (s3) を永遠に待機します。これがデッドロックです。

于 2013-03-29T01:02:19.333 に答える
-1

いいえ、それらは異なるプロセスであるためです。あなたはミューテックスについて話していると思いますよね?

于 2013-03-29T01:00:13.067 に答える