为什么 Linux 内核代码是 100Hz 但显示器刷新率可以是 60Hz

Why Linux kernel ticker is 100Hz but monitor refresh rate can be 60Hz

我正在阅读 Robert Love 的“Linux 内核开发”。在第 11 章“计时器和时间管理”中,他提到:

The kernel defines the value in <asm/param.h>.The tick rate has a frequency of HZ hertz and a period of 1/HZ seconds. For example, by default the x86 architecture defines HZ to be 100.Therefore, the timer interrupt on i386 has a frequency of 100HZ and occurs 100 times per second (every one-hundredth of a second, which is every 10 milliseconds). Other common values for HZ are 250 and 1000, corresponding to periods of 4ms and 1ms, respectively.

我在想显示器刷新应该也是一个基于定时器的事件,但是刷新率是60Hz或120Hz,这个值似乎不能除以100,250或1000。

TL;DR:OS 滴答率与监视器刷新率无关。两者都控制不同的因素。

OS 滴答率定义了定时器中断触发的频率。此中断启用 OS 至 运行 其调度算法。每 OS tick,当前正在执行的任务被中断,并且 OS 开始 运行ning。在这里,OS 决定在接下来的滴答中哪个任务应该是 运行(这称为调度)并恢复该任务。实际上,定时器中断确保了下面的时间线。如您所见,一旦任务被安排,它有 10 毫秒 运行 不间断。

10ms TaskA, OS scheduling, 10ms TaskB, OS scheduling, 10ms TaskC, .....

假设其中一项任务负责向您的显示器绘制帧(比如说它是像 X 这样的显示服务器,或者游戏),它负责使用 运行s 在屏幕上的时间core 生成帧(屏幕上显示的内容)并将其写入帧缓冲区。显示控制器(HDMI、DP)负责定时从framebuffer中读取帧并发送给显示器。

如您所见,OS 滴答率和显示器刷新率没有关联。一个确定 OS 进行调度的频率,另一个确定在监视器上绘制帧的频率。我们可以通过观察两个极端来展示它们是如何分离的:

  • 图像幻灯片显示服务器可以将图像写入帧缓冲区一次,然后休眠直到需要更改图像(比如每 5 秒一次)。同时,显示控制器将继续从帧缓冲区中读取相同的图像并以 60Hz 刷新监视器。
  • 高 FPS 游戏(比如 300hz)。每 10ms,将生成并显示 3 帧。在 1 个 tick 内,应用程序将更新帧缓冲区 3 次。假设显示器仍然是 60Hz。然后显示控制器将仅在需要向监视器发送帧时读取每第 5 个生成的帧。

希望这是有道理的。我不是图形程序员,但我知道一些基础知识。