Windows 7 中的时钟是如何工作的?

How does the clock work in Windows 7?

我在某处看过这个答案,但我不是很明白:

I understand Windows increments the clock every curTimeIncrement (156001 100 nanoseconds) with the value of curTimeAdjustment (156001 +- N). But when the clock is read using GetSystemTime does the routine interpolate within the 156001 nanosecond*100 interval to produce the precision indicated?

谁能给我解释一下?

什么是curTimeIncrementcurTimeAdjustment以及Windows如何做到这一点?

这对获取准确时间有什么影响?

是否仅适用于 windows 7 或其他 OS Win8、Linux 等?

指的是GetSystemTimeAdjustment()在Windows上的返回值。它告诉您如何调整时钟以赶上或减慢时间以匹配实时时间。 "Real" 作为美国 NIST 等机构记录的时间,他们有一个原子钟,其精度远远高于您机器内置的时钟。

您机器中的实时时钟 (RTC) 精度有限,这是保持硬件价格合理的副作用,每个月它往往会关闭几秒钟。因此,操作系统会定期通过 Internet 联系时间服务器,time.windows.com 是 Windows 上的常见选择。根据原子钟 oracle 告诉它当前的实时时间。

RTC 的不准确性并不是漂移的唯一来源,有时实时时间会被故意更改。添加 闰秒 以使时钟与地球的真实自转重新同步。今天(24 x 60 x 60 秒)有点太短了,地球的自转每个世纪都会减慢 1.5 毫秒,并且由于大风暴和地震,地球自转通常是不规则的。插入的闰秒弥补了这一点。最近的一个是在今年 6 月 30 日 23:59:60 UTC 添加的。 60 不是错字 :)

之前的一次发生在 2012 年 6 月 30 日。有点臭名昭著的是,闰秒的插入导致许多 Linux 服务器崩溃。 Google "Linux leap second bug" 了解更多。

这通常是 GetSystemTimeAdjustment() 下的机制试图避免的,立即使用从时间服务器获得的值更改时间是非常危险的。软件通常有一个硬性的假设,即时间在稳步前进,如果没有,就会出现异常行为。就像时钟拨回后两次观察同一时间一样。或者由于插入闰秒而观察到像 23:59:60 UTC 这样的假时间。

所以它不是,时钟每秒更新 64 次,在时钟节拍中断时。或者换句话说,滴答之间的 1 / 64 = 0.015625,以纳秒为单位的 156250 * 100 单位。如果需要进行时钟调整,那么它不仅会增加 156250,还会稍微增加或减少。从而慢慢地将时钟重新同步到真实时间并避免扰乱软件。

这当然会对绘制时钟的软件产生令人不快的副作用。一个明显的方法是使用一秒计时器。但有时那不是一秒钟,不会是在进行时间调整的时候。然后奈奎斯特的采样定理开始发挥作用,有时计时器滴答声根本不更新时钟或跳过一秒钟。值得注意的是,这不是 only 很难保持彩绘时钟准确的原因,计时器通知本身也总是延迟。软件无法立即 执行的副作用。这实际上是更可能的麻烦来源,时钟调整只是锦上添花,更容易理解。

尴尬的问题,奈奎斯特先生告诉我们,您必须更频繁地采样才能消除不良的混叠效应。因此,解决方法是将计时器设置为较小的间隔,例如 15 或 31 毫秒,足够短,用户不会再观察到丢失的更新。