linux clock()函数与real,user,sys时间

在linux终端下,使用time命令运行某程序如

time ./test

可以看到程序运行结束之后有三个时间
1. real 实际运行时间,从命令行执行到运行终止的消逝时间;
2. user 用户CPU时间,命令在用户态中执行时间的总和;
3. sys 系统CPU时间,命令在系统核心态中执行时间的总和。
但是1并不等于2+3,实际上差别很大。
clock()函数计算的是CPU时间,所以是2+3,注意,clock()并不能区分用户态和核心态。

time命令的原理

间隔计数。
操作系统用计时器来记录每个进程使用的累计时间,计时器中断发生时,操作系统会在当前进程列表中寻找哪个进程是活动的,一
旦发现进程A正在运行立马就给进程A的计数值增加计时器的时间间隔(这也是引起较大误差的原因)。当然不是统一增加的,还要确定这个进程是在用户空间活动还是在内核空间活动,如果是用户模式,就增加用户时间,如果是内核模式,就增加系统时间。这种方法的原理虽然简单但不精确。如果一个进程的运行时间很短,短到和系统的计时器间隔一个数量级,用这种方法测出来的结果必然是不够精确的,头尾都有误差。不过,如果程序的时间足够长,这种误差有时能够相互弥补,一些被高估一些被低估,平均下来刚好。从理论上很难分析这个误差的值,所以一般只有程序达到秒的数量级时用这种方法测试程序时间才有意义。这种方法最大的优点是它的准确性不是非常依赖于系统负载。

多核多进程多线程中的时间

  1. 多核计算
    clock()的实现是基于时钟计时单元的。问题就出在了cpu的时钟计时单元上。当采用多核cpu时,进程或线程调用clock,记录了当前核时钟。但在下次调用clock之前很可能发生cpu调度,进程或线程被调度到其他cpu上运行。这导致两次取得计时单元并不是同一个cpu的,产生计时错误。但究竟这个误差有多大,有待实验论证。

  2. 多进程计算
    clock函数计算的时间貌似是等于用户CPU时间+系统CPU时间,但其实,clock函数并没有考虑CPU被子进程消耗的时间。

  3. 多线程计算
    real time > user time + sys time 这种关系始终成立么?
    答案是否定的。原因就在于并行计算。现在再次回忆一下这三种时间的概念:

Real指的是实际经过的时间,User和Sys指的是该进程使用的CPU时间。
1. Real是墙上时间(wall clock time),也就是进程从开始到结束所用的实际时间。这个时间包括其他进程使用的时间片和进程阻塞的时间(比如等待I/O完成)。
2. User指进程执行用户态代码(核心之外)所使用的时间。这是执行此进程所消耗的实际CPU时间,其他进程和此进程阻塞的时间并不包括在内。
3. Sys指进程在内核态消耗的CPU时间,即在内核执行系统调用所使用的CPU时间。
那么,什么情况下进程开始到结束所经过的时间会比进程所消耗的用户时间和系统时间(user time + sys time)小呢?
User+Sys为进程所使用的实际CPU时间。在多处理器的系统上,一个进程如果有多个线程或者有多个子进程并行执行,就可能导致Real time比CPU time(User + Sys time)要小,这是很容易理解的。

你可能感兴趣的:(Linux)