代码之家  ›  专栏  ›  技术社区  ›  NPE

实时时钟和单调时钟的区别?

  •  164
  • NPE  · 技术社区  · 16 年前

    CLOCK_REALTIME 和 CLOCK_MONOTONIC clock_gettime()

    如果我需要计算由外部源产生的时间戳和当前时间之间经过的时间,哪个是更好的选择?

    最后,如果我有一个NTP守护进程周期性地调整系统时间,那么这些调整是如何与每个进程交互的呢 实时时钟 和 ?

    5 回复  |  直到 12 年前
        1
  •  258
  •   Ruslan Osmanov    6 年前

    CLOCK_REALTIME 表示机器对当前挂钟的最佳猜测,即一天中的时间。作为 Ignacio 和 MarkR 这意味着 实时时钟 当一天中的系统时钟发生变化时(包括NTP),可以向前和向后跳转。

    CLOCK_MONOTONIC 表示自过去某个任意的固定点以来所用的绝对挂钟时间。它不受系统时间时钟变化的影响。

    如果您想计算在一台机器上观察到的两个事件之间经过的时间,而不需要重新启动, 是最好的选择。

    注意,在Linux上, 单调的时钟 CLOCK_BOOTTIME 对于一个在暂停期间一直运行的单调时钟。

        2
  •  39
  •   Aliaksandr Belik Kanglai    12 年前

    罗伯特·洛夫的书 LINUX系统编程第2版 ,在第11章,第363页的开头特别提到您的问题:

    单调时间源的重要方面不是电流 增加,因此有助于计算时间差 两次取样之间

        3
  •  26
  •   Ignacio Vazquez-Abrams    16 年前

    CLOCK_REALTIME 受NTP影响,可以前后移动。 CLOCK_MONOTONIC

        4
  •  20
  •   Community Mohan Dere    9 年前

    除了 Ignacio's answer , CLOCK_REALTIME CLOCK_MONOTONIC 两者都没有;它只是继续前进(尽管它可能在重新启动时重置)。

    实时时钟 偶尔向前跳跃(也许非常轻微地向后非常偶尔,尽管这更像是边缘情况)。

    想象一下当你暂停你的笔记本电脑时会发生什么- 跟着简历往前跳,

        5
  •  16
  •   pevik Hudson    7 年前

    POSIX 7报价

    http://pubs.opengroup.org/onlinepubs/9699919799/functions/clock_getres.html

    CLOCK_REALTIME :

    此时钟表示系统的实时测量时钟。对于这个时钟,由clock\u gettime()返回并由clock\u settime()指定的值表示自Epoch以来的时间量(以秒和纳秒为单位)。

    CLOCK_MONOTONIC (可选功能):

    对于该时钟,clock_gettime()返回的值表示自过去某个未指定点(例如,系统启动时间或历元)以来的时间量(以秒和纳秒为单位)。该点在系统启动后不会改变。不能通过CLOCK\u settime()设置CLOCK\u单调时钟的值。

    clock_settime() 给出了一个重要的提示:POSIX系统可以任意更改 CLOCK_REALITME 有了它,就不要依赖它的流动,既不连续也不向前。NTP可以使用 时钟设置时间() ,只能影响

    Linux内核实现似乎把引导时间作为 : Starting point for CLOCK_MONOTONIC

        6
  •  2
  •   SCouto    6 年前

    抱歉,没有声誉添加此作为评论。所以这是一个补充答案。

    取决于你多久打一次电话 clock_gettime() ,你应该记住 一些 其中的“时钟”是由Linux在VDSO中提供的(也就是说,不需要一个系统调用,而需要一个系统调用的所有开销——只有当Linux添加了防御措施来抵御幽灵式攻击时,情况才会变得更糟)。

    而 clock_gettime(CLOCK_MONOTONIC,...) , clock_gettime(CLOCK_REALTIME,...) ,和 gettimeofday() 不 例如,CLOCK\u MONOTONIC\u RAW或任何其他POSIX时钟。

    尽管大多数程序不需要注意这一点,但VDSO加速的时钟中可能会出现延迟峰值:如果在内核使用时钟计数器更新共享内存区域时正好碰到了延迟峰值,那么它必须等待内核完成。

    以下是“证据”(GitHub,让机器人远离内核.org): https://github.com/torvalds/linux/commit/2aae950b21e4bc789d1fc6668faf67e8748300b7

        7
  •  0
  •   selcukakarin    5 年前

    默认情况下,NTP允许时钟速率被加速或减慢0.05%,但NTP不能导致单调的时钟向前或向后跳跃。