Linux中getrusage(RUSAGE\u线程,…)和clock\u gettime(clock\u线程\u CPUTIME\u ID,…)之间的区别是什么?
这个问题几乎说明了一切。根据Linux中getrusage(RUSAGE\u线程,…)和clock\u gettime(clock\u线程\u CPUTIME\u ID,…)之间的区别是什么?,linux,multithreading,real-time,Linux,Multithreading,Real Time,这个问题几乎说明了一切。根据getrusage()的手册页,它返回: struct timeval ru_utime; /* user CPU time used */ struct timeval ru_stime; /* system CPU time used */ CLOCK_THREAD_CPUTIME_ID (since Linux 2.6.12) Thread-specific CPU-time clock.
getrusage()
的手册页,它返回:
struct timeval ru_utime; /* user CPU time used */
struct timeval ru_stime; /* system CPU time used */
CLOCK_THREAD_CPUTIME_ID (since Linux 2.6.12)
Thread-specific CPU-time clock.
根据clock\u gettime()
的手册页,它返回:
struct timeval ru_utime; /* user CPU time used */
struct timeval ru_stime; /* system CPU time used */
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\u CPU\u ACCOUNTING
和/或VIRT\u CPU\u ACCOUNTING\u GEN
的各种组合。我所看到的唯一影响是getrusage()
报告的非零值从1000us变为以1000us为中心的更高精度值范围
我最终改用了clock\u gettime()
,得到了更可信的结果,但我想知道为什么这两个系统调用存在,以及它们的行为为何如此不同。所以我想我应该问问专家
getrusage(RUSAGE_线程,…)和
Linux中的时钟获取时间(时钟线程CPUTIME ID…)
clock\u gettime(clock\u THREAD\u CPUTIME\u ID,…)
最终调用,它从p->se.sum\u exec\u runtime
获取计算的运行时,其中struct task\u struct*p
为当前运行时
getrusage(RUSAGE\u THREAD,…)
调用task\u cputime\u adjusted(current,&utime,&stime)
,其中存在两个定义;使用哪一个取决于Linux内核配置项:
选择此选项可启用更精确的任务和CPU时间
会计
现在我们需要知道是否在内核中选择了此选项。无论如何,这两种情况看起来都不同于clock\u gettime()
使用的方法
也就是说,我无法重现您的发现(我从两个系统调用中得到的数字几乎相同)。一个示例程序可以进一步帮助我们
所以我想我应该问问专家
我想你会在Linux内核邮件列表中找到真正的专家。你有没有将结果与CLOCK\u monotic
进行比较?CLOCK\u monotic
是全局的,而不是特定于线程的。我正在寻找特定于我的线程的已用时间计时器。我想知道CLOCK\u monotic
和CLOCK\u thread\u CPUTIME\u ID
之间是否存在显著差异。换句话说,如果他们真的测量了不同的东西。使用strace
还可以揭示调用之间的差异。