CLOCK_REALTIME和CLOCK_MONOTONIC之间的区别?

你能解释一下
clock_gettime()
在Linux上返回的
CLOCK_REALTIME
CLOCK_MONOTONIC
时钟之间的区别吗? 如果我需要计算外部源生成的时间戳与当前时间之间的经过时间,哪个是更好的选择? 最后,如果我有一个NTP守护进程定期调整系统时间,那么这些调整如何与
CLOCK_REALTIME
CLOCK_MONOTONIC
相互作用?     
已邀请:
CLOCK_REALTIME
表示机器对当前挂钟,时间时间的最佳猜测。正如Ignacio和MarkR所说,这意味着当系统时钟发生变化时,
CLOCK_REALTIME
可以向前和向后跳跃,包括NTP。
CLOCK_MONOTONIC
表示从过去的某个任意固定点开始的绝对经过的挂钟时间。它不受系统时钟变化的影响。 如果要计算在一台机器上观察到的两个事件之间经过的时间而没有重新启动,则
CLOCK_MONOTONIC
是最佳选择。 请注意,在Linux上,
CLOCK_MONTONIC
不会测量挂起所花费的时间,尽管它应该通过POSIX定义。您可以使用特定于Linux的
CLOCK_BOOTTIME
作为在暂停期间保持运行的单调时钟。     
Robert Love的书LINUX系统编程第2版,专门解决了您在第11章开头的问题,第363页:   单调时间源的重要方面不是当前的   值,但保证时间源是严格线性的   增加,因此可用于计算时间差   两次采样之间 也就是说,我相信他假设这些进程在同一个操作系统实例上运行,因此您可能希望定期运行校准以估算漂移。     
CLOCK_REALTIME
受NTP影响,可以向前和向后移动。
CLOCK_MONOTONIC
不是,并且每个刻度以一个刻度前进。     
除了伊格纳西奥的回答之外,
CLOCK_REALTIME
可以在飞跃中前进,偶尔向后。
CLOCK_MONOTONIC
既不会;它只是继续前进(虽然它可能在重新启动时重置)。 一个强大的应用程序需要能够容忍偶尔跳跃向前跳跃(并且可能偶尔向后略微向后跳跃,尽管这更像是一个边缘情况)。 想象一下,当你暂停你的笔记本电脑时会发生什么 - resume0ѭ在简历之后跳转,
CLOCK_MONOTONIC
没有。在VM上试用它。     
POSIX 7在http://pubs.opengroup.org/onlinepubs/9699919799/functions/clock_getres.html上指定:
CLOCK_REALTIME
:   该时钟代表测量系统实时的时钟。对于此时钟,clock_gettime()返回并由clock_settime()指定的值表示自Epoch以来的时间量(以秒和纳秒为单位)。
CLOCK_MONOTONIC
(可选功能):   对于此时钟,clock_gettime()返回的值表示自过去未指定的点(例如,系统启动时间或Epoch)以来的时间量(以秒和纳秒为单位)。系统启动时间后,这一点不会改变。无法通过clock_settime()设置CLOCK_MONOTONIC时钟的值。
clock_settime()
给出了一个重要提示:POSIX系统能够随意改变
CLOCK_REALITME
,所以不要依赖它既不连续也不向前流动。 NTP可以使用
clock_settime()
实现,并且只能影响
CLOCK_REALITME
。 Linux内核实现似乎将启动时间作为
CLOCK_MONOTONIC
的时代:CLOCK_MONOTONIC的起点     

要回复问题请先登录注册