【发布时间】:2015-12-30 19:09:05
【问题描述】:
这个问题几乎说明了一切。根据getrusage() 的手册页,它返回:
struct timeval ru_utime; /* user CPU time used */
struct timeval ru_stime; /* system CPU time used */
根据clock_gettime() 的手册页,它返回:
CLOCK_THREAD_CPUTIME_ID (since Linux 2.6.12)
Thread-specific CPU-time clock.
那么,(线程特定的)“使用的用户/系统 CPU 时间”与线程特定的 CPU 时间时钟有何不同?
显然,我之所以这么问,是因为我在移植到 Linux 的应用程序(来自自定义 RTOS)中发现了两者之间的差异。该应用程序具有使用tick() 和tock() 函数实现的内部分析功能。当我一直在研究这个时,我已经将我的应用程序的一部分退化为:
tick()
// code commented out
tock()
tick() 函数记录它的运行时间,tock() 函数记录它运行的时间,计算两者之间的增量,并报告该增量。当我使用getrusage() 实现tick() 和tock() 时,我得到的主要是0,偶尔会得到1000us 或10000us 的值(根据我是否将内核配置为1kHz 或100Hz 操作)。当我使用 clock_gettime() 实现 tick() 和 tock() 时,我得到的值集中在 13us 左右(偶尔会出现 75us 或 100us 的奇怪偏移,但我稍后会处理)。
我尝试在内核中启用高分辨率计时器以及VIRT_CPU_ACCOUNTING 和/或VIRT_CPU_ACCOUNTING_GEN 的各种组合。我看到的唯一效果是getrusage() 报告的非零值从 1000us 变为以 1000us 为中心的更高精度值范围。
我终于改用clock_gettime() 并且得到了更可信的结果,但我想知道为什么这两个系统调用存在,以及为什么它们的行为如此不同。所以我想我应该问一些专家。
【问题讨论】:
-
您是否将结果与
CLOCK_MONOTONIC进行了比较? -
CLOCK_MONOTONIC是全局的,而不是特定于线程的。我正在寻找一个特定于我的线程的经过时间计时器。 -
我想知道
CLOCK_MONOTONIC和CLOCK_THREAD_CPUTIME_ID之间是否存在显着差异。换句话说,如果他们实际上测量了不同的东西。使用strace也可能有助于了解调用之间的差异。
标签: linux multithreading real-time