2017-07-30 2 views
2

スレッドSがsemaphore.signal()と呼ばれ、スレッドW1、W2がそのセマフォを待機していたとします。セマフォとコンテキストスイッチとの間の相互作用

セマフォセマンティクスは、3つのスレッドがスケジュールされる順序を保証していないことを知っています。しかし、パフォーマンスの意味を理解するために、私は典型的な実装の振る舞いを理解したかったのです。そのうちの一つは、即座にそれを再び遮断するために持っていることを発見し、これ遡ると、

  1. W1とW2 両方がCPUを取得するウェイクアップすること :具体的に(一般的に使用されるセマフォの実装のために)

    寝るため?

  2. semaphore.signal()コールから戻る前にスリープ状態になるのですか?または、signal()コールがなければ、CPUにとどまっているでしょうか?

答えて

0

あなたの質問は具体的に示されていません。 W1から

ONEスレッド、W2は、あなたが不十分スケジューラ/ディスパッチャの設定や状態を指定しているので、それは明らかではないの後に何が起こる

を「W」と呼んで、セマフォ信号によって準備が設定されます。

空いているコアがある場合、Sは引き続き実行され、Wはスペアコアにディスパッチされます。

空いているコアがない場合、WはSを実行していたコアにS:Wがディスパッチされ、Sが実行可能な状態になり、コアが実行されるのを待ちます。

空いているコアがない場合、カーネルは別のコアで実行されている別のスレッドを優先してWを優先します。したがって、SとWの両方が実行されます。

具体的に:

W1とW2の両方が、CPUはそれらの一つ即座にそれが再びブロックすることがあることを発見 ので、スリープ状態に戻って を行くと、ウェイクアップされ得るのだろうか?

なぜ、どのようなOSですか?それは利益のない余分な仕事の積み重ねです。 1つのシグナルがセマフォによって受信されるので、1つのスレッドはデキューされ、準備ができます。もう一方はブロックされたままであり、セマフォスレッドキュー内で別の信号を待機しています。 「目を覚ます」必要はありません。

セマフォから返される前にスリープされますか。シグナル( )?それとも、signal()呼び出しがなくても のままであれば、CPUに残りますか?

シグナリングスレッドSが実行状態のままである必要はありません。 OSのカーネルスケジューリングアルゴリズムと状態が別のコアでWを実行できる場合、Sは実行を継続できます。 SがWによってプリエンプトされた場合、それはもはや実行されておらず、コアが使用可能になるのを待ってカーネルレディキューにスタックされます。 Wはただ準備ができていて、ディスパッチされていない可能性があり、Sが実行されている可能性があります。

関連する問題