为什么“用户”和“系统”时间在多次执行时会有所不同?

The*_*eer 5 process scheduling time

有一个很好的问答来解释“真实”、“用户”和“系统”之间的关系。

它解释了为什么“真实”会发生变化的原因,并将“用户”和“系统”定义为进程在处理器上实际运行的时间。

现在让我们完全忽略“真实”。我注意到多次运行同一个应用程序时,它给出了不同的“系统”和“用户”。

$time dummy_app
user    0m0.032s
sys     0m0.064s

$time dummy_app
user    0m0.020s
sys     0m0.084s
Run Code Online (Sandbox Code Playgroud)

dummy_app 只是一个从 0 到 100000 计数的 for 循环。

同一个二进制文件的执行会在处理器上花费不同时间的原因是什么?换句话说,为什么同一个应用程序的“用户”和“系统”不总是相同的?

Jan*_*Jan 3

为什么同一二进制文件在多次执行时执行时间不同

这里的关键问题是 CPU 工作方式导致的不确定性行为。现代超标量 CPU 可以一次执行多条指令或更改要执行的命令的顺序(乱序执行)。关于您的示例,缓存使用的优化也可能适用。RAM 比 CPU 本身慢几个数量级,这就是使用密集缓存的原因。二进制文件的第二次运行可能会在缓存中运行,从而消耗更少的 CPU 周期(CPU 等待从内存检索数据的周期)。

关于real、user和sys进程时间统计的差异

其中一件事与另一件事不同。Real是指实际经过的时间;User 和 Sys 指的是仅由进程使用的 CPU 时间。

  • 实际时间是挂钟时间 - 从通话开始到结束的时间。这是所有经过的时间,包括其他进程使用的时间片和进程阻塞的时间(例如,如果它正在等待 I/O 完成)。

  • User是进程用户模式代码(内核之外)所花费的 CPU 时间量。这只是执行进程时使用的实际 CPU 时间。其他进程和进程花费的阻塞时间不计入此数字。

  • Sys是进程内内核所花费的 CPU 时间量。这意味着执行内核中的系统调用所花费的 CPU 时间,而不是仍在用户空间中运行的库代码。与“用户”一样,这只是进程使用的 CPU 时间。请参阅下面的内核模式(也称为“管理程序”模式)和系统调用机制的简要描述。

User+Sys会告诉您进程实际使用了多少 CPU 时间。请注意,这是跨所有 CPU 的,因此如果进程有多个线程,则可能会超过 报告的挂钟时间Real。请注意,在输出中,这些数字包括所有子进程(及其后代)的时间UserSys时间,以及它们可以被收集的时间,例如通过wait(2)waitpid(2),尽管底层系统调用分别返回进程及其子进程的统计信息。

来源