web-dev-qa-db-ja.com

Linuxカーネルは、ユーザー空間のプロセス/スレッドとカーネルタスク/ジョブの間で、CPUをどのようにスケジュールしますか

Linuxプロセスの管理とスケジューリングを理解しようとしていました。スケジューラは、優先度/時間のスライスに基づいてさまざまなプロセスをスケジュールすることを知っています。ただし、同様に処理する必要があるカーネルタスク(たとえば、プロセスをカーネルモードにするプロセスのシステムコールについては言及していません)があります(例:スケジューラ/タイマー、または永久に実行されるカーネルコード)。スケジューラが異なるプロセスに対してCPUをスケジュールするかどうか、カーネルタスクがどのように処理されるかを理解できませんでした。

4
Franc M

「システムプロセス」または「割り込み」を処理するために「インプロセス」で実行されていないカーネルタスクは、それ自体が個別のプロセスとして処理され、psの出力で確認できます。

root         2  0.0  0.0      0     0 ?        S    Sep16   0:02 [kthreadd]
root         3  0.0  0.0      0     0 ?        I<   Sep16   0:00 [rcu_gp]
root         4  0.0  0.0      0     0 ?        I<   Sep16   0:00 [rcu_par_gp]
root         6  0.0  0.0      0     0 ?        I<   Sep16   0:00 [kworker/0:0H-kblockd]
root         8  0.0  0.0      0     0 ?        I<   Sep16   0:00 [mm_percpu_wq]
root         9  0.0  0.0      0     0 ?        S    Sep16   9:11 [ksoftirqd/0]
root        10  0.2  0.0      0     0 ?        I    Sep16 173:25 [rcu_sched]
root        11  0.0  0.0      0     0 ?        I    Sep16   0:00 [rcu_bh]
root        12  0.0  0.0      0     0 ?        S    Sep16   0:20 [migration/0]
root        14  0.0  0.0      0     0 ?        S    Sep16   0:00 [cpuhp/0]
root        15  0.0  0.0      0     0 ?        S    Sep16   0:00 [cpuhp/1]

これらのプロセスは、慣れ親しんだプロセスと同じ方法でスケジュールされます。

そのようなタスクの一般的なパターンは workqueues ;です。これらのカーネルのドキュメントは非常に優れています。このトピックに興味がある場合は、このドキュメントを読むことをお勧めします。

1
Stephen Kitt