ページ 11

sleep関数について

Posted: 2012年7月21日(土) 04:55
by クロ
プログラミング初心者なので、基本的な知識レベルの質問かもしれませんが申し訳ありません。

sleep関数を使用したプログラムをサーバ上で動かす場合、sleepする時間はどこから取得しているのでしょうか?
サーバの時刻から取得しているのでしょうか?
それとも、内部的に経過時刻のようなものを持っているのでしょうか?

ネット等で調べようとしたのですが、関数の使い方の説明はあっても、仕組みがよくわからず、イメージがつかめなかったので質問させていただきました。
ご回答いただけますと幸いです。

Re: sleep関数について

Posted: 2012年7月21日(土) 07:51
by beatle
sleep関数の内部実装を覗いたわけではないのですが、OSを少し作ったことがある経験からもし僕だったらマザーボードに組み込まれているタイマー(プログラマブル・インターバル・タイマー)からの割り込み信号を積算して秒数を数えるような実装にすると思います。
クロさんのいう「サーバの時刻」がLinuxでいう「ハードウェアクロック」と「ソフトウェアクロック」のどちらを指しているか分かりませんが、タイマーによる実装はすなわちソフトウェアクロックによる実装ということです。

そもそも、スレッドという仕組みがあるマシン上でsleep関数を呼び出しますと、sleep関数を呼び出したスレッドは停止しますから、sleep関数が(whileループでカウンタをインクリメントするなどの手法で)自分自身で経過時間を測ることはできません。
ですから「内部的に経過時刻のようなものを持っている」というのは無理があるかなと思います(僕の解釈がクロさんの解釈と違っていたらすみません)。

Re: sleep関数について

Posted: 2012年7月23日(月) 01:54
by クロ
ご回答ありがとうございます。
確かにプログラム自身が時間を持っているというのは無理がありそうですね・・・
勉強になりました!