状況に応じて、poll
andselect
呼び出し(Basile Starynkevitchがコメントで言及)またはセマフォ(Alsが回答で言及)が要求を待つ正しい方法です。poll
またはのないオペレーティングシステムでselect
は、同様のものがあるはずです。
次の理由により、、、またはこれを行う適切な方法ではありませsleep
ん。YieldProcessor
sched_yield
YieldProcessor
プロセスをsched_yield
実行可能キューの最後に移動するだけで、実行可能のままにします。その結果、同じかそれ以上の優先度の他のプロセスの実行が許可されますが、それらのプロセスが実行されると(または実行されない場合)、呼び出したプロセスYieldProcessor
またはsched_yield
実行を継続するプロセスが実行されます。これは2つの問題を引き起こします。1つは、優先度の低いプロセスはまだ実行されないということです。もう1つは、これにより、プロセッサが常にエネルギーを使用して実行されるようになることです。オペレーティングシステムは、プロセスを実行する必要がないことを認識し、プロセッサを低電力状態にすることをお勧めします。
sleep
この低電力状態を許可する場合がありますが、次の要求が着信するまでの時間について推測ゲームを実行し、必要がないときにプロセッサを繰り返しウェイクアップし、要求に対するプロセスの応答性を低下させます。サービスのリクエストがあった場合でも、プロセスはリクエストされた時間が経過するまでスリープ状態を継続します。
poll
および呼び出しは、まさにこの状況のためselect
に設計されています。これらは、このプロセスがI / Oチャネルの1つで着信する要求を処理することを望んでいるが、それ以外の場合は実行する作業がないことをオペレーティングシステムに通知します。これにより、オペレーティングシステムはプロセスを実行不可としてマークし、適切な場合はプロセッサを低電力状態にすることができます。
セマフォを使用すると同じ動作が得られますが、プロセスをウェイクアップする信号が、I / Oチャネルで発生するアクティビティではなく、セマフォを上げる別のプロセスから送信される点が異なります。セマフォは、何らかの作業を行うための信号がこのように到着した場合に適しています。poll
状況に適したセマフォまたはセマフォのいずれかを使用するだけです。
poll
、、、またはセマフォがカーネルモード呼び出しを引き起こすという批判select
は関係ありません。他のメソッドもカーネルモード呼び出しを引き起こすからです。プロセスはそれ自体ではスリープできません。オペレーティングシステムを呼び出して要求する必要があります。同様にYieldProcessor
、sched_yield
オペレーティングシステムにリクエストを送信します。