Linux Documentation ProjectからLinuxプロセスについて読んでいます: https://www.tldp.org/LDP/tlk/kernel/processes.html
プロセスは常にシステムコールを実行しているため、待機する必要がある場合があります。それでも、プロセスが待機するまで実行される場合は、CPU時間が不相応に使用される可能性があるため、Linuxはプリエンプティブスケジューリングを使用します。このスキームでは、各プロセスは200msの短い時間実行できます。この時間が経過すると、別のプロセスが選択されて実行され、元のプロセスは再び実行できるまでしばらく待機します。この少量の時間は、タイムスライスと呼ばれます。
私の質問は、この時間はどのように追跡されているのですか?プロセスが現在CPUを使用している唯一のプロセスである場合、時間が経過したかどうかを実際に確認することはありませんよね?
プロセスがsyscallにジャンプし、それらがスケジューラに戻ることを理解しているので、その点でプロセスを「スワップ」する方法は理にかなっています。しかし、Linuxは、プロセスがCPUで費やした時間をどのように追跡できるのでしょうか。ハードウェアタイマーを介してのみ可能ですか?
短い答えはイエスです。プリエンプションへのすべての実際的なアプローチは、ある種のCPU割り込みを使用して、特権モード、つまりLinuxカーネルスケジューラに戻ります。
あなたがあなたの/proc/interrupts
タイマーを含め、システムで使用されている割り込みが見つかります。
Linuxにはいくつかの異なるタイプのスケジューラーがあり、古典的な定期タイマースタイルはめったに使用されないことに注意してください- Completely Fair Scheduler(CFS)のドキュメント から:
CFSはナノ秒の粒度のアカウンティングを使用し、jiffieやその他のHZの詳細に依存しません。したがって、CFSスケジューラーには、以前のスケジューラーが持っていた方法のような「タイムスライス」の概念がなく、ヒューリスティックもまったくありません。
また、プログラムがシステムコールを発行すると(通常はソフトウェア割り込み-"トラップ")、カーネルは呼び出しプログラムをプリエンプトすることもできます。これは、他のプロセスからのデータを待つシステムコールで特に顕著です。