#概要
以前 Wondows PCのスレッドスケジューラーの周期タイマ割り込み周期を間接的な方法で調査していたので少しまとめておく。
方法
-
Slepp()関数の待ち時間をパフォーマンスカウンタで計測する。
最初にSleep()関数に引数0から29までを与えそれぞれ時間測定する。 -
timeBeginPeriod()関数で15を設定する。
Sleep()関数に引数0から29までを与えそれぞれ時間測定する。 -
timeBeginPeriod()関数で14から1までを設定し、それぞれSleep()にかかった時間をする。
注) プロセスとスレッドの優先は以下のように設定した。
SetPriorityClass( hProcess, REALTIME_PRIORITY_CLASS );
HANDLE hThread = GetCurrentThread(); // 擬似ハンドルを返す。
SetThreadPriority(hThread, THREAD_PRIORITY_TIME_CRITICAL); //
#Windows10 ファンレスPC
注) 凡例のPeriod(0)はtimeBeginPeriod()関数を呼び出す前です。
timeBeginPeriod(1)で、なぜなスリープ時間が1 ms づづ長くなっています。
timeBeginPeriod(1),timeBeginPeriod(2)でsleep()が変則的にずれています。
原クロックを分周するのに特別な分周期をつかっているのでしょうか。
timeBeginPeriod(1)のsleep()に問題がないのでよしとしますかな。
#まとめ
DELL ノートPCとThinkPad T510は起動から周期が1msなのか、別のプロセスがtimeBeginPeriod(1)を呼び出してるかは不明です。
ThinkPad T510は、チップセットに入れるクロックの水晶発振周波数をこのために合わせているようですね。
PCにより特徴がありますが、timeBeginPeriod(1)を設定しておくとどのPCでもだいたい再現性がとれそうです。ただしCPU負荷は上がりますね。