8

プロセスの同期を行っていますが、セマフォを理解するのが困難です。だからここに私の疑問があります:

ソースはそれを言います

「セマフォSは、標準のアトミック操作、つまりwait()およびsignal()を介してアクセスされる整数変数です。

また、wait()の基本的な定義も提供しました

wait(Semaphore S)
{
   while S<=0
     ; //no operation
   S--;
}

signal()の定義

signal(S)
{
   S++;
}

セマフォの初期値を1とし、クリティカルセクションの操作を同時に実行することを想定していない2つの並行プロセスP0とP1があるとします。

ここで、P0がクリティカルセクションにあるため、セマフォSの値は0である必要があります。次に、P1がクリティカルセクションに入り、wait()を実行し、wait()で継続的にループし、ループを終了するとします。セマフォ値はインクリメントする必要がありますが、ソースによると、wait()は不可分操作であり、中断できないため、プロセスP0はシングルプロセッサシステムでsignal()を呼び出すことができないため不可能な場合があります。

知りたいのですが、これまでの理解が正しいかどうかです。そして、正しければ、プロセスP1がwhileループでヒットしたときに、プロセスP0がsignal()を呼び出すのはなぜですか?

4

6 に答える 6

5

ソースの不正確さだと思います。Atomic操作とは、wait()その各反復が であることを意味しatomic、意味S--は中断なしで実行されますが、操作全体はループS--内の各完了後に中断可能です。while

于 2012-11-23T13:17:34.270 に答える
0

タスクが使用できないセマフォを取得しようとすると、セマフォはタスクを待機キューに入れ、タスクをスリープ状態にします。その後、プロセッサは他のコードを自由に実行できます。セマフォが使用可能になると、上のタスクの1つが待機キューが起動され、セマフォを取得できるようになります。

S<=0の場合; //操作なしこれは、プロセッサがこのコードを実行していることを意味するものではありません。プロセス/タスクは、セマフォを取得するまでブロックされます。

于 2013-02-27T08:43:03.850 に答える