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