在内核和时间之间切换时的时间戳计数器(TSC)用户模式

时间:2009-05-11 15:18:17

标签: linux kernel

我想知道是否有人在上下文切换时知道有关Linux中时间戳计数器的更多细节?到目前为止,我认为TSC值在每个时钟周期内仅增加1,在内核或用户模式下是独立的。我现在测量了使用TSC的应用程序的性能,它产生了5 Mio Clock Cyles的性能结果。然后,我对调度程序进行了一些更改,这意味着上下文切换需要相当长的时间,例如。 2 Mio循环而不是500.000循环。有趣的是,当再次测量原始应用程序的性能时,它仍然需要5个Mio周期......所以我想知道为什么它不需要花费更长的时间,因为上下文切换现在需要更多的Mio时钟周期? (并且在执行应用程序期间至少出现3个上下文。)

在内核模式下,时间戳计数器是否以某种方式停用?或者在比赛开关期间保存了TSC的内容?谢谢,如果有人能指出我可能是什么问题!

2 个答案:

答案 0 :(得分:1)

您可以阅读Wikipedia

  

随着多核/超线程CPU,具有多个CPU的系统和“休眠”操作系统的出现,不能依赖TSC来提供准确的结果。该问题有两个组成部分:滴答速率以及所有核心(处理器)在其计时寄存器中是否具有相同的值。没有承诺单个主板上多个CPU的时间戳计数器将同步。在这种情况下,程序员只能通过将代码锁定到单个CPU来获得可靠的结果。即便如此,由于OS或BIOS采取的省电措施,CPU速度可能会发生变化,或者系统可能会休眠并稍后恢复(重置时间戳计数器)。依赖于时间戳计数器也降低了可移植性,因为其他处理器可能没有类似的功能。最近的英特尔处理器包括一个恒定速率的TSC(由Linux的/ proc / cpuinfo中的constant_tsc标志标识)。使用这些处理器,TSC以处理器的最大速率读取,而不管实际的CPU运行速率如何。虽然这使得时间保持更加一致,但它可能会使基准测试产生偏差,其中在OS将处理器切换到更高速率之前以较低的时钟速率花费一定量的旋转时间。这样做的结果是,它们看起来需要比通常更多的处理器周期。

答案 1 :(得分:0)

我相信TSC实际上是您正在使用的处理器的硬件结构。 IE:读取TSC实际上使用RDTSC处理器操作码。我甚至认为操作系统没有办法改变它的值,它只是随着自上次电源复位后的每次滴答而增加。

关于您对调度程序的修改,您是否可能以操作系统未切换运行进程的方式使用多核处理器?您可以在程序中调用sched_yield()sleep(0),以查看调度程序更改是否开始生效。