2010/05/08

Sleep祭り(?)

http://blogs.wankuma.com/jitta/archive/2010/05/08/188819.aspx#FeedBack


http://blogs.wankuma.com/episteme/archive/2010/05/08/188833.aspx

その他。



事の発端は置いといてて。

Sleep(1000)の測定結果がいろいろあがっています。

何れも約1000mSec経過後、処理を再開という面では揃っているのですが、Sleep()のexit条件である、経過mSecは「1000mseecを超えた時点」ではないのね。

結果をみると、Windows OSの時刻カウンタが 15mSecなのでね、998~1014の範囲でExitしているようです。

これって、脱出判定の要素自体、15mSecでバウンドされているのかなぁ。

1000mSec以下でExitする仕様が、どうもスッキリしない。1000msecを超えた時点..としたら 1002~1017msecでexitするので、誤差が大きくなるからでしょうか。

「目覚めよ」イベントの発生はスレッド/タスクコントローラが行っているのでしょうから、そこの判定単位の問題かな。



高解像度タイマーで計測すれば、1msecでもSleep()可能なんでしょうが、仕様変更になるからできないのかも。

Client系のOSでのSQL Serverの Timer値も、15msec単位ですし。



ついでに気になったのは、Sleep(1000)で、最大でも 1013msecで目覚めているようですが、1100msecで目覚めても、仕様通りな訳ですよね。

他のスレッドやタスクの状況で変わるのでしょうが、 sleep(1000)が 1200msecなどの、大幅に遅れて目覚めるような、テスト環境って作れるのだろうか。

ノンプリマルチタスクで無限ループにすると、目覚めることすらできないと思う。 Sleep()で遊ぶのは難しそうです。



今回のSleep()騒動は、精密ドライバーが必要な場に、大工道具のドライバーを持ち込んで、且つ使い方が間違っているようなもので、なんともはや....な思いでした。

しかしそのお陰で、気にとめていなかった、Sleepの奥深さを知ることができて、良かったです。

お疲れ様でした。

0 件のコメント:

コメントを投稿