• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

LinuxC进程时间:墙上时钟时间,用户CPU时间,系统CPU时钟时间 ...

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

如何度量进程的运行时间?
可以用times函数获取进程的墙上时钟时间,用户CPU时间,系统CPU时钟时间。

1.1 墙上时钟时间

墙上时钟时间 wall clock time: 又简称时钟时间,从进程开始运行到结束,系统时钟走过的时间(时钟数),包含了进程阻塞、等待的时间。
每秒钟嘀嗒数, 可通过sysconf(_SC_CLK_TCK)获取

注意: 如果调用clock()计算进程/算法运行时间, 是不包括阻塞(含sleep)时间的.

1.2 用户CPU时间

用户CPU时间:用户进程在用户态执行时间。

1.3 系统CPU时间

系统CPU时间:用户进程在内核态执行时间。

1.4 三者之间关系

(墙上)时钟时间 = 阻塞时间 + 就绪时间 + 运行时间
运行时间 = 用户CPU时间 + 系统CPU时间


2. 如何获取进程相关运行时间?

2.1 times函数

获取进程时间

原型

#include <sys/times.h>

clock_t times(struct tms *buf);

tms结构:

struct tms {
    clock_t tms_utime;  /* user CPU time */
    clock_t tms_stime;  /* system CPU time */
    clock_t tms_cutime; /* user CPU time,terminated children */
    clock_t tms_cstime; /* system CPU time,terminated children */
};

功能
获取当前进程墙上时钟时间,用户CPU时间,系统CPU时钟时间

返回值
1.函数返回墙上时钟时间。
进程开始和结束时,可以分别获取到2个返回值,做差值即为进程的墙上时钟时间。运行时间足够长可能溢出(可能性较小)

2.输出参数buf,包含用户CPU时间,系统CPU时间。

2.2 getrusage 函数

获取资源使用(统计情况).
getrusage 也可以用于获取进程的用户CPU时间, 系统CPU时间, 而且适用于多进程、多线程环境, 功能比times函数更强大.

#include <sys/time.h>
#include <sys/resource.h>

int getrusage(int who, struct rusage *usage);
  • 参数
    who 函数getrusage能返回何种资源使用测量值, 取决于who参数:
    1)RUSAGE_SELF 返回调用进程所有线程的资源使用统计;

2)RUSAGE_CHILDREN 返回调用进程的所有已终止子进程的资源使用统计;

3)RUSAGE_THREAD 返回调用线程的资源使用统计, 不过要求_GNU_SOURCE已在<sys/resource.h>.中定义;

usage 指向rusage结构, 包含了用户CPU时间, 系统CPU时间,

struct rusage {
   struct timeval ru_utime; /* user CPU time used 使用了的用户CPU时间 */
   struct timeval ru_stime; /* system CPU time used 使用了的系统CPU时间 */
   long   ru_maxrss;        /* maximum resident set size 最大占用物理内存大小(瞬时值, 单位KB)  */
   long   ru_ixrss;         /* integral shared memory size 完整的共享内存大小, linux未使用 */
   long   ru_idrss;         /* integral unshared data size 完整的非共享数据大小, linux未使用 */
   long   ru_isrss;         /* integral unshared stack size 完整的非共享栈大小, linux未使用 */
   long   ru_minflt;        /* page reclaims (soft page faults)  soft page faults次数: 需要访问的内存不在虚拟地址空间,但是在物理内存, 需要MMU建立和物理内存的映射. 不需要IO活动 */
   long   ru_majflt;        /* page faults (hard page faults) hard page faults次数: 需要访问的内存不在虚拟地址空间,也不在物理内存中,需要从慢速设备载入. 需要IO活动 */
   long   ru_nswap;         /* swaps linux未使用 */
   long   ru_inblock;       /* block input operations 阻塞输入操作次数 */
   long   ru_oublock;       /* block output operations 阻塞输出操作次数 */
   long   ru_msgsnd;        /* IPC messages sent linux未使用 */
   long   ru_msgrcv;        /* IPC messages received linux未使用 */
   long   ru_nsignals;      /* signals received linux未使用 */
   long   ru_nvcsw;         /* voluntary context switches 主动上下文切换(时间片用完)时间数 */
   long   ru_nivcsw;        /* involuntary context switches 被动上下午切换(更高优先级进程抢占)时间数 */
};

2.3 getrusage例子

利用getrusage打印总的用户CPU时间, 总的系统CPU时间.

void
pr_cpu_time(void)
{
    double user, sys;
    struct rusage myusage, childusage;
    
    /* 调用进程资源利用统计 */
    if (getrusage(RUSAGE_SELF, &myusage) < 0) 
        err_sys("getrusage error");
    /* 调用进程已终止子进程资源利用统计 */
    if (getrusage(RUSAGE_CHILDREN, &myusage) < 0) 
        err_sys("getrusage error");

    user = (double) myusage.ru_utime.tv_sec + myusage.ru_utime.tv_usec / 1000000.0;
    user = (double) childusage.ru_utime.tv_sec + childusage.ru_utime.tv_usec / 1000000.0;

    sys = (double) myusage.ru_stime.tv_sec + myusage.ru_stime.tv_usec / 1000000.0;
    sys = (double) childusage.ru_stime.tv_sec + childusage.ru_stime.tv_usec / 1000000.0;
    
    /* 打印用户CPU时间, 系统CPU时间. %g 根据结果自动选择输出格式%f, %e, 科学计数法 */
    printf("user time = %g, sys time = %g\n", user, sys);
}

参考

墙上时钟时间 ,用户cpu时间 ,系统cpu时间 | 知乎


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
简单实现python调用c#dll动态链接库发布时间:2022-07-13
下一篇:
C/C++中的输出对齐设置发布时间:2022-07-13
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap