定时程序

Tim*_*Tim 2 linux operating-systems time command-line

我正在 linux 服务器中运行一个程序,并通过命令time计时它的时间使用。

看着最终的输出,我很困惑,因为我认为“real=sys+user”或者它至少大致成立。这是它的输出

真正的 189m6.807s

用户 1173m6.203s

系统 3m6.508s

“系统+用户”是否以与“真实”不同的单位衡量?

为什么“用户”比“真实”大得多?不应该更小吗?

我承认我实际上并不像我想象的那样正确地理解那些时代。所以任何解释都值得赞赏!

joe*_*joe 7

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

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

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

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

* Sys是进程内在内核中花费的 CPU 时间量。这意味着在内核中执行系统调用所花费的 CPU 时间,而不是库代码,后者仍在用户空间中运行。与“用户”一样,这只是进程使用的 CPU 时间。有关内核模式(也称为“主管”模式)和系统调用机制的简要说明,请参见下文。

User+Sys 会告诉你你的进程实际使用了多少 CPU 时间。

按时间报告的统计来源 (1)

按时间报告的统计数据是从各种系统调用中收集的。'User' 和 'Sys' 来自等待 (2) 或时间 (2),具体取决于特定系统。'Real' 是根据从 gettimeofday (2) 调用收集的开始和结束时间计算得出的。根据系统的版本,还可以按时间收集各种其他统计信息,例如上下文切换的次数。

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

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

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

特权模式通常被称为“内核”模式,因为内核是由运行在这种模式下的 CPU 执行的。为了切换到内核模式,您必须发出特定指令(通常称为陷阱),将 CPU 切换到在内核模式下运行并从特定位置运行代码。出于安全原因,您不能切换到内核模式并执行任意代码 - 陷阱是通过一个地址表管理的,除非 CPU 在管理模式下运行,否则无法写入该地址表。

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

更多信息

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

来源:这里