在支持时间戳计数器( TSC )处理器中,Linux提供了使用TSC的高精度计时器选项。据我所知,TSC是一个可以读取的寄存器,但不提供以配置的速率中断CPU的选项。因此,对于定时器,Linux中的中断生成仍然必须依赖于HZ值通常设置为1000或250的I/ or (在x86上)。
即使TSC提供微秒粒度的时间戳,根据HZ值的不同,计时器/调度粒度仍然是4ms或1ms。这种理解是正确的吗?或者,是否有使用TSC提高计时器粒度的选项?
发布于 2012-12-20 07:59:41
在默认的Linux 2.6内核中,可编程中断控制器( PIT ) (在所有PC上都可用)用作系统定时器1。顾名思义,PIT可以编程(通常在内核启动时)以预定的速率中断CPU。这个预定的速率是你引用的HZ值,它是一个静态编译的值,等于内核编译参数CONFIG_HZ.2,所以,你可以在编译时修改CONFIG_HZ,PIT会以这个频率开始中断CPU。但是,请记住,该凹坑是由大约1.193 MHZ的时钟在内部驱动的,因此将CONFIG_HZ设置为大于此值并不是一个好主意。正如在3中指出的那样
是多处理机系统中局部高级可编程中断控制器的定时器,用于处理机间的同步
根据1中的解释,我认为它的PIT (而不是本地APIC)与HZ值(至少在2.6内核之前)绑定在一起。
现在,来回答你的问题,理论上你的想法看起来是正确的。时间戳计数器与本地APIC和PIT一样,是另一种时间source1。在4中,你会发现这一点的确认。
Linux可以利用这个寄存器来获得比可编程间隔定时器提供的时间测量精确得多的时间测量结果。为此,Linux必须在初始化系统时确定时钟信号频率。事实上,因为在编译内核时没有声明这个频率,所以相同的内核映像可以在其时钟可以以任何频率运行的CPU上运行。
但是,请记住,时间戳计数器在每个CPU时钟周期都会递增。这给我们带来了与CPU时钟cycles5相关的计数器相关的棘手陷阱。一个例子是,现代CPU可以改变它们的CPU时钟频率来节省电力,这将影响存储在时间戳计数器中的值。如果发生这种情况,您可以估计它可能对您的时间测量产生的影响。此外,绝对空闲的内核可以调用停止指令,该指令完全停止处理器,直到接收到外部中断。在这段时间里,TSC永远不会递增,您将失去一些宝贵的‘增量’,否则将使您的测量更精确。简而言之,处理TSC是一个困难的问题,不是特别适合用作可编程中断。
https://stackoverflow.com/questions/13950264
复制相似问题