- ベストアンサー
sleep関数の精度について
こんにちは。 この掲示板やみなさまには、大変お世話になっています。ありがとうございます。 そこで、質問ですが、 sleep関数を用いて、スレッドを一時停止させたりしたいのですが、sleep関数の精度はどれくらいあるのでしょうか? 1msの精度を出すことはできるのでしょうか・・・ Sleep(1)とSleep(10)では、違いが無いような気がします。 そもそも、無理なことでしょうか? よろしくお願いします。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
環境が分からないので正確なことは何も分かりませんが... > sleep関数の精度はどれくらいあるのでしょうか? POSIXのsleep関数のことであれば、引数を1秒単位でしか指定できないので、1msの精度を出すことはそもそも無理です。 http://www.linux.or.jp/JM/html/LDP_man-pages/man3/sleep.3.html > Sleep(1)とSleep(10)では、違いが無いような気がします。 Win32 APIのSleepは1ms単位で指定しますが、それほど高い分解能はありません。 http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/jpdllpro/html/_win32_sleep.asp
その他の回答 (5)
- matyrcry
- ベストアンサー率47% (101/213)
No.4です。ごめんなさい。書き違いがありました。 指摘どおり、きっちり遅延できたのはnanosleep()のほうです。 確かにうちのは2.4カーネルで、スケジューリングは10msです。 select()はタイムアップ後にスケジューラが起こしてくれるまで 遅延するので周期起床用の休眠の代わりに使ってます。
- rinkun
- ベストアンサー率44% (706/1571)
No.4さんへの補足ですが Linux 2.6カーネルだとタイマー割込み周期は1ミリ秒です。最小待ちは2ms程度になるでしょう。 また前に見た(Linux2.4のころの)nanosleepの実装ではリアルタイム・プロセスで2ミリ秒以下の待ちを指定するとビジーウェイトするようになってました。これを使うと精度は出せますがCPU負荷が高すぎますね。 # nanosleepのマニュアルによるとこの機能は2.6カーネルでは削除されているようです
お礼
ご提示ありがとうございます。 Redhat環境が、身近にありましたので今後試してみたいと思います。 今後とも、よろしくお願いします。
- matyrcry
- ベストアンサー率47% (101/213)
LInuxだとusleep()やnanosleep()がありますよ。 類似機能を探してみては。 RedHatだとselect()で2ms以下を指定すればCPUタイマから すぐに起床しました。 優先度を上げてやらないと起床タイミングはカーネルのスケ ジューリング周期(たいてい10msかと)に支配されると 思います。
お礼
書き込みありがとうございます。 今後とも御教授よろしくお願いします。
- rinkun
- ベストアンサー率44% (706/1571)
sleepのような時間待ち処理の精度はOSのタイマー割込み周期に依存します。 この周期は少し前までのWindowsやPC用Linuxでは10msが普通でした。最近のPC用Linuxでは1msになっていますが、Windowsの最新状況は未確認です。 時間待ち処理では、このOSタイマー割込み処理にプロセスを登録して待ちに入り、指定時間を越えた最初のタイマー割込みでプロセスを起こします。 このため精度は概ねタイマー割込み周期程度、最小待ち時間はタイマー割込み周期の倍程度になります。 これ以上の短時間待ちにはCPUを使いつつ待ついわゆるビジーウェイトが必要ですが、この間は他のプロセスが止まりますし、普通のプロセスではCPU時間の使いすぎでプリエンプトされる可能性もあるのであまりお薦めではないです。
お礼
書き込みありがとうございます。 Linuxで1msの精度を出せると言う事なので、今後試してみたいと思います。
- ymmasayan
- ベストアンサー率30% (2593/8599)
msで指定できるということとms刻みで動いてくれるということとは別です。 5msを指定すると5ms後にウエイクアップしますが それは実行可能状態になるだけです。 他に動いているプロセスや実行を待っているプロセスとの関係で いつ動き出すかは保証されません。 やはり、1msレベルでの指定をしても無意味でしょう。
お礼
書き込みありがとうございます。 1msから10ms間の精度が欲しいものです・・・ また、よろしくお願いします。
補足
書き込みありがとうございます。 OS:Windows XP ソフト:Visual C++ 7.0ですが、C言語をしています。 Sleep以外の関数でも、ほぼ同様のことが言えてしまうのでしょうか? 1msの精度を得るためには、ダミー処理(ループを使った簡単な計算)をさせることで、回避できないものか・・・と思っています・・・。