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]
これらのプロセスは、使い慣れたプロセスと同じ方法でスケジュールされます。
このようなタスクの一般的なパターンはワークキューです。それらのカーネルドキュメントは非常に優れています。トピックに興味がある場合は、それを読むことをお勧めします。