アイドル状態の CPU プロセスは何を行いますか?

アイドル状態の CPU プロセスは何を行いますか?

の源泉を見るとstraceそこにはクローン フラグの使用方法CLONE_IDLETASKが次のように説明されていました。

#define CLONE_IDLETASK 0x00001000 /* kernel-only flag */

さらに詳しく調べてみると、このフラグは では説明されていないものの、man clone実際にはカーネルがブート プロセス中に使用して、マシン上の各 CPU に対してアイドル プロセス (すべて PID 0 を持つ) を作成することがわかりました。つまり、8 つの CPU を持つマシンでは、少なくとも 7 つの (以下の質問を参照) このようなプロセスが「実行中」になります (引用符に注意)。

さて、このことから、その「アイドル」プロセスが実際に何をするのかという疑問がいくつか生じます。私の推測では、アイドル プロセスは、その時間枠が終了し、カーネルが実際のプロセスを実行するか、アイドル プロセスを再度割り当てるまで、NOP 操作を継続的に実行するか (CPU が使用されていない場合) します。しかし、これは完全な推測です。つまり、

  1. たとえば、8 つの CPU を搭載したマシンでは、このようなアイドル プロセスが 7 つ作成されますか? (ユーザー空間の作業を実行していない間、1 つの CPU はカーネル自体によって保持されますか?)

  2. アイドル プロセスは、実際には NOP 操作の無限ストリームにすぎませんか? (または、同じことを実行するループですか)。

  3. CPU 使用率 (たとえばuptime) は、アイドル プロセスが CPU 上でどのくらい長く実行されていたか、また一定期間にどのくらい長く実行されていなかったかによって単純に計算されるのでしょうか。


PS この質問の大部分は、CPU の動作を完全に理解していないことが原因である可能性があります。つまり、アセンブリ、タイムフレーム、割り込みについては理解していますが、たとえば、CPU が実行内容に応じてエネルギーをより多くまたはより少なく使用する方法がわかりません。その点についても、どなたか教えていただければ幸いです。

答え1

アイドル タスクはプロセス アカウンティングに使用され、またエネルギー消費を削減するためにも使用されます。Linux では、プロセッサごとに 1 つのアイドル タスクが作成され、そのプロセッサにロックされます。その CPU で実行する他のプロセスがない場合、アイドル タスクがスケジュールされます。アイドル タスクに費やされた時間は、などのツールでは「アイドル」時間として表示されますtop。(稼働時間は別の方法で計算されます。)

Unixには常に何らかのアイドルループがあったようです(ただし、必ずしも実際のアイドルタスクとは限りません。ジルの答え)、そしてV1でもそれはWAIT命令を使用したこれは割り込みが発生するまでプロセッサを停止する(「割り込みを待つ」という意味)。他のオペレーティングシステムではビジーループが使用されていたが、DOSではOS/2、特に初期のWindowsのバージョンでは、CPUはこのような「待機」命令を使用してエネルギー消費と発熱を抑えてきました。アイドルタスクのさまざまな実装は、たとえばarch/x86/kernel/process.cLinuxカーネルでは、基本的なものはHLTは、割り込みが発生するまでプロセッサを停止します(そしてC1省エネモードを有効にします)。他の実装は、さまざまなバグや非効率性に対処します(例えばMWAIT(一部の CPU ではの代わりにを使用しますHLT)。

これらはすべて、プロセスがイベント (I/O など) を待機しているときのアイドル状態とは完全に別です。

答え2

プロセス スケジューラの教科書的な設計では、スケジューラにスケジュールするプロセスがない場合 (つまり、すべてのプロセスがブロックされ、入力を待機している場合)、スケジューラはプロセッサ割り込みを待機します。割り込みは、周辺機器からの入力 (ユーザー アクション、ネットワーク パケット、ディスクからの読み取り完了など) を示す場合もあれば、プロセス内のタイマーをトリガーするタイマー割り込みである場合もあります。

Linux のスケジューラには、何もする必要がないケースのための特別なコードはありません。代わりに、何もする必要がないケースを特別なプロセス、つまりアイドル プロセスとしてエンコードします。アイドル プロセスは、他のプロセスがスケジュールできない場合のみスケジュールされます (実質的に、無限に低い優先度を持ちます)。アイドル プロセスは実際にはカーネルの一部です。つまり、カーネル スレッド、つまりプロセス内のコードではなくカーネル内のコードを実行するスレッドです (より正確には、各 CPU に 1 つのスレッドがあります)。アイドル プロセスが実行されると、割り込み待ち操作が実行されます。

割り込み待ちの動作はプロセッサの能力によって異なります。最も基本的なプロセッサ設計では、これは単なるビジーループです。

nothing:
    goto nothing

プロセッサは分岐命令を永遠に実行し続けますが、これでは何も達成されません。最近の OS のほとんどは、他に優れた機能がないプロセッサ上で実行されている場合を除き、これを行いません。ほとんどのプロセッサには、より優れた機能があります。部屋を暖める以外の何もせずにエネルギーを費やすよりも、理想的には、プロセッサをオフにする必要があります。そのため、カーネルは、プロセッサ自体をオフにするか、少なくともプロセッサの大部分をオフにするように指示するコードを実行します。少なくとも 1 つの小さな部品、割り込みコントローラが電源がオンのままである必要があります。周辺機器が割り込みをトリガーすると、割り込みコントローラはプロセッサのメイン (一部) にウェイクアップ信号を送信します。

実際には、Intel/AMD や ARM などの最新の CPU には、多くの複雑な電源管理設定があります。OS は、プロセッサがアイドル モードに留まる時間を予測し、それに応じてさまざまな低電力モードを選択します。これらのモードでは、アイドル時の電力使用量と、アイドル モードの開始と終了にかかる時間との間でさまざまな妥協点が提供されます。一部のプロセッサでは、プロセスが CPU 時間をあまり消費していないことがわかった場合、OS はプロセッサのクロック レートを下げることもできます。

答え3

いいえ、アイドル タスクは CPU サイクルを無駄にしません。スケジューラは単にアイドル プロセスを実行対象として選択しないだけです。アイドル プロセスは、続行できるように何らかのイベントが発生するのを待機しています。たとえば、read()システム コールの入力を待機している場合があります。

ちなみに、カーネルは独立したプロセスではありません。カーネル コードは常にプロセスのコンテキストで実行されます (カーネル スレッドの特殊なケースを除く)。そのため、「ユーザー空間の作業を実行していない間、1 つの CPU がカーネル自体によって保持される」と言うのは正しくありません。

関連情報