web-dev-qa-db-ja.com

アイドルCPUプロセスは何をしますか?

strace のソースを見ると、クローンフラグCLONE_IDLETASKが使用されていることがわかりました。

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

詳細に調べたところ、そのフラグはman cloneでカバーされていませんが、実際には、ブートプロセス中にカーネルによって使用され、CPU上の各CPUのアイドルプロセス(すべてPID 0が必要)が作成されます。機械。つまり、8個のCPUを搭載したマシンでは、そのようなプロセスが少なくとも7つ(下記の質問を参照)「実行」されます(引用符に注意)。

さて、これにより、その「アイドル」プロセスが実際に何をするのかについて、いくつか質問があります。私の想定では、タイムフレームが終了するまでNOPオペレーションが継続的に実行され、カーネルが実際のプロセスを割り当てて実行するか、アイドルプロセスを再度割り当てます(CPUが使用されていない場合)。しかし、それは完全な推測です。そう:

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

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

  3. CPU使用率(たとえばuptime)は、アイドルプロセスがCPU上でどれだけの時間であり、特定の期間中にそれがなかった時間だけで単純に計算されますか?


追伸この質問のかなりの部分は、CPUがどのように機能するかを完全に理解していないという事実に起因している可能性があります。つまり、私はアセンブリ、時間枠、および割り込みを理解していますが、たとえば、CPUが実行しているものに応じて、CPUがどのように多かれ少なかれエネルギーを使用することができるかわかりません。誰かに教えてもらえたらありがたいです。

75
grochmal

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

Unixには常にある種のアイドルループがあったようです(ただし、必ずしも実際のアイドルタスクである必要はありません。 Gillesの回答 を参照してください)。V1でも WAIT命令を使用しました これにより、割り込みが発生するまでプロセッサが停止しました(「割り込みを待つ」という意味でした)。他のいくつかのオペレーティングシステムは、ビジーループ、DOS、 OS/2 、特に初期のバージョンのWindowsを使用していました。かなり以前から、CPUはこの種の「待機」命令を使用して、エネルギー消費と熱生成を削減しています。たとえば、Linuxカーネルの _Arch/x86/kernel/process.c_ でアイドルタスクのさまざまな実装を確認できます。基本的なものは HLT を呼び出すだけで、割り込みが発生するまでプロセッサを停止します(およびC1省エネモードを有効にします)、他の実装は、さまざまなバグまたは非効率を処理します(egMWAITの代わりに一部のCPUではHLTを使用します)。

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

88
Stephen Kitt

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

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

割り込みを待つ方法は、プロセッサの機能によって異なります。最も基本的なプロセッサ設計では、これはビジーループにすぎません—

nothing:
    goto nothing

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

実際には、Intel/AMDやARM=などの最近のCPUには、多くの複雑な電源管理設定があります。OSは、プロセッサがアイドルモードにとどまる時間を推定し、さまざまな低電力モードを選択します。これに応じて、モードによって、アイドル時の電力使用量と、アイドルモードに入る時間とアイドルモードから出る時間との間で異なる妥協案が提供されます。一部のプロセッサでは、OSは、プロセスが動作していないことを検出すると、プロセッサのクロックレートを下げることもできます。多くのCPU時間を消費します。

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

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

0
Johan Myréen