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


73

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が実行している内容に応じて、どの程度エネルギーを消費するかはわかりません。誰かがそれについても私を啓発できるなら、私は感謝するでしょう。


17
タイトルを見たとき、「何もありません」と書く誘惑に抵抗しなければなりませんでした。
バリティ

4
最新のCPUのほとんどは、アイドリング時または低負荷時にクロックレートと消費電力を動的に低下させます(動的周波数スケーリング、たとえばIntel CPUのSpeedStep)。CPUをオーバークロックすると、通常はこの動作が無効になり、アイドリング時でもCPUが最大クロックレートを維持します。
ナット

2
「ACPIの電源状態」も参照してください。プロセッサが命令の実行を停止できるが、ウェイクアップ可能なさまざまな方法があります。
pjc50

回答:


85

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

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

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


3
へえ、私は今、それを見る、ありがとう。 play_dead()HALTを実行するための非常に良いニーモニック名です。すべてのCPUにHALTを送信し、その結果ハングするリスクはありませんか?(つまり、その状況に達すると、すべてのCPUをHALTすると、カーネルのバグは正しいでしょうか?)
grochmal

30
CPUは割り込みを介してHALTから起動します。
ヨハンMyréen17年

1
@JohanMyréen-クール、それは理にかなっています。そのような場合、入力デバイスからのIRQ割り込みでさえ、それを復帰させます。ありがとう。
-grochmal

15
またはより確実に、タイマー割り込み...(ティックレス処理は魚の別のやかんです。)
スティーブンキット

3
実際、@ EJPは、アーキテクチャごとに異なる名前を持っているにもかかわらず、かなり一般的な命令です。
user253751

50

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

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

割り込み待機の仕組みは、プロセッサの機能によって異なります。最も基本的なプロセッサ設計では、それは単なる忙しいループです—

nothing:
    goto nothing

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

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


5
AVRベースのマイクロコントローラのような最も基本的な組み込みCPUでさえ、正確なモデルによってはその命令がNOPと同等であっても、WFI(割り込み待ち)命令を持っていることに注意してください。
ジョナスシェーファー

@JonasWielicki何もすることがなければ、通常はタイトなループに入るか、低電力状態になり、割り込みがあなたをノックアウトするのを待つことができると思いましたメタル」割り込み)。
ニックT

1
組み込みシステム向けに設計された@JonasWielicki Architecturesは電源管理を重視しているため、そこではWFIが重要です。多くの古いアーキテクチャにはそのようなものはありません。元の8086アーキテクチャはAFAIRではありませんでした。68kにはWFIがありますか?MIPSの標準機能ですか?私が低レベルプログラミングに精通しているのはほとんどがARMで、低消費電力は当然のことであり、WFIは電源管理の氷山の一角にすぎません。
ジル

1
@Gilles 8086には停止命令がありました。en.m.wikipedia.org/wiki/HLT_(x86_instruction)を参照してください。この命令には、80486 DX4以降の節電機能のみが含まれていました。歴史を振り返ると、HLTは既に8080とその派生物(Z80など)にありました。
-pabouk

1
@pabouk HLTは、DX4がリリースされる前に、386および486のSLバリアントをパワーダウンできました(Wikipediaの記事は正しくありません)。
スティーブンキット

0

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

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


3
うーん...それはCLONE_IDLETASKによって作成される一種のアイドルプロセスではないと思います。その場合、まったく作成する必要はありませんでした。つまり、スケジューラがCPU上のカーネルアイドルプロセスを無視した場合、ブート中にプロセスを作成する必要はありませんでした。(DWは私のものではありません:))
grochmal

少しグーグルはCLONE_IDLETASKは2002年にカーネルバージョン2.5.14を中心に導入され、後の2004年に削除されたカーネル内部のフラグであることが明らかになった
ヨハンMyréen

「」アイドルプロセスではなく、「」アイドルプロセス。
user253751
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.