操作系统如何确定瞬时时钟速度?



我已经戳了一下,但如果我用谷歌搜索它,我才能得到时钟速度的定义。软件如何确定CPU的当前时钟速度?有具体的说明吗?

编辑这个问题似乎已经有了答案,我只是看得不够深入。

据我所知;对于所有现有的CPU,CPU的瞬时时钟速度无法测量。

您可以获得的最接近的方法(取决于它所在的 CPU)是在很短的时间内找到平均时钟速度。例如,对于现代 80x86 CPU,您可以设置一个性能监控计数器来测量"未停止 (CPU) 时钟周期",然后使用 TSC(以"标称"固定频率运行,与 CPU 周期无关)来计算"CPU 周期/时间"。当然,这涉及"准确性与持续时间"的折衷(持续时间越长越准确,持续时间很短的持续时间越不准确)。

另一个问题是,这些信息在您可以使用之前就已经过时了。例如,CPU 的速度可以在确定 CPU 速度之前立即变化,也可以在确定 CPU 速度后立即再次变化;如果你能知道某个时间点(在测量时)的确切CPU速度,那么这些信息将毫无价值,因为它并不意味着任何其他时间点(虽然没有测量)的任何内容。

为了防止这种情况,您真正想要的是 CPU 速度变化的日志(例如,当 CPU 速度发生变化时,在日志中添加一个包含时间戳和新速度的条目),以便您可以使用日志来确定过去任何时间点的 CPU 速度。在某些情况下,这可能是可能的(例如,如果软件本身更改了 CPU 速度,或者如果本地 APIC 配置为生成"热量监视器 IRQ",则软件可以将相关条目添加到日志中)。可悲的是,对于其他情况("涡轮增压"),这是不可能的(软件不会通知速度变化)。

另一个问题是你假设一个CPU有一个时钟速度。虽然这在过去是正确的,但它不再是真的,并且有理由预计它将来会变得"更不真实"。例如;现代 80x86 CPU 通常有一个用于通用指令的时钟和一个用于 SIMD 的不同时钟(例如 AVX),其中(不使用 AVX 指令时)CPU 可以/将降低"AVX 时钟"以降低功耗(然后当您开始使用 AVX 指令时,需要数千个周期才能使"AVX 时钟"恢复全速)。理论上,CPU可以分为任意数量的域,每个域都有自己独立的时钟。

当然,也有异步CPU设计(见 https://en.wikipedia.org/wiki/Asynchronous_circuit#Asynchronous_CPU),它们根本没有时钟。

最新更新