【发布时间】:2012-10-25 04:57:55
【问题描述】:
挂钟时间通常由系统 RTC 提供。这主要只提供毫秒范围的时间,并且通常具有 10-20 毫秒的粒度。然而gettimeofday() 的分辨率/粒度通常是reported 在几微秒范围内。我假设微秒粒度必须来自不同的来源。
gettimeofday() 的微秒级分辨率/粒度是如何实现的?
当精确到毫秒的部分取自 RTC,而微秒取自不同的硬件时,就会出现两个源的定相问题。这两个来源必须是synchronized。
这两个源之间的同步/定相是如何完成的?
编辑:根据我在 amdn 提供的链接中所读到的内容,特别是以下 Intel 链接,我想在这里添加一个问题:
gettimeofday() 是否提供微秒级别的分辨率/粒度?
编辑 2:总结 amdns answer 以及更多阅读结果:
Linux 仅在启动时使用实时时钟 (RTC)
与更高分辨率的计数器同步,例如时间戳计数器 (TSC)。启动后gettimeofday() 返回一个完全基于 TSC 值和此计数器频率的时间。 TSC frequency 的初始值通过将系统时间与外部时间源进行比较来校正/校准。调整由adjtimex() 函数完成/配置。内核运行锁相环以确保时间结果是单调一致的。
这样可以说gettimeofday() 具有微秒分辨率。考虑到更现代的时间戳计数器在 GHz 范围内运行,可获得的分辨率可能在纳秒范围内。因此,这个有意义的评论
/**
407 * do_gettimeofday - Returns the time of day in a timeval
408 * @tv: pointer to the timeval to be set
409 *
410 * NOTE: Users should be converted to using getnstimeofday()
411 */
可以在Linux/kernel/time/timekeeping.c 中找到。这表明可能会有
是一个更高分辨率的功能,在以后的时间点可用。目前getnstimeofday() 仅在内核空间中可用。
但是,查看所有涉及的代码以使其正确无误,显示了很多关于不确定性的问题。有可能获得微秒级的分辨率。函数gettimeofday() 甚至可以显示微秒级别的粒度。 但是:对其准确性存在严重质疑,因为无法准确校正 TSC 频率的drift。此外,在 Linux 中处理此问题的代码的复杂性暗示着要正确处理它实际上太难了。这特别是但不仅仅是由于 Linux 应该在其上运行的大量硬件平台造成的。
结果: gettimeofday() 返回以微秒为粒度的单调时间,但它提供的时间几乎从不与 one microsecond 与任何其他时间源成相位。
【问题讨论】:
-
归根结底,粒度取决于所涉及的硬件。我假设算法使用 100 毫秒。这是由于考虑了上下文切换等。
标签: linux time linux-kernel