LoginSignup
1
2

More than 5 years have passed since last update.

Windows スレッドスケジューラーのタイマ割り込み間隔

Last updated at Posted at 2018-11-07

概要

以前 Wondows PCのスレッドスケジューラーの周期タイマ割り込み周期を間接的な方法で調査していたので少しまとめておく。

方法

  1. Slepp()関数の待ち時間をパフォーマンスカウンタで計測する。
    最初にSleep()関数に引数0から29までを与えそれぞれ時間測定する。

  2. timeBeginPeriod()関数で15を設定する。
    Sleep()関数に引数0から29までを与えそれぞれ時間測定する。

  3. timeBeginPeriod()関数で14から1までを設定し、それぞれSleep()にかかった時間をする。

注) プロセスとスレッドの優先は以下のように設定した。
SetPriorityClass( hProcess, REALTIME_PRIORITY_CLASS );
HANDLE hThread = GetCurrentThread(); // 擬似ハンドルを返す。
SetThreadPriority(hThread, THREAD_PRIORITY_TIME_CRITICAL); //

Windows10 ファンレスPC

キャプチャファンレスPC.PNG
注) 凡例のPeriod(0)はtimeBeginPeriod()関数を呼び出す前です。
キャプチャNovo-2500E.PNG
timeBeginPeriod(1)で、なぜなスリープ時間が1 ms づづ長くなっています。

Windows10 DELL PC

キャプチャDELL-PC.PNG
キャプチャTABLE_DELL.PNG

timeBeginPeriod(1),timeBeginPeriod(2)でsleep()が変則的にずれています。
原クロックを分周するのに特別な分周期をつかっているのでしょうか。

Windows7 T510

キャプチャT510.PNG
キャプチャTable_T510.PNG
これは完ぺきな出来ですね。

Windows7 エプソンダイレクト

キャプチャEPSON DIRECT.PNG

キャプチャTableエプソン.PNG

timeBeginPeriod(1)のsleep()に問題がないのでよしとしますかな。

まとめ

DELL ノートPCとThinkPad T510は起動から周期が1msなのか、別のプロセスがtimeBeginPeriod(1)を呼び出してるかは不明です。

ThinkPad T510は、チップセットに入れるクロックの水晶発振周波数をこのために合わせているようですね。

PCにより特徴がありますが、timeBeginPeriod(1)を設定しておくとどのPCでもだいたい再現性がとれそうです。ただしCPU負荷は上がりますね。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2