在支持时间戳计数器(TSC)的处理器中,Linux使用TSC提供高分辨率计时器选项。根据我的理解,TSC是一个可以读取的寄存器,但不提供以配置的速率中断CPU的选项。因此,对于Linux中的定时器中断生成仍然必须依赖I / O APIC(在x86上),HZ值通常设置为1000或250.
即使TSC以微秒级粒度给出时间戳,定时器/调度粒度仍将是4ms或1ms,具体取决于HZ值。这种理解是否正确?或者是否可以使用TSC来改善计时器粒度?
答案 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是一个难题,不是特别适合用作可编程中断。