Linuxプロセスの管理とスケジューリングを理解しようとしていました。スケジューラは、優先度/時間のスライスに基づいてさまざまなプロセスをスケジュールすることを知っています。ただし、同様に処理する必要があるカーネルタスク(たとえば、プロセスをカーネルモードにするプロセスのシステムコールについては言及していません)があります(例:スケジューラ/タイマー、または永久に実行されるカーネルコード)。スケジューラが異なるプロセスに対してCPUをスケジュールするかどうか、カーネルタスクがどのように処理されるかを理解できませんでした。
「システムプロセス」または「割り込み」を処理するために「インプロセス」で実行されていないカーネルタスクは、それ自体が個別のプロセスとして処理され、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 ;です。これらのカーネルのドキュメントは非常に優れています。このトピックに興味がある場合は、このドキュメントを読むことをお勧めします。