あなたの質問は具体的に示されていません。 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が実行されている可能性があります。