一尘不染

在 time(1) 的输出中,“real”、“user”和“sys”是什么意思?

javascript

$ time foo
real        0m0.003s
user        0m0.000s
sys         0m0.004s
$

在时间输出中是real什么意思usersys

对我的应用进行基准测试时,哪一个有意义?


阅读 235

收藏
2022-02-12

共1个答案

一尘不染

Real、User 和 Sys 进程时间统计

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

  • Real是挂钟时间 - 从通话开始到结束的时间。这是所有经过的时间,包括其他进程使用的时间片和进程阻塞的时间(例如,如果它正在等待 I/O 完成)。
  • 用户是进程用户模式代码(内核外部)所花费的 CPU 时间量。这只是执行进程中使用的实际 CPU 时间。其他进程和进程阻塞的时间不计入此数字。
  • Sys是进程内在内核中花费的 CPU 时间量。这意味着在内核中执行系统调用所花费的 CPU 时间,而不是仍在用户空间中运行的库代码。像“用户”一样,这只是进程使用的 CPU 时间。有关内核模式(也称为“主管”模式)和系统调用机制的简要说明,请参见下文。
User+Sys`将告诉您进程使用了多少实际 CPU 时间。请注意,这是跨所有 CPU 的,因此如果进程有多个线程(并且此进程在具有多个处理器的计算机上运行),它可能会超过`Real`(通常发生)报告的挂钟时间。请注意,在输出中,这些数字包括所有子进程(及其后代)的时间`User`和时间,以及它们可能被收集的时间,例如由或,尽管底层系统调用分别返回进程及其子进程的统计信息。`Sys``wait(2)``waitpid(2)

报告的统计数据的来源time (1)

报告的统计信息time是从各种系统调用中收集的。’User’ 和 ‘Sys’ 来自wait (2)( POSIX ) 或times (2)( POSIX ),具体取决于特定系统。gettimeofday (2)“真实”是根据从通话中收集的开始和结束时间计算的。根据系统的版本,各种其他统计信息,例如上下文切换的数量也可能由time.

在多处理器机器上,多线程进程或派生子进程的运行时间可能小于总 CPU 时间——因为不同的线程或进程可能并行运行。此外,报告的时间统计数据来自不同的来源,因此为非常短的运行任务记录的时间可能会出现舍入误差,如原始海报给出的示例所示。

内核与用户模式的简要介绍

在 Unix 或任何受保护内存的操作系统上,“内核”或“主管”模式是指 CPU 可以运行的特权模式。某些可能影响安全性或稳定性的特权操作只能在 CPU 运行时执行这种模式;这些操作不适用于应用程序代码。此类操作的一个示例可能是操纵MMU以访问另一个进程的地址空间。通常,用户模式代码不能这样做(有充分的理由),尽管它可以从内核请求共享内存,这可能被多个进程读取或写入。在这种情况下,共享内存是通过安全机制从内核显式请求的,并且两个进程都必须显式附加到它才能使用它。

特权模式通常被称为“内核”模式,因为内核是由运行在该模式下的 CPU 执行的。为了切换到内核模式,您必须发出特定指令(通常称为陷阱)将 CPU 切换到在内核模式下运行并从跳转表中保存的特定位置运行代码。 出于安全原因,您不能切换到内核模式并执行任意代码 - 陷阱是通过一个地址表来管理的,除非 CPU 在超级用户模式下运行,否则这些地址无法写入。您使用显式陷阱编号进行陷阱,并在跳转表中查找地址;内核具有有限数量的受控入口点。

C 库中的“系统”调用(尤其是手册页第 2 节中描述的那些)具有用户模式组件,这是您从 C 程序实际调用的组件。在幕后,他们可能会向内核发出一个或多个系统调用来执行特定的服务,例如 I/O,但他们仍然有代码在用户模式下运行。如果需要,也可以直接从任何用户空间代码向内核模式发出陷阱,尽管您可能需要编写一段汇编语言来正确设置调用的寄存器。

更多关于“系统”的信息

有些事情是您的代码无法在用户模式下完成的——例如分配内存或访问硬件(HDD、网络等)。这些都在内核的监督下,只有它可以做到。malloc像或fread/之类的一些操作fwrite将调用这些内核函数,然后将计为“sys”时间。不幸的是,它并不像“对 malloc 的每次调用都将计入 ‘sys’ 时间”那么简单。调用malloc将自己进行一些处理(仍计入“用户”时间),然后在某个地方调用内核中的函数(计入“系统”时间)。从内核调用返回后,“用户”中将有更多时间,然后malloc将返回您的代码。至于切换发生的时间,以及在内核模式下花费了多少……你不能说。这取决于库的实现。此外,其他看似无辜的功能也可能malloc在后台使用等,然后在“sys”中再次使用一段时间。

2022-02-12