【问题标题】:Time Stamp counter (TSC) when switching between Kernel & User mode在内核和用户模式之间切换时的时间戳计数器 (TSC)
【发布时间】:2009-05-11 15:18:16
【问题描述】:

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

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

【问题讨论】:

    标签: linux kernel


    【解决方案1】:

    您可以在Wikipedia上阅读

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

    【讨论】:

    • 我应该提到我使用 maxcpus=1 禁用了其中一个核心。使用 cat /proc/cpuinfo 时,它告诉我只有一个 CPU,而且我设置了 constant_tsc 标志!也就是说,为什么这一切都有点可疑......
    • 从上面的引述中:“即便如此,由于操作系统采取的节能措施,CPU 速度可能会发生变化”。
    【解决方案2】:

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

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

    【讨论】:

    • 感谢您的意见。我也是这么想的,TSC 只是一个硬件计数器,随着每个滴答声增加。我在多核上运行应用程序,但我通过在启动期间设置 maxcpus=1 禁用了第二个核心,因此我只有一个核心。所以,基本上我现在在同一个核心上运行这两个进程(希望;)),但 TSC 计数器的差异仍然是 5 Mio。我猜当 2 个进程共享 CPU 时间时它应该加倍或类似的东西......
    • PS.:我应该提到一个事实,即我知道调度程序在程序执行期间被调用了 3-10 次。但是,它可能只是安排而不是立即再次执行相同的过程....
    • 时间戳计数器是一个 MSR,确切地说是 MSR 0x10。操作系统可以向其写入值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-02
    • 2013-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多