web-dev-qa-db-ja.com

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

Linux Documentation ProjectからLinuxプロセスについて読んでいます: https://www.tldp.org/LDP/tlk/kernel/processes.html

プロセスは常にシステムコールを実行しているため、待機する必要がある場合があります。それでも、プロセスが待機するまで実行される場合は、CPU時間が不相応に使用される可能性があるため、Linuxはプリエンプティブスケジューリングを使用します。このスキームでは、各プロセスは200msの短い時間実行できます。この時間が経過すると、別のプロセスが選択されて実行され、元のプロセスは再び実行できるまでしばらく待機します。この少量の時間は、タイムスライスと呼ばれます。

私の質問は、この時間はどのように追跡されているのですか?プロセスが現在CPUを使用している唯一のプロセスである場合、時間が経過したかどうかを実際に確認することはありませんよね?

プロセスがsyscallにジャンプし、それらがスケジューラに戻ることを理解しているので、その点でプロセスを「スワップ」する方法は理にかなっています。しかし、Linuxは、プロセスがCPUで費やした時間をどのように追跡できるのでしょうか。ハードウェアタイマーを介してのみ可能ですか?

17
Nexuist

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

あなたがあなたの/proc/interruptsタイマーを含め、システムで使用されている割り込みが見つかります。

Linuxにはいくつかの異なるタイプのスケジューラーがあり、古典的な定期タイマースタイルはめったに使用されないことに注意してください- Completely Fair Scheduler(CFS)のドキュメント から:

CFSはナノ秒の粒度のアカウンティングを使用し、jiffieやその他のHZの詳細に依存しません。したがって、CFSスケジューラーには、以前のスケジューラーが持っていた方法のような「タイムスライス」の概念がなく、ヒューリスティックもまったくありません。

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

25