塩田紳二シェアツイートする一覧スレッドの終了はタイマー割り込み単位でQuantumの測定はCPUの動作周波数単位で行なう。Quantum単位で実行時間を測定すると、CPUの動作速度に対して値が大きすぎて、途中に入った割り込み処理を正確に把握できなくなるからだ。Windowsはもともと、タイマー割り込みのみで実行時間を測定していた。Quantumはその頃からの名残である。CPUの高速化とともに、高精度なハードウェアタイマーが利用できるようになると、スレッドの実行時間は正確に把握できるようになった。そのためには、スレッドを止めてカウンターの値を読み出し、残り時間などを計算する必要がある。ところがこの頻度を上げてしまうと、それによる負荷だけでも馬鹿にならない時間が必要になる。一方でスレッドの残り時間測定は、15.6ミリ秒のタイマー割り込み周期で行なう。それ以外に、I/O割り込みなどでもスケジューラー(ディスパッチャー)が動作するので、そのタイミングでも実行中のスレッドの残り時間を測定できる。先に述べたとおり、スレッドに割り当てられた時間はフォアグラウンドで18Quantum、バックグラウンドでは6Quantumになる。割り込み処理やスレッド切り替えのためのコンテキストスイッチなどの時間を除いて、スレッドに割り当てられた時間がすぎると、次のタイマー割り込みが入ったときにスレッドは終了される。終了タイミングはタイマー割り込みの周期に左右されるが、スレッドの起動はタイマー割り込みとは無関係であり、割り込み周期の途中でスレッドが起動されるほうが確率的に多い。ところが次のタイマー割り込みまでの間に、ほかの割り込み処理やコンテキストスイッチが入るなどして、起動されたスレッドがほとんど実行できないことがある(図1)。タイマー割り込み間隔とスレッドの実行時間の関係を図にしてみた。x86はモデル固有レジスター(MSR)に「タイム・スタンプカウンタ」があり、クロック周波数でカウントを続けている。これを使うことで、起動や割り込みのタイミングを知ることが可能だ。コンテキストスイッチのときに値を保存し、戻ってきたときの値から引くことで、ほかの処理に使われていた時間を求められる。このようにしてスレッドの正味の実行時間を測定することが可能になる。アプリケーションの起動直後は必要な処理が多いため、最低限でも割り込みタイマー周期(3Quantum)程度は、連続して実行させなければならない。同じ優先順位で別のスレッドが起動されていた場合には、こちらも次に実行するスレッド(の候補のひとつ)になる。Windowsはこうした状況を把握して、Quantumの残り時間を計測し、短いときには割り込みで中断させることなく、タイムスライスを割り当てるように処理する。Quantumを単位として測定していたのでは、1Quantum未満の処理が入ったときに見逃してしまい、十分な時間実行されたと判断される可能性がある。Quantumの残り時間は、CPUの動作周波数を用いた高い精度で測定されている。ベスト53分間のリフレッシュ新体験。スマホお気に入り一覧マイページ。