CLOCK_REALTIME和CLOCK_MONOTONIC之间的区别是什么?

26 浏览
0 Comments

CLOCK_REALTIME和CLOCK_MONOTONIC之间的区别是什么?

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

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

最后,如果我有一个定期调整系统时间的NTP守护程序,这些调整会如何影响CLOCK_REALTIMECLOCK_MONOTONIC

0
0 Comments

CLOCK_REALTIME和CLOCK_MONOTONIC之间的区别是什么?

在Linux系统中,有两种不同的时钟类型:CLOCK_REALTIME和CLOCK_MONOTONIC。它们之间的区别在于受到网络时间协议(NTP)的影响程度以及时间调整对它们的影响。

CLOCK_REALTIME受到NTP的影响,它可以前后移动,时间会发生调整。而CLOCK_MONOTONIC则不受NTP的影响,它以固定的速度前进。

然而,CLOCK_MONOTONIC也会受到NTP的时间调整影响,但它不会发生跳跃,只会按照一个tick的速度前进。

对于较新的内核版本,引入了CLOCK_MONOTONIC_RAW,它基本上不受NTP的影响。

关于“tick”的具体定义以及它的大小和持续时间,目前没有找到官方文档。但是通常来说,一个tick是一个时间的一小部分,不是CPU周期的数量。在Linux/amd64上,一个tick可能是1/100秒。

某些情况下Java的System.nanoTime()方法使用CLOCK_MONOTONIC来测量持续时间,它可以测量1000纳秒以下的时间间隔。也许你在考虑系统时间,系统时间有时被限制在毫秒级别。

总结起来,CLOCK_REALTIME和CLOCK_MONOTONIC之间的区别在于受到NTP的影响程度以及时间调整对它们的影响。如果需要一个不受NTP影响的单调递增的时钟,可以使用CLOCK_MONOTONIC_RAW。

0
0 Comments

在Linux系统编程第二版这本书的第11章的开头,Robert Love专门解答了你的问题。他指出,单调时间源的重要方面不是当前值,而是保证时间源严格线性递增,从而可以用于计算两个采样之间的时间差。但是,他假设进程在同一个操作系统实例上运行,所以你可能需要定期进行校准,以便估计漂移。

在Linux中,有两个不同的时钟源可用于计算时间:CLOCK_REALTIME和CLOCK_MONOTONIC。这两个时钟源的主要区别在于它们的特性和用途。

CLOCK_REALTIME是一个系统范围的时钟源,它提供了当前的日历时间。它受到系统时间的影响,可以被调整。CLOCK_REALTIME通常用于需要获取实际时间的场景,例如日志记录、事件时间戳等。它的精度可能会受到系统时钟的调整和同步的影响。

CLOCK_MONOTONIC是一个单调时钟源,它提供了从某个未指定的起点开始的递增时间。它不受系统时间的影响,不可被调整。CLOCK_MONOTONIC通常用于需要测量时间间隔、计算时间差等场景。它的精度和分辨率通常比CLOCK_REALTIME更高。

在使用这两个时钟源时,需要注意以下几点:

1. 如果需要获取实际时间,请使用CLOCK_REALTIME。

2. 如果需要测量时间间隔,请使用CLOCK_MONOTONIC。

3. 在跨系统调用的情况下,CLOCK_MONOTONIC是更可靠的选择,因为它不受系统时间的调整和同步的影响。

4. 在使用CLOCK_MONOTONIC时,应注意处理时间溢出的情况,因为它是一个有限的计数器。

根据Robert Love的建议,如果你的进程需要在同一个操作系统实例上运行,你可能需要定期进行校准,以便估计CLOCK_MONOTONIC的漂移。这可以通过与CLOCK_REALTIME进行比较来实现。一种可能的方法是使用定时器,定期记录两个时钟源的值,并计算它们之间的差异,以获取漂移值。

总之,CLOCK_REALTIME和CLOCK_MONOTONIC是Linux中两种不同的时钟源,用于不同的时间计算需求。了解它们的特性和用途,可以帮助我们在编程中选择合适的时钟源,并处理好时间相关的计算和测量。

0
0 Comments

CLOCK_REALTIME和CLOCK_MONOTONIC之间的区别是什么?

CLOCK_REALTIME代表机器对当前墙上时钟时间的最佳猜测。根据Ignacio和MarkR的说法,这意味着CLOCK_REALTIME可以随着系统时间的更改(包括通过NTP进行更改)而向前或向后跳动。

CLOCK_MONOTONIC表示自过去某个固定点以来的绝对流逝的墙上时钟时间。它不受系统时钟更改的影响。

如果要在同一台机器上计算两个事件之间的经过时间,而没有重新启动,CLOCK_MONOTONIC是最好的选择。

请注意,在Linux上,CLOCK_MONOTONIC不计算挂起时间,尽管根据POSIX的定义应该计算。可以使用Linux特定的CLOCK_BOOTTIME来获取在挂起期间持续运行的单调时钟。

请注意,较新的内核上提供了CLOCK_MONOTONIC_RAW,它更好(没有NTP调整)。

对于某个“更好”的值,CLOCK_MONOTONIC_RAW可能比真实时间快或慢几百万分之几,并且其速率可能因环境条件(如温度或电压)(或在虚拟机上偷取时间)而变化。在正常工作的机器上,NTP尽力减轻所有这些因素的影响,因此CLOCK_MONOTONIC更接近真实经过的时间。

某些情况下了一个有趣的观点。如果您担心程序可能受到时钟漂移的影响,CLOCK_MONOTONIC是否是最佳选择?例如,爱国者导弹系统。

我认为还重要的是要提到,CLOCK_REALTIME受闰秒的影响。这意味着每次插入闰秒时,它都会产生重复的时间戳。最后一次发生这种情况是在2012年6月30日,相当多的软件遇到了问题。

请解释一下时钟向前和向后跳动是什么意思?我不理解这一点。

这意味着该时钟的时间可能出现不连续。它可以重复已经发生过的先前时间,或者可以跳过某些时间段而永远不会发生。

这对我来说似乎是CLOCK_REALTIME的一个错误。这个时钟显然不可靠,不是吗?

值得一提的是,最后一个问题现在在stackoverflow.com/questions/41894213/...上得到了回答。

不。CLOCK_REALTIME如其名所示,是机器对当前真实的外部世界时间的最佳估计。它类似于手表时间,会受到校正。

我们可以假设CLOCK_REALTIME是软件时钟,CLOCK_MONOTONIC是硬件时钟吗?

不是的-在许多情况下,它们都源自相同的底层时间基准。我不确定这种假设会给您带来什么好处。

通过这种假设,我可以依赖一个不受chrony等应用程序影响的时间源,当我说CLOCK_MONOTONIC时。这也意味着我在说的是我的板上的一个HW时钟,而不是与外部源同步的时钟,也不是根据tick / jiffies的数量。

CLOCK_MONOTONIC的当前读数不会受到诸如chrony之类的时间管理应用程序的调整,这正是它的目的。它的速率可能会被规范化,这通常是您想要的。

0