首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >地理信息(RUSAGE_THREAD,.)之间的区别是什么?和clock_gettime(CLOCK_THREAD_CPUTIME_ID,.)在Linux里?

地理信息(RUSAGE_THREAD,.)之间的区别是什么?和clock_gettime(CLOCK_THREAD_CPUTIME_ID,.)在Linux里?
EN

Stack Overflow用户
提问于 2015-12-30 19:09:05
回答 1查看 1.1K关注 0票数 5

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

代码语言:javascript
复制
           struct timeval ru_utime; /* user CPU time used */
           struct timeval ru_stime; /* system CPU time used */

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

代码语言:javascript
复制
   CLOCK_THREAD_CPUTIME_ID (since Linux 2.6.12)
          Thread-specific CPU-time clock.

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

很明显,我之所以问这个问题,是因为我在我已经移植到Linux的应用程序中(从一个自定义的RTOS)中看到了两者之间的区别。该应用程序具有使用tick()tock()函数实现的内部分析功能。由于我一直在研究这个问题,我已经将我的应用程序的一部分退化为:

代码语言:javascript
复制
tick()
// code commented out
tock()

tick()函数记录运行时间,tock()函数记录运行时间,计算两者之间的增量,并报告增量。当我使用tick()tock()实现getrusage()时,我会得到大部分为0的out,偶尔也会得到1000 my或10000 my的值(根据我是否将内核配置为1 1kHz或100 my操作)。当我使用tick() & tock()实现clock_gettime()时,我得到了以13 to为中心的值(偶尔会奇怪地去75 to或100 to,但稍后我会处理)。

我尝试过在内核中启用高分辨率定时器以及VIRT_CPU_ACCOUNTING和/或VIRT_CPU_ACCOUNTING_GEN的各种组合。我看到的唯一效果是,getrusage()报告的非零值从1000 is变为以1000 is为中心的高精度值。

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

EN

回答 1

Stack Overflow用户

发布于 2018-02-13 12:39:09

地理信息(RUSAGE_THREAD,…)的区别是什么?和clock_gettime(CLOCK_THREAD_CPUTIME_ID,…)在Linux里?

clock_gettime(CLOCK_THREAD_CPUTIME_ID, …)最终调用了task_sched_runtime(p),它从p->se.sum_exec_runtime获取已考虑的运行时,其中struct task_struct *pcurrent

getrusage(RUSAGE_THREAD, …)调用task_cputime_adjusted(current, &utime, &stime),其中存在两个定义( [a][b] );使用哪一个定义取决于Linux内核配置项本土化

选择此选项以启用更精确的任务和CPU时间记帐。

现在,我们需要知道是否在内核中选择了此选项。无论如何,这两种情况看起来都与clock_gettime()使用的方法不同。

尽管如此,我无法复制您的发现(我从两个系统调用中获得了几乎相同的数字)。一个示例程序可以提供更多帮助。

所以我想我应该问问专家。

我认为您会在Linux内核邮件列表中找到真正的专家。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34535641

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档