在时间(1)的输出中,“真实”,“用户”和“系统”是什么意思?
$ time foo real 0m0.003s user 0m0.000s sys 0m0.004s $
在时间输出中,“真实”,“用户”和“系统”是什么意思?
在testing我的应用时,哪一个是有意义的?
真实,用户和系统进程时间统计
其中一件事情不像其他事情。 实数是指实际经过的时间; 用户和系统是指仅由进程使用的CPU时间。
-
实时是从通话开始到结束的挂钟时间。 这是所有已用时间,包括其他进程使用的时间片和进程花费的时间(例如,如果它正在等待I / O完成)。
-
用户是在进程内用户模式代码(内核之外)花费的CPU时间。 这只是执行过程中使用的实际CPU时间。 其他进程和时间花费在这个数字上并不算在内。
-
Sys是进程内核中CPU时间的数量。 这意味着在内核中执行系统调用所花费的CPU时间,而不是在用户空间中运行的库代码。 像“用户”一样,这只是进程使用的CPU时间。 请参阅下面的内核模式(也称为“supervisor”模式)和系统调用机制的简要说明。
User+Sys
会告诉你你的进程使用了多less实际的CPU时间。 请注意,这是跨所有CPU,因此如果进程有多个线程(并且此进程在具有多个处理器的计算机上运行),它可能会超过由Real
(通常会发生)报告的挂钟时间。 请注意,在输出中,这些数字包括所有subprocess(及其subprocess)的User
和Sys
时间,以及它们可能已被收集的时间,例如wait(2)
或waitpid(2)
,尽pipe基础系统调用返回统计过程及其子女分开。
统计time (1)
报告的起源time (1)
time
报告的统计数据来自各种系统调用。 “用户”和“系统”来自wait (2)
或times (2)
,取决于特定的系统。 “真实”是从gettimeofday (2)
调用收集的开始和结束时间计算得出的。 根据系统的版本,还可以按time
收集各种其他统计信息,例如上下文切换的数量。
在多处理器机器上,multithreading进程或分叉subprocess的时间可能会小于总CPU时间 – 因为不同的线程或进程可能并行运行。 此外,所报告的时间统计来自不同的来源,所以logging时间很短的时间可能会受到舍入误差的影响,正如原始海报给出的例子所示。
内核与用户模式的简短介绍
在Unix或任何受保护内存操作系统上, “内核”或“超级用户”模式是指CPU可以运行的特权模式 。某些可能影响安全性或稳定性的特权操作只能在CPU运行这种模式; 这些操作不适用于应用程序代码。 这种行为的一个例子可能是操作MMU以访问另一个进程的地址空间。 通常情况下, 用户模式代码不能这么做(有充分的理由),尽pipe它可以从内核请求共享内存 ,这可以通过多个进程来读写。 在这种情况下,共享内存是通过安全机制从内核明确请求的,并且这两个进程必须明确地附加到内核才能使用它。
特权模式通常被称为“内核”模式,因为内核是由在此模式下运行的CPU执行的。 为了切换到内核模式,你必须发出一个特定的指令(通常被称为陷阱 )来切换CPU在内核模式下运行, 并运行跳转表中保存的特定位置的代码。 出于安全原因,您不能切换到内核模式并执行任意代码 – 陷阱通过一个无法写入的地址表进行pipe理,除非CPU以超级用户模式运行。 你用一个明确的陷阱号陷阱,并在跳转表中查找地址; 内核拥有有限数量的受控入口点。
C库中的“系统”调用(特别是man手册的第2部分中介绍的)有一个用户模式组件,这就是你实际从C程序中调用的组件。 在幕后,他们可能会向内核发出一个或多个系统调用来执行诸如I / O之类的特定服务,但是它们仍然具有以用户模式运行的代码。 如果需要,也可以直接从任何用户空间代码直接向内核模式发出陷阱,尽pipe您可能需要编写一段汇编语言来为该调用正确设置寄存器。 描述Linux内核提供的系统调用的页面以及用于设置寄存器的约定可以在这里find。
更多关于'sys'
有些东西是你的代码在用户模式下无法做到的 – 例如分配内存或访问硬件(硬盘,networking等)。 这些都在内核的监督之下,只有它能够做到。 你所做的一些操作(如malloc
或fread
/ fwrite
)将调用这些内核函数,然后将计入“sys”时间。 不幸的是,它不像“每次调用malloc都会被计入'sys'时间”那样简单。 对malloc
的调用将自己做一些处理(仍然以“user”时间计算),然后在某个地方可能调用内核中的函数(以'sys'时间计算)。 从内核调用返回后,“user”中会有更多的时间,然后malloc
将返回到您的代码。 至于什么时候发生切换,以及它在内核模式下花费了多less……你不能说。 这取决于图书馆的实施。 另外,其他貌似无辜的函数也可能在后台使用malloc
之类的东西,那么在'sys'中又会有一些时间。
为了扩大接受的答案 ,我只是想提供另一个为什么real
≠ user
+ sys
原因。
请记住, real
代表实际经过的时间,而user
和sys
值代表CPU执行时间。 因此,在多核系统上, user
和/或sys
时间(以及它们的总和)实际上可能超过实时。 例如,在我为类运行的Java应用程序中,我获得了这组值:
real 1m47.363s user 2m41.318s sys 0m4.013s
实际显示一个过程的总周转时间; 而用户显示用户定义指令的执行时间,Sys是执行系统调用的时间!
实时还包括等待时间(I / O的等待时间等)
真实 – 是您为了理解“时间”而放置在状态报告上的分钟数。 它基本上是(user +(sys * brains))的总和。
用户 – 是您实际阅读此博客所花费的时间。 这并不包括你的大脑正在做其他事情,比如pipe理你的老板中断。
系统 – 是实际思考和试图理解它所说的时间。 如果你有多个大脑,你可以多任务,希望它会更快。 请记住只包括在这个问题上花费的时间。 没有时间花在思考午餐或其他什么。