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

12

我在某个地方看到了这个答案,但我不是非常理解:

我知道 Windows 每次按照 curTimeIncrement(156001 个100纳秒)的值自增时钟,同时加上 curTimeAdjustment 的值 (156001+-N)。但是当通过 GetSystemTime 读取时钟时,函数是否会在 156001 * 100 纳秒的时间间隔内插值以产生所需的精度呢?

有人能试着给我解释一下吗?

什么是 curTimeIncrementcurTimeAdjustment,Windows 是如何实现的?

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

这只适用于 Windows 7 还是其他操作系统 Win8、Linux 等也适用?

1个回答

31
它指的是Windows上由GetSystemTimeAdjustment()返回的值。该函数告诉您时钟如何被调整以追赶或减慢与真实时间的匹配。这里“真实时间”是由像美国NIST这样的机构保持的时间,它们拥有比计算机内置时钟精度高得多的原子钟。
计算机中的实时时钟(RTC)具有有限的精度,这是保持硬件经济性的副作用,每个月通常会偏差几秒钟。因此,操作系统会定期通过互联网联系时间服务器,在Windows上通常会选择time.windows.com,以获取原子钟预报的当前真实时间。
RTC的不准确性不是漂移的唯一来源,有时真实时间会被故意更改。添加一个"闰秒 "来使时钟与地球真正的旋转同步。当前的天数(24x60x60秒)有些短,地球的自转速度每个世纪减慢约1.5毫秒,并且通常由于大型风暴和地震而不规则。插入的闰秒弥补了这一点。最近的一个闰秒是在今年6月30日23:59:60 UTC添加的。60不是一个错别字 :)
之前的一个闰秒是在2012年6月30日,它有点臭名昭着,因为插入的闰秒使许多Linux服务器崩溃了。请搜索“Linux闰秒错误”以了解更多信息。
这通常就是GetSystemTimeAdjustment()底层机制试图避免的情况,使用从时间服务器获得的值来立即改变时间非常危险。软件通常对时间稳步流逝有着强硬的假设,并且在时间不连续时表现出异常行为。例如,在时钟被回拨时两次观察相同的时间。或者由于闰秒插入而观察到虚假时间,如23:59:60 UTC。因此,它并不是在时钟滴答中断时每秒更新64次时钟。换句话说,每个tick之间有1/64 = 0.015625秒或156250纳秒*100个单位的时间。如果需要进行时钟调整,则不仅会添加156250而且稍微增加或减少。因此,缓慢重新同步时钟以避免影响软件的运行。
当然,这对于显示时钟的软件来说有一些副作用。一个显而易见的方法是使用一秒计时器。但是有时候一秒并不是指一秒,因为在进行时间调整时它将不起作用。这时就需要使用奈奎斯特采样定理,有时计时器滴答根本不会更新时钟或跳过一秒。值得注意的是,这不是保持显示时钟精确的唯一原因,计时器通知本身也总是延迟的,这是软件无法立即执行的副作用。事实上,这更有可能是问题的根源,时钟调整只是更容易理解的情况。
这是一个棘手的问题,奈奎斯特先生教我们必须更频繁地采样才能消除不良的混叠效应。因此解决方法便是设置计时器间隔较短,例如15或31毫秒,足够短以使用户不再观察缺失的更新。

嗯,这意味着如果软件正在处理音乐,你不能完全依赖系统时钟(专业人士会听到节奏变化)。可能音乐并不是唯一一个对变化速率敏感但对每月一秒误差不敏感的领域。 - 18446744073709551615
3
当然,这就是为什么要在硬件上完成。你的音频卡(现在是芯片)通过自己的时钟来处理它。它不需要进行调整,只需稳定,而不需要精确。 - Hans Passant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接