这个问题几乎说明了一切。根据的手册页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时间时钟有何不同?
显然,我之所以问是因为,在从自定义RTOS移植到Linux的应用程序中,我看到了两者之间的差异。该应用程序具有通过tick()
和tock()
功能实现的内部配置文件功能。我一直在研究这个问题,因此我将应用程序的一部分退化为:
tick() // code commented out tock()
该tick()
函数记录运行时间,tock()
函数记录运行时间,计算两者之间的增量,并报告该增量。当我实现tick()
并tock()
使用时getrusage()
,我得到的大部分为0,偶尔会有1000us或10000us的值(根据我是否将内核配置为1kHz或100Hz操作)。当我实现tick()
并tock()
使用时clock_gettime()
,我得到的值以13us为中心(偶尔会出现75us或100us的奇异偏移,但稍后再讨论)。
我尝试在内核和VIRT_CPU_ACCOUNTING
and / or的各种组合中启用高分辨率计时器VIRT_CPU_ACCOUNTING_GEN
。我看到的唯一效果是,报告的非零值getrusage()
从1000us更改为以1000us为中心的更高精度的范围。
我最终转而使用clock_gettime()
并获得了更可信的结果,但是我想知道为什么这两个系统调用存在,以及为什么它们的行为如此不同。所以我想我应该问一些专家。