概念
进程时间是进程创建后使用的CPU时间数量。处于记录的目的,内核把CPU时间分成以下两部分。
- 用户CPU时间是在用户模式下执行所花费的时间数量,又是也称为虚拟时间(virtual time),这对于程序来说,是它已经得到CPU的时间。
- 系统CPU时间是在内核模式中执行所花费的时间数量。这是内核用于执行系统调用或代表程序执行的其他任务所的时间。
当我们运行一个shell程序,可以使用time(1)
命令,来同时获取这两部分的时间和运行程序所需的实际时间。
如:
time ./a.out
times()调用
系统调用times()
检索进程时间信息,并把结果通过buf
指向的结构体返回i。
#include <sys/time.h>
clock_t times(struct tms *buf);
Returns number of clock ticks(sysconf(_SC_CLK_TCK)) since "arbitrary"
time in past pn success, or (clock_t)-1 on error.
buf
指向的TMS结构体有下列格式:
struct tms{
clock_t tms_utime; /*User CPU used by caller*/
clock_t tms_stime; /*System CPU time used by caller*/
clock_t tms_cutime; /*User CPU time of all (waited for) children*/
clock_t tms_cstime; /*System CPU time of all (waited for) children*/
};
参数说明
tms
结构体的前两个字段返回调用进程到目前为止使用的用户和系统组件的CPU时间。最后两个字段时:父进程(比如,times()的调用者)执行了系统调用wait()
的所有已经终止的子进程使用的CPU时间。
数据类型clock_t
是用时钟计时单元(closk tick)为单位度量是时间的整型值,习惯用于计算tms
结构体的4个字段。可以调用sysconf(_SC_CLK_TCK)
来获得每秒包含的时钟计时单元数,然后用这个数字除以clock_t
转换为秒。
返回值
如果成功,times()
返回过去的任意点流逝的以时钟计时单元为单位的(真实的)时间。SUSv3未定义这点是什么,只是说,浙江时在调用进程的生命周期内的一个固定点。
因此,这个返回值的唯一用法是通过计算一对times()
调用返回的值的差,来计算进程执行消耗的时间。(然而,即使这样也不可靠,因为它可能会溢出clock_t
的有效范围,这时times()
的返回值将再次从0开始计算)。可靠的方法是使用函数gettimeofday()
clock()
函数clock()
提供了一个简单的接口用于取得进程时间,它返回一个值描述了调用金策划嗯使用的总的CPU时间(包括用户和系统)。
#include <time.h>
clock_t clock(void);
Returns total CPU time used by calling process measured in
CLOCKS_PER_SEC, or (clock_t)-1 on error.
计量单位是CLOCK_PER_SEC
,除以这个值来获取秒数。
在一些UNIX系统上clock()
返回的时间包含所有等待子进程的时间,但在Linux上,不包括。