スレッドの終了はタイマー割り込み単位で
Quantumの測定はCPUの動作周波数単位で行なう。Quantum単位で実行時間を測定すると、CPUの動作速度に対して値が大きすぎて、途中に入った割り込み処理を正確に把握できなくなるからだ。Windowsはもともと、タイマー割り込みのみで実行時間を測定していた。Quantumはその頃からの名残である。
CPUの高速化とともに、高精度なハードウェアタイマーが利用できるようになると、スレッドの実行時間は正確に把握できるようになった。しかしそのためには、スレッドを止めてカウンターの値を読み出し、残り時間などを計算する必要がある。ところがこの頻度を上げてしまうと、それによる負荷だけでも馬鹿にならない時間が必要になる。
一方でスレッドの残り時間測定は、15.6ミリ秒のタイマー割り込み周期で行なう。もちろんそれ以外に、I/O割り込みなどでもスケジューラー(ディスパッチャー)が動作するので、そのタイミングでも実行中のスレッドの残り時間を測定できる。
先に述べたとおり、スレッドに割り当てられた時間はフォアグラウンドで18Quantum、バックグラウンドでは6Quantumになる。割り込み処理やスレッド切り替えのためのコンテキストスイッチなどの時間を除いて、スレッドに割り当てられた時間がすぎると、次のタイマー割り込みが入ったときにスレッドは終了される。
終了タイミングはタイマー割り込みの周期に左右されるが、スレッドの起動はタイマー割り込みとは無関係であり、割り込み周期の途中でスレッドが起動されるほうが確率的に多い。ところが次のタイマー割り込みまでの間に、ほかの割り込み処理やコンテキストスイッチが入るなどして、起動されたスレッドがほとんど実行できないことがある(図1)。
特に、アプリケーションの起動直後は必要な処理が多いため、最低限でも割り込みタイマー周期(3Quantum)程度は、連続して実行させなければならない。しかし、同じ優先順位で別のスレッドが起動されていた場合には、こちらも次に実行するスレッド(の候補のひとつ)になる。
Windowsはこうした状況を把握して、Quantumの残り時間を計測し、短いときには割り込みで中断させることなく、タイムスライスを割り当てるように処理する。Quantumを単位として測定していたのでは、1Quantum未満の処理が入ったときに見逃してしまい、十分な時間実行されたと判断される可能性がある。だからQuantumの残り時間は、CPUの動作周波数を用いた高い精度で測定されている。
この連載の記事
-
第13回
PC
ARM版Windows 8実現の布石となったWindows 7の「MinWin」 -
第12回
PC
アプリがWindowsの機能を使うには? APIとDLLの仕組み -
第10回
PC
AMD FX向けにパッチで修正 スケジューラーが抱える難題 -
第9回
PC
マルチコアCPUを賢く使いこなす スケジューリングの秘密 -
第8回
PC
意味の違いがわかる? タスクとプロセスとスレッド -
第7回
PC
Windowsのメモリー管理をx86の仕組みから読み解く -
第6回
PC
メモリー不足を根本的に解決する64bit OSの仕組み -
第5回
PC
Windows 8でMetro Styleアプリを動かす「WinRT」 -
第4回
PC
Windowsを動かすデバイスドライバーの仕組み 前編 -
第3回
PC
OSの仕事はハードウェアをアプリから「隠す」こと? - この連載の一覧へ