CLOCK_REALTIME和CLOCK_MONOTONIC之间的区别?
你能解释一下Linux上的clock_gettime()
返回的CLOCK_REALTIME
和CLOCK_MONOTONIC
时钟之间的区别吗?
如果我需要计算外部源产生的时间戳和当前时间之间的经过时间,哪一个更好?
最后,如果我有一个NTP守护进程定期调整系统时间,这些调整如何与CLOCK_REALTIME
和CLOCK_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 7在http://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的起始点