Linuxはプリエンプティブスケジューリングをどのように実装しますか?

Linuxはプリエンプティブスケジューリングをどのように実装しますか?

Linux Documentation Projectでは、Linuxプロセスの内容を読んでいます。 https://www.tldp.org/LDP/tlk/kernel/processes.html

プロセスは常にシステムコールを行うため、しばしば待つ必要があります。それにもかかわらず、プロセスが待機する前に実行を続けると、まだCPU時間を過度に使用できるため、Linuxはプリエンプティブスケジューリングを使用します。このシナリオでは、各プロセスを200msという短時間実行することを許可し、この時間が経過すると他のプロセスを実行することを選択し、元のプロセスを再実行できるまでしばらく待ちます。この小さな時間をタイムピースと呼びます。

私の質問は、この時間をどのように追跡できるかということです。現在のプロセスがCPUを占有している唯一のプロセスであれば、実際に時間が経過したことを確認できるものはないでしょうか?

プロセスがシステムコールにジャンプしてからスケジューラにジャンプすることがわかっているので、そのような点でプロセスを「交換」する方法は合理的です。しかし、Linuxはプロセスが使用するCPU時間をどのように追跡できますか?ハードウェアタイマーでのみ達成できますか?

答え1

短い答えは「はい」です。すべての実用的なプリエンプション方法は、ある種のCPU割り込みを使用して特権モードのLinuxカーネルスケジューラに戻ります。

システムを見ると/proc/interrupts、タイマーを含むシステムで使用される割り込みを見つけることができます。

Linuxには多くの種類のスケジューラがあり、古典的な周期的なタイマースタイルはほとんど使用されていません。完全公正なスケジューラ(CFS)文書:

CFS はナノ秒の粒度計算を使用し、 jiffies やその他の HZ の詳細に依存しません。したがって、CFSスケジューラには、以前のスケジューラと同じ「タイムスライス」という概念がなく、経験的な方法もありません。

また、プログラムがシステムコール(通常ソフトウェア割り込み - 「トラップ」を介して)を発行すると、カーネルは呼び出しプログラムをプリエンプトすることもできます。これは、他のプロセスからのデータを待つシステムコールで特に顕著です。

関連情報