使用TSC作为时钟源可以改善定时器和调度粒度吗?

时间:2012-12-19 10:28:10

标签: linux timer linux-kernel operating-system

在支持时间戳计数器(TSC)的处理器中,Linux使用TSC提供高分辨率计时器选项。根据我的理解,TSC是一个可以读取的寄存器,但不提供以配置的速率中断CPU的选项。因此,对于Linux中的定时器中断生成仍然必须依赖I / O APIC(在x86上),HZ值通常设置为1000或250.

即使TSC以微秒级粒度给出时间戳,定时器/调度粒度仍将是4ms或1ms,具体取决于HZ值。这种理解是否正确?或者是否可以使用TSC来改善计时器粒度?

1 个答案:

答案 0 :(得分: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的定时器(Advanded Programmable Interrupt   多处理器系统中的控制器用于处理器间   同步

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

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

  

Linux可以利用此寄存器来获得更准确的信息   时间测量值比可编程间隔时间测量值小   计时器。为此,Linux必须确定时钟信号频率   在初始化系统时。实际上,因为这个频率不是   在编译内核时声明,可以运行相同的内核映像   时钟可以以任何频率打勾的CPU。

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

  1. Robert Love,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/