19
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

CLOCK_REALTIMEとCLOCK_MONOTONIC

Posted at

systemdにはdual_timestampという構造体がある。

src/shared/time-util.h
typedef struct dual_timestamp {
        usec_t realtime;
        usec_t monotonic;
} dual_timestamp;

realtimeとmonotonicという2種類の時刻を同時に保持するためのものである。Linuxにはこの2種類の時刻があることは知っていたが、違いを把握していなかったので調べてみた。

Linux(というかPOSIX)では、clock_gettime(2)システムコールで経過時間を測るための時刻を得ることができる。上記二つの時刻は、それぞれCLOCK_REALTIMECLOCK_MONOTONICフラグを指定することで取得できる。Man page of CLOCK_GETTIMEDifference between CLOCK_REALTIME and CLOCK_MONOTONIC? - Stack Overflow の説明によると、それぞれの時刻には以下の違いがあるようだ。

  • CLOCK_REALTIME
    • NTP等によってシステムの現在時刻が変更されると、clock_gettimeも大きく変化することがある(時刻が戻る可能性がある)
    • なので、ベンチマーク等で経過時間を測りたいときには向かない
  • CLOCK_MONOTONIC
    • 時刻はかならず単調増加する
    • システムの時刻変更の影響を受けるが、大きく変化することはないし、時間が戻ったりもしない

Linuxでは、それ以外にもCLOCK_MONOTONIC_RAWという時刻が取得可能で、こちらはNTP等の時刻変更の影響を全く受けないらしい。では、こちらの方が経過時間の計測に向いているかというと、(上記Stack Overflowのコメントによると)そうでもないらしい。なぜそうなのかはまだ理解していないので、またいずれ調査するかもしれない。

19
15
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?