素人な質問をさせてください。C言語でsleepというのがあります。また、win32 apiでも同様のものがあります。これらはcpu負荷を与えないのでしょうか?極端な例ですが、sleepするプログラムを100個くらい立ち上げたとき負荷はかからないのでしょうか?sleep関数自体がどのようなソースになっているのか知らないのでお聞きしています。sleep(10秒)と設定したらtimerにセットしているのでしょうか?

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2009/12/02 20:35:03
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答4件)

id:kn1967 No.1

回答回数2915ベストアンサー獲得回数301

ポイント23pt

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 ミリ秒ということになります。

id:sirotugu40 No.2

回答回数449ベストアンサー獲得回数14

ポイント23pt

http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1216095...

>sleep(10秒)と設定したらtimerにセットしているのでしょうか?

昔と最近とでは展開されるコードが違ってると思います。

昔だと、timerにセットするだけでも高付加なので・・・。

>sleepするプログラムを100個くらい立ち上げたとき負荷はかからないのでしょうか?

負荷はかかるけど、最近のCPU性能での前では無負荷に等しい。


>sleep(10秒)と設定したらtimerにセットしているのでしょうか?

win32 apiはその方式を採用していない。

id:mattn No.3

回答回数104ベストアンサー獲得回数23

ポイント22pt

sleepを呼び出すと言うことは、プログラムを停止しカーネルに制御を預ける事になります。

CPUを酷使する様なループの中にsleepを入れるとCPU使用率が下がるのはこの為です。

ちなみにWindowsの場合はSleep()というAPIを使用します。

Sleep(1000); // 1秒スリープ
id:pyopyopyo No.4

回答回数377ベストアンサー獲得回数98

ポイント22pt

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の組合わせなら、負荷は微々たるものです。

  • id:dev_zer0
    windowsのソースは持ってないから知らない
    Unixの場合は
    ・sleepするプロセスをカーネルに登録
    ・カーネルは定期間隔で登録したテーブルを監視
    ・条件に一致したらプロセスに通知
    という処理をしているんで「多少は」負荷はかかるけど
    今のCPU性能にとって見れば微々たるもの
  • id:kn1967
    プロセス管理 → プロセス/スレッド管理

    ちょっとだけ追記
    http://msdn.microsoft.com/ja-jp/library/cc429358.aspx
    >>引用ここから
    指定された時間にわたって、現在のスレッドの実行を中断
    <<ここまで


    本題とは少し離れるけどsleepを使う意義の例
    http://msdn.microsoft.com/ja-jp/library/cc429052.aspx
  • id:horosco75
    > sleepは文字通り眠る形になり、CPU負荷はかけない。

    えー!? それはないでしょ。
    C言語といってもライブラリの実装によるし、WindowsAPIはソース公開してないから分かりません、というのが無難な回答でしょ。
  • id:hissssa
    そもそもsleepは、プロセスを眠らせるというよりCPU時間の割り当てを一定時間辞退するようなものですから、意味のあるほどの負荷は有り得ないでしょう。
    もともと、CPUは一度に1つの命令しか実行できません(マルチコア云々は別の話なので除く)。そのCPUで動いているコンピュータが同時に複数のプロセスを実行しているように見えるのは、複数のプロセスを順番に少しずつ動かしているからです。
    複数のプロセスの管理はOSで行われていますが、OSもまた1つのプログラムです。OSのプロセス管理部分が、稼動中の各プロセス内の命令を順番に一定数ずつ処理させることで、あたかも複数のプロセスが1つのCPUで同時実行されているように見えるわけです。
    言語や処理系に関係なく、マルチタスクOSにおけるsleepは、このOSプロセス管理における処理の割り振りから、一定時間自分自身を除外するようOSに依頼します。よって、その時間中はそもそも自分のプロセスに処理がこなくなるので、CPU負荷は発生しようがありません。
    あるいは、sleep処理の実施中は、CPU時間が回ってきた時に開始時刻からの経過時間を確認し、所定の時間を経過していない場合はすぐに処理をOSに戻すという実装もあります。この場合でも、殆どCPU負荷は発生しません。
    もちろんライブラリによっては、sleepをこのような形でなく、タイマーを監視して一定時間経過するまで無限ループするような実装も考えられます。その場合はsleep中も通常のCPU負荷が発生することになりますが、およそまともなライブラリでそんな実装は有り得ないでしょう。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません