CLOCK_REALTIME
NTP の影響を受け、前後に移動できます。 CLOCK_MONOTONIC
ではなく、ティックごとに 1 ティックずつ進みます。
Robert Love の本 LINUX System Programming 2nd Edition 、具体的には、第 11 章、pg 363 の冒頭であなたの質問に対処します:
<ブロック引用>単調なタイム ソースの重要な側面は、現在の値ではなく、タイム ソースが厳密に直線的に増加していることを保証することです。したがって、2 つのサンプリング間の時間差を計算するのに役立ちます
そうは言っても、彼はプロセスが OS の同じインスタンスで実行されていると想定していると思います。そのため、ドリフトを推定できるように定期的なキャリブレーションを実行することをお勧めします。
CLOCK_REALTIME
現在の壁時計、時刻に関するマシンの最良の推測を表します。 Ignacio と MarkR が言うように、これは CLOCK_REALTIME
を意味します NTP を含め、システムの時刻クロックが変更されると、前後にジャンプできます。
CLOCK_MONOTONIC
過去の任意の固定点からの絶対経過時間を表します。システムの時刻時計の変更による影響はありません。
再起動を介在させずに、1 つのマシンで観測された 2 つのイベント間の経過時間を計算したい場合は、CLOCK_MONOTONIC
が最良の選択肢です。
Linux では、CLOCK_MONOTONIC
であることに注意してください。 サスペンドに費やされた時間は測定しませんが、POSIX の定義では測定する必要があります。 Linux 固有の CLOCK_BOOTTIME
を使用できます サスペンド中も動き続ける単調クロック用。
POSIX 7 の引用符
POSIX 7 では、http://pubs.opengroup.org/onlinepubs/9699919799/functions/clock_getres.html で両方を指定しています:
CLOCK_REALTIME
:
このクロックは、システムのリアルタイムを測定するクロックを表します。このクロックの場合、clock_gettime() によって返され、clock_settime() によって指定される値は、エポックからの時間 (秒およびナノ秒) を表します。
CLOCK_MONOTONIC
(オプション機能):
このクロックの場合、clock_gettime() によって返される値は、過去の特定されていない時点 (システムの起動時間やエポックなど) からの時間 (秒およびナノ秒) を表します。この点は、システムの起動後も変わりません。 CLOCK_MONOTONIC クロックの値は、clock_settime() で設定できません。
clock_settime()
重要なヒントを与えます:POSIX システムは CLOCK_REALITME
を任意に変更できます ですから、それが連続的にも前方にも流れることに頼らないでください。 NTP は clock_settime()
を使用して実装できます 、および CLOCK_REALTIME
のみに影響を与える可能性があります .
Linux カーネルの実装では、CLOCK_MONOTONIC
のエポックとして起動時間がかかるようです :CLOCK_MONOTONIC の開始点