Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux中getrusage(RUSAGE\u线程,…)和clock\u gettime(clock\u线程\u CPUTIME\u ID,…)之间的区别是什么?_Linux_Multithreading_Real Time - Fatal编程技术网

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
还可以揭示调用之间的差异。