12

In processors that support time stamp counter (TSC) Linux provides the high resolution timer option using TSC. From what I understand TSC is a register that can be read but doesn't provide the option to interrupt the CPU at a configured rate. So for the timer interrupt generation in Linux still has to rely on I/O APIC (on x86) with HZ value typically set to 1000 or 250.

Even though TSC gives time stamps at micro second granularity the timer/scheduling granularity will still be at 4ms or 1ms depending on the HZ value. Is this understanding correct ? Or is there an option to improve the timer granularity using the TSC ?

4

1 回答 1

9

在默认的 Linux 2.6 内核中,可编程中断控制器 (PIT)(适用于所有 PC)用作系统计时器 [1]。顾名思义,PIT 可以通过编程(通常在内核启动时)以预定的速率中断 CPU。这个预先确定的速率就是你指的HZ值,它是一个静态编译的值,等于内核编译参数CONFIG_HZ。[2] 因此,您可以在编译时修改 CONFIG_HZ,PIT 将开始以上述频率中断 CPU。但是,请记住,PIT 是由大约 1.193 MHZ 的时钟在内部驱动的,因此将 CONFIG_HZ 设置为大于该值并不是一个好主意。正如 [3] 中指出的那样

多处理器系统中本地APIC(高级可编程中断控制器)的定时器用于处理器间同步

并通过 [1] 中的解释,我相信它的 PIT(而不是本地 APIC)与 HZ 值相关(至少在 2.6 内核之前)。

现在,谈到你的问题,理论上你的想法看起来是正确的。像本地 APIC 和 PIT 一样的时间戳计数器是另一个时间源[1]。在 [4] 中,您可以找到对此的确认。

Linux 可以利用这个寄存器来获得比可编程间隔定时器提供的更准确的时间测量。为此,Linux 必须在初始化系统时确定时钟信号频率。事实上,因为在编译内核时没有声明这个频率,所以相同的内核映像可能运行在时钟可能以任何频率滴答的 CPU 上。

但是,请记住时间戳计数器在每个 CPU 时钟周期递增。这给我们带来了与 CPU 时钟周期相关的计数器相关的棘手陷阱[5]。一个例子是现代 CPU 可以更改其 CPU 时钟频率以节省电力,这将影响存储在时间戳计数器中的值。如果发生这种情况,您可以估计它对您的时间测量的影响。此外,绝对空闲的内核可能会调用 HALT 指令,该指令完全停止处理器,直到收到外部中断。一直以来,TSC 永远不会增加,您会失去一些宝贵的“增量”,否则会使您的测量更加精确。简而言之,处理 TSC 是一个难题,不是特别适合用作可编程中断。

  1. 罗伯特·洛夫,LKD——第 3 版。(第 11 章)
  2. http://lxr.linux.no/linux+v2.6.31/arch/x86/include/asm/param.h#L5
  3. http://www.6test.edu.cn/~lujx/linux_networking/0131777203_ch02lev1sec7.html
  4. http://www.makelinux.net/books/ulk3/understandlk-CHP-6-SECT-1
  5. http://lwn.net/Articles/209101/
于 2012-12-19T23:59:40.783 回答