小编Pat*_*yle的帖子

在Linux中,getrusage(RUSAGE_THREAD,...)和clock_gettime(CLOCK_THREAD_CPUTIME_ID,...)有什么区别?

这个问题几乎说明了一切。根据的手册页getrusage(),它返回:

           struct timeval ru_utime; /* user CPU time used */
           struct timeval ru_stime; /* system CPU time used */
Run Code Online (Sandbox Code Playgroud)

根据的手册页clock_gettime(),它返回:

   CLOCK_THREAD_CPUTIME_ID (since Linux 2.6.12)
          Thread-specific CPU-time clock.
Run Code Online (Sandbox Code Playgroud)

那么,(特定于线程的)“使用的用户/系统CPU时间”与特定于线程的CPU时间时钟有何不同?

显然,我之所以问是因为,在从自定义RTOS移植到Linux的应用程序中,我看到了两者之间的差异。该应用程序具有通过tick()tock()功能实现的内部配置文件功能。我一直在研究这个问题,因此我将应用程序的一部分退化为:

tick()
// code commented out
tock()
Run Code Online (Sandbox Code Playgroud)

tick()函数记录运行时间,tock()函数记录运行时间,计算两者之间的增量,并报告该增量。当我实现tick()tock()使用时getrusage(),我得到的大部分为0,偶尔会有1000us或10000us的值(根据我是否将内核配置为1kHz或100Hz操作)。当我实现tick()tock()使用时clock_gettime(),我得到的值以13us为中心(偶尔会出现75us或100us的奇异偏移,但稍后再讨论)。

我尝试在内核和VIRT_CPU_ACCOUNTINGand / or的各种组合中启用高分辨率计时器VIRT_CPU_ACCOUNTING_GEN。我看到的唯一效果是,报告的非零值getrusage()从1000us更改为以1000us为中心的更高精度的范围。

我最终转而使用clock_gettime()并获得了更可信的结果,但是我想知道为什么这两个系统调用存在,以及为什么它们的行为如此不同。所以我想我应该问一些专家。

linux multithreading real-time

5
推荐指数
1
解决办法
640
查看次数

标签 统计

linux ×1

multithreading ×1

real-time ×1