计时库的实现
Implementation of chrono library
在C++中,我们可以使用chrono
库来处理时间。而且我认为它与 CPU 时钟异步。我的意思是,chrono::seconds(1)
是真实的 1 秒,与在此期间执行的指令数无关。我对吗?
如果我是对的,它在低级别是如何工作的?在一般的现代计算机体系结构中,是否有定时器硬件与 CPU 时钟异步工作?
典型的现代计算机有两种计时方式,这两种方式在底层相互帮助。
通常有一个 Time Stamp Counter,它只不过是一个随着每个时钟周期递增的特殊寄存器。计算机也知道自己的循环时间,因此可以将循环计数转换为物理持续时间,例如纳秒。这就是当 OS 提供 "real time clock" 时最终使用的内容,在 C++11 中称为 std::chrono::steady_clock
。
此外,现代计算机理解并参与网络时间协议。这本质上是一台计算机询问另一台计算机当前 UTC 时间的一种有组织的方式。计算机可以使用它来找出当前时间,然后使用其本地 Time Stamp Counter 将其转换为以后的 UTC 时间。一台计算机可能每天多次使用 NTP 来保持其本地时间的准确性。在 C++11 及更高版本中,这是通过 std::chrono::system_clock
.
访问的
几十年前,个人电脑并没有参与NTP, and instead asked the human who booted up the computer the current time and date, and then used its onboard TSC来保持当地时间。
更新
请阅读下面的 Peter Cordes 评论,了解我忽略的细节。
在C++中,我们可以使用chrono
库来处理时间。而且我认为它与 CPU 时钟异步。我的意思是,chrono::seconds(1)
是真实的 1 秒,与在此期间执行的指令数无关。我对吗?
如果我是对的,它在低级别是如何工作的?在一般的现代计算机体系结构中,是否有定时器硬件与 CPU 时钟异步工作?
典型的现代计算机有两种计时方式,这两种方式在底层相互帮助。
通常有一个 Time Stamp Counter,它只不过是一个随着每个时钟周期递增的特殊寄存器。计算机也知道自己的循环时间,因此可以将循环计数转换为物理持续时间,例如纳秒。这就是当 OS 提供 "real time clock" 时最终使用的内容,在 C++11 中称为
std::chrono::steady_clock
。此外,现代计算机理解并参与网络时间协议。这本质上是一台计算机询问另一台计算机当前 UTC 时间的一种有组织的方式。计算机可以使用它来找出当前时间,然后使用其本地 Time Stamp Counter 将其转换为以后的 UTC 时间。一台计算机可能每天多次使用 NTP 来保持其本地时间的准确性。在 C++11 及更高版本中,这是通过
std::chrono::system_clock
. 访问的
几十年前,个人电脑并没有参与NTP, and instead asked the human who booted up the computer the current time and date, and then used its onboard TSC来保持当地时间。
更新
请阅读下面的 Peter Cordes 评论,了解我忽略的细节。