2017-10-07 56 views
2

在C++中,我们可以使用chrono库来处理时间。我认为它与CPU时钟是异步的。我的意思是,chrono::seconds(1)是真实的1秒,而不是在这段时间内执行了多少条指令。我对吗?chrono库的实现

如果我是对的,它是如何工作在低水平?在一般的现代计算机体系结构中,是否有任何计时器硬件与CPU时钟异步工作?

+2

你的问题不清楚。如果您想知道某个特定代码片段的工作原理,请发布它。 –

+0

据我了解,操作系统询问系统调用或基于时间相关调用的其他机制(如由std :: chrono提供的调用)是由操作系统和底层硬件实现的。 – BeeOnRope

回答

3

你典型的现代计算机有两种方式来告诉时间,而这两种方式在引擎盖下相互帮助。

  1. 通常有一个Time Stamp Counter这只不过是是它和每个时钟周期递增一个特殊寄存器。计算机也知道它自己的周期时间,并且可以将周期数转换为诸如纳秒的物理持续时间。这最终是当OS提供“实时时钟”时使用的,在C++ 11和以后称为std::chrono::steady_clock

  2. 另外现代计算机了解并参与Network Time Protocol。这实际上是一台计算机向另一台计算机询问当前UTC时间的有组织的方式。计算机可以使用它来查找当前时间,然后使用它的本地Time Stamp Counter将该时间转换为UTC时间。计算机可能会每天使用NTP几次来保持其本地时间的准确性。在C++ 11及更高版本中,可通过std::chrono::system_clock访问。

几十年前,个人电脑没有参加NTP,而是询问是谁启动了计算机当前的时间和日期,然后使用其板载TSC保持局部时间的人。

更新

请仔细阅读下面Peter Cordes留言给我掩盖了细节。

+0

x86的TSC作为实时时钟工作,因为它计数*参考周期*,而不是实际控制通过管道的指令的核心时钟周期。 Turbo/powersaving改变核心时钟,当CPU处于休眠状态时它会停止,但参考时钟不会(在具有'nonstop_tsc'功能的CPU上,这是几年来的一切)。 –

+0

数十年前,CPU没有内置TSC,CPU会写入/读取定时器芯片的I/O寄存器以查找实时。使用'rdtsc'作为低开销的时间源是非常好的,并且避免了甚至必须切换到'gettimeofday'的内核,更不用说与外部硬件对话。 ('rdtsc'是在CPU节电之前引入的,所以它作为性能计数器*和*作为实时时钟,在一些早期的节能芯片中,它仍然计算实际的周期数, t)作为时间源。) –

+0

可能值得注意的是,其他非TSC时间源(例如各种硬件时钟)仍然经常用作各种时间例程的基础:典型的方法是使用这样的时钟为“粗”时间,然后基于读取TSC从粗时间添加偏移量。例如,可以将粗时间写入每个内核的“滴答”,然后使用TSC来确定从那以后经过了多少时间。 – BeeOnRope