在一个调用getrusage()两次以便通过减法获取任务时间的程序中,我曾经看过一个断言,说任务的时间应该是非负的,失败.当然,这不容易被复制,尽管我可以编写一个可以更容易地再现它的专门程序.
我试图找到getrusage()在执行时增加的保证,但我的系统上的手册页(x86-64上的Linux)和this system-independant description都没有明确说明.
在具有多个核心和NTP运行的物理计算机上观察到该行为.
我应该报告我正在使用的操作系统的错误吗?当我希望getrusage()随着时间的推移而增加时,我会问得太多吗?
解决方法:
在许多系统上,rusage(我认为你的意思是ru_utime和ru_stime)没有准确计算,它只是每个时钟周期采样一次,通常慢到100Hz,有时甚至更慢.
主要原因是许多机器的时钟读取成本非常高,而且您不想进行这种计算(每次系统调用都必须读取两次时钟).您可以轻松地花费更多时间阅读时钟而不是在执行许多系统调用的程序中执行任何其他操作.
柜台不应该倒退.我已经看到很多年前,在上下文切换中跟踪了该过程的总运行时间(这是相对便宜的,并且getrusge可以通过使用样本来计算时间,并从总运行时间中减去该时间).在这种情况下使用的时钟是挂钟而不是单调时钟,当您更改机器上的时间时,进程的运行时间可能会恢复.但那当然是一个错误.