如何找到 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()
由以下几个因素决定:
带有默认值定时器裕量值为 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 盒子。所以我无法确认。但是啊! :)