两次连续调用 getrusage 是否一定会产生递增的结果?

Pas*_*uoq 5 c unix linux posix getrusage

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

我试图找到一种getrusage()增加执行的保证,但我的系统(Linux on x86-64)上的手册页和这个独立于系统的描述都没有明确说明这一点。

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

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

Art*_*Art 4

在许多系统上,rusage(我猜你的意思是ru_utimeru_stime)没有被准确计算,它只是每个时钟周期采样一次,通常慢至 100Hz,有时甚至更慢。

主要原因是许多机器的时钟读取起来非常昂贵,并且您不想进行此计算(每个系统调用都必须读取时钟两次)。在执行许多系统调用的程序中,您很可能会花费更多的时间来读取时钟,而不是执行其他任何操作。

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