Linux中的getrusage(RUSAGE_THREAD,…)和clock_gettime(CLOCK_TH
这个问题几乎说明了一切.根据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()函数记录它运行的时间,计算两者之间的增量,并报告该增量.当我使用getrusage()实现tick()和tock()时,我得到的大部分都是0,偶尔会有1000us或10000us的值(根据我是否为1kHz或100Hz操作配置了我的内核).当我实现tick()& tock()使用clock_gettime(),我得到的值集中在大约13us(偶尔会有奇怪的偏移到75us或100us,但我稍后会处理). 我尝试在内核中启用高分辨率计时器以及VIRT_CPU_ACCOUNTING和/或VIRT_CPU_ACCOUNTING_GEN的各种组合.我看到的唯一影响是getrusage()报告的非零值从1000us变为以1000us为中心的更高精度值范围. 我终于切换到使用clock_gettime()并且有更多可信的结果,但我想知道为什么两个系统调用存在,以及为什么它们的行为如此不同.所以我想我应该问一些专家. 解决方法
clock_gettime(CLOCK_THREAD_CPUTIME_ID,…)最终调用 getrusage(RUSAGE_THREAD,…)调用task_cputime_adjusted(current,& utime,& stime),其中存在两个定义[a],[b];使用它们取决于Linux内核配置项CONFIG_VIRT_CPU_ACCOUNTING_NATIVE:
现在我们需要知道你的内核中是否选择了这个选项.无论如何,这两种情况看起来都与clock_gettime()使用的方法不同. 也就是说,我无法重现您的发现(我从两个系统调用中得到几乎相同的数字).示例程序可以进一步提供帮助.
我想你会在Linux内核邮件列表上找到真正的专家. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |