我正在 Linux 服务器中运行一个程序,并通过命令来计时它的时间使用情况时间。
看到最终的输出,我感到很困惑,因为我认为“real=sys+user”或者至少大致如此。下面是它的输出
实际 189m6.807s
用户 1173m6.203s
系统 3分6.508秒
“sys+user” 与“real” 的测量单位不同吗?
为什么“用户”比“真实”大这么多?它不应该小一点吗?
我承认我实际上并没有像我想象的那样正确地理解这些时间。所以任何解释都值得感激!
答案1
您的计算机至少有七个(可能是八个;)核心。它总共“只”花费了 189 分钟,但在这 189 分钟内,它同时在很多核心上运行。
这包括在乔的论文中:
在多处理器机器上,多线程进程或分叉子进程的运行时间可能会小于总 CPU 时间 - 因为不同的线程或进程可能并行运行。
答案2
实际、用户和系统进程时间统计
其中之一与其他不同。Real 指实际经过的时间;User 和 Sys 指仅由进程使用的 CPU 时间。
*真实的是挂钟时间 - 从调用开始到结束的时间。这是所有经过的时间,包括其他进程使用的时间片和进程阻塞的时间(例如,如果它正在等待 I/O 完成)。
*用户是进程中用户模式代码(内核之外)所花费的 CPU 时间量。这仅是执行进程时使用的实际 CPU 时间。其他进程和进程被阻塞的时间不计入此数字。
* 系统是进程在内核中花费的 CPU 时间量。这意味着在内核中执行系统调用所花费的 CPU 时间,而不是仍在用户空间中运行的库代码。与“用户”一样,这只是进程使用的 CPU 时间。请参阅下文对内核模式(也称为“主管”模式)和系统调用机制的简要说明。
User+Sys 将告诉您您的进程实际使用了多少 CPU 时间。
时间报告的统计数据的来源(1)
按时间报告的统计数据是从各种系统调用中收集的。“User”和“Sys”来自 wait (2) 或 times (2),具体取决于特定系统。“Real”是根据从 gettimeofday (2) 调用收集的开始和结束时间计算得出的。根据系统的版本,还可以按时间收集各种其他统计数据,例如上下文切换次数。
在多处理器机器上,多线程进程或分叉子进程的耗时可能小于总 CPU 时间 - 因为不同的线程或进程可能并行运行。此外,报告的时间统计信息来自不同的来源,因此记录的运行时间非常短的任务可能会出现舍入误差,如原始发帖人给出的示例所示。
内核模式与用户模式的简要介绍
在 unix 或任何受保护内存的操作系统上,“内核”或“管理程序”模式是指 CPU 可以运行的特权模式。某些可能影响安全性或稳定性的特权操作只能在 CPU 以这种模式运行时执行;应用程序代码无法执行这些操作。此类操作的一个示例可能是操纵 MMU 以访问另一个进程的地址空间。通常,用户模式代码无法执行此操作(有充分理由),尽管它可以从内核请求共享内存,而这些内存可以由多个进程读取或写入。在这种情况下,共享内存是通过安全机制从内核明确请求的,并且两个进程都必须明确附加到该内存才能使用它。
特权模式通常称为“内核”模式,因为内核由在此模式下运行的 CPU 执行。为了切换到内核模式,您必须发出特定指令(通常称为陷阱) 可将 CPU 切换到内核模式并从特定位置运行代码。出于安全原因,您无法切换到内核模式并执行任意代码 - 陷阱通过地址表进行管理,除非 CPU 在管理模式下运行,否则无法写入该地址表。
C 库中的“系统”调用(特别是手册页第 2 节中描述的调用)有一个用户模式组件,这是您从 C 程序中实际调用的。在后台,它们可能会向内核发出一个或多个系统调用来执行特定服务(例如 I/O),但它们仍然有代码在用户模式下运行。如果需要,也可以直接从任何用户空间代码向内核模式发出陷阱,尽管您可能需要编写一段汇编语言来正确设置调用的寄存器。可以找到一个页面,描述 Linux 内核提供的系统调用以及设置寄存器的约定这里。
更多信息
关于“sys”的澄清:有些事情您的代码无法从用户模式执行 - 例如分配内存或访问硬件(HDD、网络等)。这些都在内核的监督下,只有他才能做到。您执行的某些操作(如 malloc 或 fread/fwrite)将调用这些内核函数,然后将计入“sys”时间。不幸的是,它并不像“对 malloc 的每次调用都将计入“sys”时间”那么简单。对 malloc 的调用将进行一些自己的处理(仍然计入“用户”时间),然后在某个时候调用内核中的函数(计入“sys”时间)。从内核调用返回后,在“用户”中会再花一些时间,然后 malloc 将返回到您的代码。切换何时发生以及在内核模式下花费了多少时间 - 您无法说。这取决于库的实现。此外,其他看似无害的函数也可能在后台使用 malloc 等,然后它们又会在“sys”中花一些时间。
来源 :这里