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

18 浏览
0 Comments

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

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

在时间输出中,realusersys代表什么意思?在基准测试我的应用程序时,哪个是有意义的?

admin 更改状态以发布 2023年5月22日
0
0 Comments

为了进一步解释被接受的回答,我想提供另一个原因,为什么realuser + sys

请记住,real代表实际经过的时间,而usersys的值代表CPU执行时间。因此,在多核系统上,user和/或sys时间(以及它们的总和)实际上可以超过实际经过的时间。例如,在我运行的Java应用程序中,我得到了以下一组值:

real    1m47.363s
user    2m41.318s
sys     0m4.013s

0
0 Comments

真实时间、用户时间和系统时间统计

其中一个不同于其他的元素。真实时间指实际经过的时间,用户时间和系统时间指进程仅用到的 CPU 时间。

  • 真实时间指调用开始到结束经过的墙上时钟时间。这是所有包括其他进程使用的时间片以及进程阻塞所花费的等待 I/O 完成等的所有经过时间。

  • 用户时间指进程内在用户空间(内核之外)中执行的 CPU 时间量。这是执行进程时实际使用的 CPU 时间。其他进程和进程阻塞花费的时间不会计入此数字。

  • 系统时间指在进程内部内核中所花费的 CPU 时间量。这意味着在内核内部执行系统调用所花费的 CPU 时间,而不是运行在用户空间中的库代码。像 "用户时间" 一样,这仅由进程使用的 CPU 时间。请参阅下文以简要介绍内核模式(也称为 "监管模式")和系统调用机制。

用户时间+系统时间告诉您进程实际使用的 CPU 时间。请注意,这涉及所有 CPU,因此如果进程具有多个线程(并且该进程在具有多个处理器的计算机上运行),则可能会超过 Real 报告的墙上时钟时间(通常发生)。请注意,在输出中,这些数字包括所有子进程(及其后代)的 UserSys 时间,以及它们在收集时也可以被收集,例如通过 wait(2)waitpid(2),尽管底层系统调用为进程及其子进程分别返回统计信息。

time(1) 报告的统计信息的源

time 报告的统计信息来自各种系统调用。 "用户" 和 "系统" 来自 wait(2)POSIX)或 times(2)POSIX),具体取决于特定的系统。 "Real" 是从采集的开始时间和结束时间计算得出的。 gettimeofday(2) 调用。根据系统版本,还可以通过 time 收集其他各种统计信息,例如上下文切换次数。

在多处理器机器上,多线程进程或分叉子进程的经过时间可能小于总 CPU 时间-因为不同的线程或进程可能同时运行。此外,报告的时间统计信息来源不同,因此针对非常短暂的运行任务记录的时间可能会出现舍入误差,如原始帖子所示。

内核模式与用户模式简介

在Unix或任何受保护内存的操作系统中,“内核”或“监管程序”模式指的是CPU可以运行的特权模式。只有在CPU运行在此模式时才可以执行某些可能影响安全性和稳定性的特权操作;这些操作对应用程序代码不可用。例如,这样的操作可能是操纵内存管理单元以访问另一个进程的地址空间。正常情况下,用户模式下的代码不能这样做(出于很好的原因),尽管它可以从内核中请求共享内存,该共享内存可以由多个进程读取或写入。在这种情况下,共享内存通过安全机制显式地从内核请求,并且必须指定进程才能使用它。

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

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

关于“sys”的更多信息

有一些操作您的代码无法从用户模式下执行-比如分配内存或访问硬件(硬盘驱动器,网络等)。这些操作在内核的监管下,只有内核可以执行它们。一些操作,如mallocfread/fwrite将调用这些内核函数,然后将计入“sys”时间。不幸的是,它不是像“每次调用malloc都会计入'sys'时间”那么简单。调用malloc将执行自己的某些处理(仍计入“user”时间),然后在某个地方可能调用内核函数(计入“sys”时间)。从内核调用返回后,还会有一些时间在“user”模式下,然后malloc将返回到您的代码。关于何时发生切换以及多少时间用于内核模式……无法确定。它取决于库的实现。此外,其他看似无害的函数也可能在后台使用malloc及类似函数,这也会再次计入“sys”的时间。

0