这个问题说明了一切。根据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时间时钟有何不同?
很明显,我之所以问这个问题,是因为我在我已经移植到Linux的应用程序中(从一个自定义的RTOS)中看到了两者之间的区别。该应用程序具有使用tick()和tock()函数实现的内部分析功能。由于我一直在研究这个问题,我已经将我的应用程序的一部分退化为:
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(),得到了更可信的结果,但我想知道为什么这两个系统调用存在,以及它们的行为为何如此不同。所以我想我应该问问专家。
发布于 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 *p是current。
getrusage(RUSAGE_THREAD, …)调用task_cputime_adjusted(current, &utime, &stime),其中存在两个定义( [a],[b] );使用哪一个定义取决于Linux内核配置项本土化。
选择此选项以启用更精确的任务和CPU时间记帐。
现在,我们需要知道是否在内核中选择了此选项。无论如何,这两种情况看起来都与clock_gettime()使用的方法不同。
尽管如此,我无法复制您的发现(我从两个系统调用中获得了几乎相同的数字)。一个示例程序可以提供更多帮助。
所以我想我应该问问专家。
我认为您会在Linux内核邮件列表中找到真正的专家。
https://stackoverflow.com/questions/34535641
复制相似问题