CLOCK_REALTIME和CLOCK_MONOTONIC之间的区别?

你能解释一下Linux上的clock_gettime()返回的CLOCK_REALTIMECLOCK_MONOTONIC时钟之间的区别吗?

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

最后,如果我有一个NTP守护进程定期调整系统时间,这些调整如何与CLOCK_REALTIMECLOCK_MONOTONIC每一个进行交互?

CLOCK_REALTIME表示机器对当前挂钟时间的最佳猜测。 正如Ignacio和MarkR所说的那样,这意味着CLOCK_REALTIME可以随着系统时钟改变(包括NTP)而向前和向后跳转。

CLOCK_MONOTONIC表示从过去某个任意的固定点开始,绝对经过的挂钟时间。 它不受系统时钟变化的影响。

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

罗伯特·洛夫(Robert Love)的书“ LINUX系统编程第二版 ”( LINUX System Programming 2nd Edition)在第11章第363页的开头特别提到了你的问题:

单调时间源的重要方面不是当前值,而是保证时间源严格线性增长,因此对于计算两次采样之间的时间差

也就是说,我相信他假定这些进程是在一个OS的同一个实例上运行的,所以您可能需要运行一个周期性的校准来估计漂移。

CLOCK_REALTIME受NTP的影响,可以前后移动。 CLOCK_MONOTONIC不是,并且每个tick CLOCK_MONOTONIC一个tick。

除了伊格纳西奥的回答 , CLOCK_REALTIME可以上升,偶尔也可以倒退。 CLOCK_MONOTONIC既不; 它只是继续前进(虽然它可能在重新启动时重置)。

一个强大的应用程序需要能够容忍CLOCK_REALTIME偶尔跳跃(也许偶尔会稍微向后,尽pipe这更像是一个边缘情况)。

想象一下,当你暂停你的笔记本电脑时会发生什么 – CLOCK_REALTIME在继续CLOCK_REALTIME跳转, CLOCK_MONOTONIC没有。 在虚拟机上试一试。

POSIX 7http://pubs.opengroup.org/onlinepubs/9699919799/functions/clock_getres.html中指定:;

CLOCK_REALTIME

该时钟表示测量系统实时的时钟。 对于这个时钟,由clock_gettime()返回并由clock_settime()指定的值表示从Epoch开始的时间量(以秒和纳秒为单位)。

CLOCK_MONOTONIC (可选function):

对于此时钟,clock_gettime()返回的值表示自过去未指定点(例如,系统启动时间或Epoch)以来的时间量(以秒和纳秒为单位)。 系统启动时间后,这一点不会改变。 他不能通过clock_settime()设置CLOCK_MONOTONIC时钟的值。

clock_settime()给出了一个重要的提示:POSIX系统可以随意更改CLOCK_REALITME ,所以不要依赖它连续stream动也不要前向stream动。 NTP可以使用clock_settime()来实现,只能影响CLOCK_REALITME

Linux内核实现似乎将启动时间作为CLOCK_MONOTONIC的时期: CLOCK_MONOTONIC的起始点