C 连续两次调用getrusage是否保证产生越来越多的结果?

C 连续两次调用getrusage是否保证产生越来越多的结果?,c,linux,unix,posix,getrusage,C,Linux,Unix,Posix,Getrusage,在一个调用两次getrusage()以通过减法获得任务时间的程序中,我曾经看到一个断言,说任务时间应该是非负的,但失败了。当然,这不容易复制,尽管我可以编写一个专门的程序,可以更容易地复制它 我试图找到一种保证,即getrusage()会随着执行而增加,但我的系统手册页(x86-64上的Linux)也没有明确说明这一点 该行为是在一台物理计算机上观察到的,该计算机具有多个内核,并且NTP正在运行 我应该报告我正在使用的操作系统的错误吗?当我期望getrusage()随时间增加时,我是否要求太多?

在一个调用两次
getrusage()
以通过减法获得任务时间的程序中,我曾经看到一个断言,说任务时间应该是非负的,但失败了。当然,这不容易复制,尽管我可以编写一个专门的程序,可以更容易地复制它

我试图找到一种保证,即
getrusage()
会随着执行而增加,但我的系统手册页(x86-64上的Linux)也没有明确说明这一点

该行为是在一台物理计算机上观察到的,该计算机具有多个内核,并且NTP正在运行

我应该报告我正在使用的操作系统的错误吗?当我期望
getrusage()
随时间增加时,我是否要求太多?

在许多系统上,rusage(我想你的意思是
ru\u-utime
ru\u-stime
)计算不准确,它只是每个时钟周期采样一次,通常慢至100Hz,有时甚至更慢

主要原因是许多机器的时钟读起来非常昂贵,而您不想做这种记帐(每次系统调用都必须读两次时钟)。在执行许多系统调用的程序中,读取时钟的时间可能比执行其他任何操作都要多


不过,计数器绝对不能倒着走。我在很多年前就见过,在上下文切换上跟踪进程的总运行时间(这相对便宜,getrusge可以通过使用stime的样本来计算utime,并从总运行时间中减去它)。在这种情况下使用的时钟是挂钟,而不是单调的时钟,当您更改机器上的时间时,进程的运行时间可以返回。但这当然是一个错误。

这是在专用计算机上还是在虚拟实例上?@ShafikYaghmour这是在物理(和多核)计算机上。@ShafikYaghmour这是在欧洲,而不是在DST相关调整时。然而,NTP守护进程正在运行,并且可以在任何时候调整1秒的时钟,因为它很容易这样做。实际上,失败的断言涉及的是
ru_-utime
ru_-stime
的总和,因此,似乎在非常短的任务持续时间内,至少有一个发生了倒退,但是我不知道是哪个。如果你想要这些时间的总和,请查看系统文档,看看在
clock\u gettime
中是否有更好的选项。因为您用linux标记了它,所以您应该有
CLOCK\u PROCESS\u CPUTIME\u ID
,它将提供比
getrusage
更好的分辨率和准确性,因为据我所知,它是在上下文切换和阅读时记录的。当然,这并不能回答问题,但可能是一个更好的选择。