当前位置:  开发笔记 > 运维 > 正文

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

如何解决《在Linux中,getrusage(RUSAGE_THREAD,)和clock_gettime(CLOCK_THREAD_CPUTIME_ID,)有什么区别?》经验,为你挑选了0个好方法。

这个问题几乎说明了一切。根据的手册页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_ACCOUNTINGand / or的各种组合中启用高分辨率计时器VIRT_CPU_ACCOUNTING_GEN。我看到的唯一效果是,报告的非零值getrusage()从1000us更改为以1000us为中心的更高精度的范围。

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

推荐阅读
臭小子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有