$ time foo
real 0m0.003s
user 0m0.000s
sys 0m0.004s
$
做什么real
,,,,user
和sys
是指输出时间?
在基准我的应用程序时,哪一个有意义?
答案
Real, User and Sys process time statistics
这些事情之一不像另一件事。真正的是实际经过的时间;用户和系统是指使用的CPU时间仅通过过程。
Real是壁时钟的时间 - 从呼叫的开始到完成时间。这是所有经过的时间,包括其他过程使用的时间切片以及该过程的支出被阻止(例如,如果它正在等待I/O完成)。
User 是在用户模式代码中花费的CPU时间(内核之外)之内过程。这只是执行过程中使用的实际CPU时间。其他过程和时间的时间被阻止的过程并不计入这个数字。
Sys 是该过程中内核中花费的CPU时间的数量。这意味着执行CPU在系统调用中花费的时间*在内核中,*与仍在用户空间运行的库代码相反。像"用户"一样,这只是该过程使用的CPU时间。有关内核模式(也称为"主管"模式)和系统调用机制的简要说明,请参见下文。
User+Sys
会告诉您进程实际使用了多少 CPU 时间。Real
(通常会发生)。User
和Sys
所有儿童过程(及其后代)也可以收集到的时间,例如经过wait(2)
或者waitpid(2)
,尽管基础系统单独返回该过程及其子女的统计数据。
Origins of the statistics reported by time (1)
报告的统计数据time
从各种系统调用中收集。“用户"和"系统"来自wait (2)
((posix) 或者times (2)
((POSIX),取决于特定系统。“真实"是从从开始和结束时间开始的gettimeofday (2)
称呼。根据系统的版本,其他各种统计数据,例如上下文开关的数量也可以通过time
。
在多处理器机器上,多线程过程或分叉儿童的流程可能要小于总CPU时间 - 因为不同的线程或过程可能并行运行。此外,报告的时间统计信息来自不同的起源,因此,如原始海报所示的示例所示,非常短的运行任务记录的时间可能会遇到舍入错误。
A brief primer on Kernel vs. User mode
在UNIX或任何受保护的内存操作系统上,“内核"或"主管”模式是指特权模式CPU可以运行。只有在CPU在此模式下运行时,可能会影响安全性或稳定性的某些特权动作才能执行;这些操作无法用于应用程序代码。这种行动的一个例子可能是操纵MMU访问另一个过程的地址空间。通常情况下,用户模式代码不能(有充分的理由)执行此操作,尽管它可以要求共享内存来自内核,可以被多个过程读取或撰写。在这种情况下,通过安全的机制明确从内核请求共享内存,并且两个过程都必须明确附加到其上以使用它。
特权模式通常称为"内核"模式,因为内核是由在此模式下运行的CPU执行的。为了切换到内核模式,您必须发布特定的指令(通常称为陷阱)将CPU切换到内核模式运行*并从跳台上保存的特定位置运行代码。*出于安全原因,您无法切换到内核模式并执行任意代码 - 除非CPU在主管模式下运行,否则陷阱通过无法写入的地址表进行管理。您用明确的陷阱编号陷阱,地址在跳台上查找;内核具有有限数量的受控入口点。
C库中的"系统"调用(尤其是该页面第2节中所述的呼叫)具有一个用户模式组件,这是您实际上从C程序中称为的组件。在幕后,他们可能会向内核发出一个或多个系统调用,以执行特定的服务,例如I/O,但他们仍然在用户模式中运行代码。如果需要的话,也可以从任何用户空间代码直接向内核模式发出陷阱,尽管您可能需要编写一个汇编语言片段才能正确设置寄存器。
More about ‘sys’
您的代码无法从用户模式使用的某些事情 - 分配内存或访问硬件(HDD,网络等)之类的事情。这些是在内核的监督下,仅凭它就可以做到。一些操作类似malloc
或者fread
/fwrite
将调用这些内核函数,然后将其算作"系统"时间。不幸的是,它并不像"对Malloc的每个呼叫"中的简单不那么简单。打电话malloc
将自己进行一些处理(仍然计入"用户"时间),然后在途中某个地方可以在内核中调用该函数(以” SYS"时间计数)。从内核调用返回后,“用户"中将有更多时间malloc
将返回您的代码。至于开关何时发生,以及在内核模式下花费了多少…您不能说。这取决于库的实现。另外,其他看似无辜的功能也可能使用malloc
在背景中类似,然后将在"系统"中再次有一些时间。