CLOCK_REALTIME
との違いについて読んでいますCLOCK_MONOTONIC
CLOCK_REALTIME と CLOCK_MONOTONIC の違いは?
には時間のCLOCK_REALTIME
不連続性があり、前にも後ろにもジャンプできます。これはこの時計のバグですか? 一貫性のない時間を提供する時計は、どうして信頼できるでしょうか?
CLOCK_REALTIME
との違いについて読んでいますCLOCK_MONOTONIC
CLOCK_REALTIME と CLOCK_MONOTONIC の違いは?
には時間のCLOCK_REALTIME
不連続性があり、前にも後ろにもジャンプできます。これはこの時計のバグですか? 一貫性のない時間を提供する時計は、どうして信頼できるでしょうか?
その不完全性にもかかわらず、CLOCK_REALTIME は、現在の UTC または常用時のシステムの最良の推定値であるべきです。これは、時計や壁の時計、携帯電話を見たり、ラジオ局の時刻放送を聞いたりするのと同じ時間を表示するシステムの機能の基礎です。表示には UTC から現地時間への変換が含まれます。これについては後で詳しく説明します。)
しかし、CLOCK_REALTIME が現実世界の UTC 時間と一致する場合、少なくとも 2 つのかなり重大な問題があります。
したがって、CLOCK_REALTIME には不連続性があり、前後にジャンプする可能性があることを読んだ場合、それはバグではなく、機能です: CLOCK_REALTIMEは、うるう秒と時折間違ったクロックで現実の世界に対処する場合、それらの可能性を持たなければなりません。
したがって、現実世界の時間と一致する時間で動作するはずのコードを書いている場合は、CLOCK_REALTIME が必要です。ただし、理想的には、何らかの理由で時計が時々前後にジャンプした場合でも、適切に動作する (クラッシュしたり奇妙なことをしたりしない) ようにコードを記述します。
おそらく参照した他の質問からわかるように、CLOCK_MONOTONIC は、ジャンプや不連続なしで、常に 1 秒あたり正確に 1 秒進むことが保証されていますが、クロックの絶対値はあまり意味がありません。CLOCK_MONOTONIC 値が 13:05 の場合、それは午後 1 時過ぎという意味ではなく、通常、コンピューターが 13 時間 5 分間稼働していたことを意味します。
したがって、相対時間だけに関心がある場合は、CLOCK_MONOTONIC で問題ありません。特に、何かにかかった時間を計りたい場合は、2 つの CLOCK_MONOTONIC 値を取り、それらを減算することが望ましいです。の間に。
または、要約すると、コメントスレッドで人々が言ったように、絶対時間には CLOCK_REALTIME が必要ですが、相対時間には CLOCK_MONOTONIC が適しています。
さて、あと数点。
前述のように、CLOCK_REALTIME は実際には UTC を扱っているため、「ウォール タイム」ではありません。1970 年以来、有名な (悪名高い?) UTC 秒の Unix/Posix 表現を使用しています。これは、現地時間の 01:59:59 に対応します。しかし、1 秒後は2:00ではありません。実際、1457852400 は現地時間の 03:00:00 に対応します。これは、ここで夏時間が始まったときだからです。
時計が間違っていた場合、それを修正する唯一の方法はほとんどタイム ジャンプであると提案しましたが、それは正しくありません。クロックがわずかにずれている場合は、(クロック周波数をわずかに変更することによって) 時間を徐々に「ずらす」ことで修正できます。これにより、数分または数時間後にジャンプすることなく正しい時間にドリフトします。それが NTP がやろうとしていることですが、その構成によっては、非常に小さなエラーに対してのみ喜んでそうするかもしれません。
CLOCK_MONOTONIC は通常、コンピューターが稼働している時間であると言いました。これは標準では保証されていません。標準が言っているのは、CLOCK_MONOTONICが任意の時点から時間をカウントするということだけです。システムが稼働していた時間として CLOCK_MONOTONIC を実装しているシステムでは、2 つの解釈があります: 起動してからの時間か、システムが稼働していた時間 (つまり、スリープ状態またはサスペンド状態だった時間を差し引いた時間) です。 ? 多くのシステムでは、ブート以降の時間をカウントする別のクロック CLOCK_BOOTTIME があり (起動しているか中断されているかに関係なく)、CLOCK_MONOTONIC はシステムが稼働していた時間だけをカウントします。
「CLOCK_MONOTONIC は常に 1 秒に 1 秒ずつ進むことが保証されている」と言いましたが、それも厳密には正しくないかもしれません。あなたのコンピュータが時間回転操作の最中にある場合、絶対時間誤差を徐々に修正しようとして、実際には CLOCK_MONOTONIC が一時的に毎秒 1.001 秒、または毎秒 0.999 秒、またはそのような速度で進んでいる可能性があります。それ。通常、エラーは非常に小さいですが、問題が発生した場合に備えて、一部のシステムにはCLOCK_MONOTONIC_RAWなど、そのような摂動がないはずの別のクロックタイプがあります。
最後に、適切な時間を追跡したい場合、うるう秒でのジャンプや不連続を避けたい場合は、従来の Unix/Linux (および Windows やその他すべて) でのうるう秒の処理が不十分であるため、問題が発生します。コンピュータシステム。最近の (4.x?) Linux カーネルでは、役立つ CLOCK_TAI があります。一部の実験的なシステムでは、うるう秒を適切に処理する別のクロックCLOCK_UTCを実装する場合があります。どちらにも他にコストがかかります。少なくとも現在のレベルのサポートでは、それらを効果的に使用するには、何をしていたかを本当に理解する必要があります。詳細については、LEAPSECS メーリング リストを参照してください。