sleepは文字通り眠る形になり、CPU負荷はかけない。
OSのプロセス監視対象が100個どころか1000個になったからといって、
昨今のパソコンであれば、その監視に要する時間は数えるまでもない。
厳密な時間、スリープさせなければならないというような状況では、
OSのプロセス管理システムにまで言及せねばならなくなるので、以下割愛。
下記はLinuxのドキュメントの和訳になりますが、参考になるでしょう。
http://www.linux.or.jp/JF/JFdocs/IO-Port-Programming/high-resolu...
4.1.1. スリープ:sleep() と usleep()
さて、もっと簡単なタイミングについてお話しましょう。数秒のディレイが欲しい場合には、おそらく sleep() がいいでしょう。数十ミリ秒以上のディレイ(最小のディレイは約 10 ミリ秒のようです。)の場合には usleep() がお薦めです。これらの関数を呼び出すと、CPU は他のプロセスに割り当てられます(つまりプロセスが「眠る」)ので、CPU タイムが無駄になることはありません。詳細については sleep(3) と usleep(3) のマニュアルページをご覧ください。
約 50 ミリ秒よりも小さいディレイに関しては(おそらくプロセッサやマシンの速度、システムの負荷にも依存しますが)、上に述べたような CPU を放してしまうというアプローチではうまくいきません。通常、Linux のスケジューラがあなたのプロセスに対して制御を戻す前に(x86 アーキテクチャでは)少なくとも 10-30 ミリ秒はかかるからです。そのようなわけで、usleep(3) に小さいディレイを指定すると通常は指定した値をちょっとだけ越えるディレイが発生します。また最小の値は約 10 ミリ秒ということになります。
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1216095...
>sleep(10秒)と設定したらtimerにセットしているのでしょうか?
昔と最近とでは展開されるコードが違ってると思います。
昔だと、timerにセットするだけでも高付加なので・・・。
>sleepするプログラムを100個くらい立ち上げたとき負荷はかからないのでしょうか?
負荷はかかるけど、最近のCPU性能での前では無負荷に等しい。
>sleep(10秒)と設定したらtimerにセットしているのでしょうか?
win32 apiはその方式を採用していない。
sleepを呼び出すと言うことは、プログラムを停止しカーネルに制御を預ける事になります。
CPUを酷使する様なループの中にsleepを入れるとCPU使用率が下がるのはこの為です。
ちなみにWindowsの場合はSleep()というAPIを使用します。
Sleep(1000); // 1秒スリープ
Linux の場合だと、ソースコードは以下のようになっています。
まずsleep関数の中身。
http://www.google.com/codesearch/p?hl=ja&sa=N&cd=1&ct=rc#XAzRy8o...
このように内部はnanosleepというシステムコールで、ソースコードはこんな感じです。
http://lxr.linux.no/#linux+v2.6.31/kernel/compat.c#L126
http://lxr.linux.no/#linux+v2.6.31/kernel/posix-timers.c
で、実際にどれくらいCPU負荷が掛かるかですが、今時のOSとCPUの組合わせなら、負荷は微々たるものです。
コメント(4件)
Unixの場合は
・sleepするプロセスをカーネルに登録
・カーネルは定期間隔で登録したテーブルを監視
・条件に一致したらプロセスに通知
という処理をしているんで「多少は」負荷はかかるけど
今のCPU性能にとって見れば微々たるもの
ちょっとだけ追記
http://msdn.microsoft.com/ja-jp/library/cc429358.aspx
>>引用ここから
指定された時間にわたって、現在のスレッドの実行を中断
<<ここまで
本題とは少し離れるけどsleepを使う意義の例
http://msdn.microsoft.com/ja-jp/library/cc429052.aspx
えー!? それはないでしょ。
C言語といってもライブラリの実装によるし、WindowsAPIはソース公開してないから分かりません、というのが無難な回答でしょ。
もともと、CPUは一度に1つの命令しか実行できません(マルチコア云々は別の話なので除く)。そのCPUで動いているコンピュータが同時に複数のプロセスを実行しているように見えるのは、複数のプロセスを順番に少しずつ動かしているからです。
複数のプロセスの管理はOSで行われていますが、OSもまた1つのプログラムです。OSのプロセス管理部分が、稼動中の各プロセス内の命令を順番に一定数ずつ処理させることで、あたかも複数のプロセスが1つのCPUで同時実行されているように見えるわけです。
言語や処理系に関係なく、マルチタスクOSにおけるsleepは、このOSプロセス管理における処理の割り振りから、一定時間自分自身を除外するようOSに依頼します。よって、その時間中はそもそも自分のプロセスに処理がこなくなるので、CPU負荷は発生しようがありません。
あるいは、sleep処理の実施中は、CPU時間が回ってきた時に開始時刻からの経過時間を確認し、所定の時間を経過していない場合はすぐに処理をOSに戻すという実装もあります。この場合でも、殆どCPU負荷は発生しません。
もちろんライブラリによっては、sleepをこのような形でなく、タイマーを監視して一定時間経過するまで無限ループするような実装も考えられます。その場合はsleep中も通常のCPU負荷が発生することになりますが、およそまともなライブラリでそんな実装は有り得ないでしょう。