web-dev-qa-db-ja.com

Linuxでスワッパータスクが必要なのはなぜですか?

アイドルタスク(別名スワッパータスク)は、タスクスケジューリングの時点で実行キューに実行可能なタスクがなくなったときに実行されるように選択されます。しかし、この特別なタスクの使用法は何ですか?別の質問は、ユーザーランドからの「ps aux」出力(PID = 0)でこのスレッド/プロセスが見つからない理由です。

43
jscoot

その理由は、歴史的で計画的です。アイドルタスクとは、他のタスクを実行できない場合に実行したタスクのことです。優先順位が最も低いため、他のタスクを実行できないようになっています。

プログラム上の理由:特別なケースである「実行可能なタスクがない場合はどうなるか」という特別なケースを気にする必要がないため、これによりプロセスのスケジューリングが大幅に簡略化されます。また、タスクごとに使用されるCPU時間をカウントすることもできます。アイドルタスクがない場合、どのタスクがcpu-timeを取得しても、誰も必要ありません。

歴史的な理由:ステップダウンまたは省電力モードに入ることができるCPUができる前は、いつでもフルスピードで実行する必要がありました。実行可能なタスクがない場合は、一連のNOP命令を実行しました。今日、アイドルタスクのスケジューリングは通常、HLT命令(停止)を使用してCPUをステップダウンするため、電力が節約されます。したがって、私たちの時代のアイドルタスクにはなんとか機能があります。

Windowsでは、プロセスリストにアイドルタスクが表示されます。これはアイドルプロセスです。

35
bl4ckb0l7

Linuxカーネルは、IO /ミューテックスなどで「ブロック」されるプロセスのウェイトリストを維持します。実行可能なプロセスがない場合、アイドルプロセスは、待機キューからのタスクによってプリエンプトされるまで実行キューに配置されます。

タスクがある理由は、IO /ロックなどのブロックのためにカーネルが浪費している時間を(概算)で測定できるようにするためです。さらに、コードをアイドルタスクとしてのカーネルは、カーネルの動作の変更をより困難にする可能性がある「特殊なケース」のアイドルタスクではなく、コンテキストスイッチに必要なすべてのタスクと同じです。

17
Spence

実際にはCPUごとに1つのアイドルタスクがありますが、メインタスクリストには保持されず、代わりにCPUの「struct rq」runqueue構造体に、struct task_struct *として存在します。

これは、(そのCPUで)何もする必要がない場合はいつでもスケジューラーによってアクティブになり、低電力状態でCPUをアイドル状態にするためのアーキテクチャ固有のコードを実行します。

10
MarkR

Ps -efを使用すると、実行中のプロセスの数がリストされます。次に、最初のリンクで、スワッパータスクである最初のpid-0をリストします。

2
user1082080