了解新旧 Linux 系统上的计时器分辨率

了解新旧 Linux 系统上的计时器分辨率

如何找到 Linux/POSIX 系统上系统计时器的分辨率?我特别感兴趣的是nanosleep()可以等待的最短时间。我现有的实现调用sysconf(_SC_CLK_TCK)在旧内核(<=2.4)上运行良好。它返回每秒的时钟滴答数,在当时,这似乎与计时器的分辨率相对应(1/瞬间)。

然而,现代机器通常使用(a)时间戳计数器/高精度事件计时器(b)“无蜱”内核。他们不再使用固定的计时器中断间隔,因此_SC_CLK_TCK不再有意义。在这些机器上,sysconf(_SC_CLK_TCK)尽管实际的计时器粒度要小得多,但通常会返回 100。

sysconf(_SC_CLK_TCK)有没有一种方法可以检测(最好是从 C/C++ 代码)我是否在不再对应计时器粒度的新系统上运行?在这种情况下我想返回 0。

答案1

您可以等待的最短时间nanosleep()由以下几个因素决定:

  1. 定时器松弛
  2. 上下文切换时间
  3. 定时器的准确度和精度

带有默认值定时器裕量值为 50 µs,即使以 0 ns 或 1 ns 的持续时间调用 nanosleep,默认情况下,如果您的进程在正常(其他)调度下运行,您实际上也会等待 50 µs 左右。

prctl()您可以通过调用或在实时调度类下运行进程来禁用计时器松弛机制。

然而,nanosleep 调用仍然会产生自愿上下文切换,这需要 3 µs 左右,具体取决于您的硬件。

确实没有直接的方法来查询 nanosleep 使用的计时器的准确性/精度。 POSIX 指定 nanosleep 应进行测量CLOCK_REALTIME,您可以使用以下命令查询其分辨率clock_getres()。但是,计时器的准确度/精确度可能会低于此。

但是您可以简单地通过在程序启动时调用一些小值(例如 1 ns、1 µs、10 µs)来间接查询 nanosleep 的准确性/精度,并根据clock_gettime(CLOCK_REALTIME)CPU 的运行时间来测量其实际运行时间。TSC

答案2

我的(更多)经验是关于 BSD 的,以及他们的纳米睡眠 POSIX.1(IEEE 标准 1003.1-2008)。看起来与 相关libc。因此(即使在 Linux 上)您可能会在time.h.您很可能能够找到一些指向您正在寻找的(高精度)计时器的指针。我手边没有 Linux 盒子。所以我无法确认。但是啊! :)

相关内容