os/rtos が「アイドル タスク」をスケジュールするのは理にかなっているように思えます。その場合、消費電力ではないでしょうか?(アイドルタスクが実行されるのは合理的に思えます: while (true) {} )
4 に答える
これは、OS と CPU アーキテクチャによって異なります。x86 (Intel 互換) では、オペレーティング システムがHLT命令を実行する可能性があり、ハードウェア割り込みなどの興味深いことが発生するまで CPU を待機させます。これはおそらくほとんど電力を消費しません。オペレーティング システムは、これに費やされた時間を「アイドル」として報告し、それを架空の「アイドル」プロセスに割り当てることさえあります。
したがって、Windows タスク マネージャーで、システム アイドル プロセスが 90% の CPU を消費していることがわかった場合、実際には、その CPU には 90% の時間実行するための実際のプログラムがないことを意味します。
これについては、良い記事があります:アイドル状態の CPU は何をしますか?
歴史的には、特にアイドル時の消費電力の削減が問題になる前は、さまざまなスキームがありました。
通常、最も低い優先度で実行される「アイドル」プロセス/タスクがあり、他に何もすることがない場合は常に制御を取得します。多くの古いシステムでは、このプロセスは単純に「永遠に実行する」ループを実行し、ループ本体には何の影響もありませんでした。私が聞いた 1 つの OS は、アイドル プロセスでマシン診断を実行していました。初期の PC の多くは、メモリ リフレッシュ ルーチンを実行していました (メモリを定期的に循環させる必要があり、そうしないとメモリが「蒸発」してしまうため)。
(このスキームの利点は、100% からアイドル プロセスで使用されている CPU の % を差し引いて、CPU の使用率を計算できることです。これは、OS 設計者に高く評価された機能です。)
しかし、最近のほとんどのシステムでは、「停止」命令または「待機」命令を実行するか、プロセス制御ブロックに特別なフラグを設定して、実行を停止して省電力モードに移行するようプロセッサに直接指示するのが一般的です。
実行するコードは常にあります。アイドル タスクは、他に何もない場合のコードです。ハードウェア割り込みが到着するまで、CPU の電源を切る特別な CPU 命令を実行する場合があります。x86 CPU ではhlt
(停止) です。
この回答は、Windows NT ベースの OS に固有のものです。
アイドルスレッド機能
タスクはアーキテクチャによって異なる場合がありますが、一般的にアイドル スレッドによって実行されるタスクは次のとおりです。
- 割り込みを有効にして、保留中の割り込みを配信できるようにします
- 割り込みを無効にします (
STI
またはCLI
命令を使用、wiki で詳細) DEBUG
(またはチェック済みの) ビルドで、カーネル デバッガーがアタッチされているかどうかを照会し、要求された場合はブレークポイントを許可します- 遅延プロシージャ コールの処理
- 実行可能な実行可能なスレッドがあるかどうかを確認します。存在する場合は、スレッドへのポインタでアイドル プロセッサ制御ブロックを更新します。
- 他のプロセッサのキューを確認し、可能な場合は、アイドル状態のプロセッサで実行を待機するスレッドをスケジュールします
- 電源管理ルーチンを呼び出します。これにより、プロセッサが停止したり、CPU ティック レートがダウングレードされたり、その他の同様の省電力アクティビティが実行されたりする可能性があります。
追加情報
論理プロセッサの実行可能なスレッドがない場合、Windows はカーネル モードのアイドル スレッドを実行します。論理プロセッサと同じ数のアイドル スレッドを持つアイドル プロセスは 1 つだけです。したがって、4 つの論理/物理プロセッサを搭載したクアッド コア マシンでは、1 つのアイドル プロセスと 4 つのアイドル スレッドが存在します。
Windows では、アイドル プロセスの ID = 0 であるため、すべてのアイドル スレッドも同様です。EPROCESS/KPROCESS
これらのオブジェクトは、標準およびETHREAD/KTHREAD
データ構造によって表されます。ただし、これらはエグゼクティブ マネージャーのプロセスおよびスレッド オブジェクトではありません。ユーザーランドのアドレス空間はなく、ユーザーランドのコードは実行されません。
アイドル プロセスは、プロセス マネージャとオブジェクト マネージャがセットアップされる前に、システムの起動時に静的に割り当てられます。アイドル スレッド構造は、論理プロセッサがアクティブになると動的に割り当てられます。
アイドル スレッドの優先度は 0 に設定されています。ただし、このスレッドは実行できるスレッドが他にない場合にのみ実行されるため、この値は実際には重要ではありません。アイドル スレッドの優先度は、他のスレッドの優先度と比較されることはありません。
アイドル スレッドもプリエンプションの特殊なケースです。アイドル スレッドのメイン ルーチンKiIdleLoop
( reactosからの実装) は、他のスレッドによって中断されないいくつかのタスクを実行します。プロセッサで実行できる実行可能なスレッドがない場合、そのプロセッサはプロセッサ制御ブロックでアイドルとしてマークされます。次に、実行可能なスレッドが実行のためにスケジュールされたキューに到着すると、そのスレッドのアドレス ポインターがアイドル状態のプロセッサ制御ブロックのポインターに格納されます。アイドル スレッドの実行中に、このポインター アドレスは、ループ内の反復ごとにチェックされます。NextThread
while
出典: Windows 内部。M.ルシノビッチ。第6版。パート1、p.453 - 456。