Chinaunix首页 | 论坛 | 博客
  • 博客访问: 42900
  • 博文数量: 2
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 20
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-14 11:25
文章分类

全部博文(2)

文章存档

2014年(2)

我的朋友

分类: LINUX

2014-04-17 13:54:07

资源利用情况和执行次数
  Wall clock time   (墙上时钟时间)      流逝的时间
  User CPU time     (用户CPU时间)      进程花在执行用户模式(非内核模式)代码上的时间总量
  System CPU time   (系统CPU时间)      花在执行内核代码上的时间总量

 

  通过调用times 或 getrusage 可以获得这信息, 前者能给出细致时间,后者可以给出更多信息,进程的利用情况, 比如它的内存占用量只能从getrusage调用获得。

  1> 进程计时
  #include
  clock_t time(struct tms *buf);

  times返回系统自举后经过的时间滴答数, 也称为墙上时钟时间。

  [root@localhost c]# cat get_times.c

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <sys/times.h>
  4. #include <time.h>
  5. #include <unistd.h>

  6. void doit(char *, clock_t);

  7. int main(void)
  8. {
  9.     clock_t start, end;
  10.     struct tms t_start, t_end;
  11.     start = times(&t_start);
  12.     system("grep the /usr/share/doc/* > /dev/null ");
  13.     end=times(&t_end);

  14.     doit("elpapsed", end - start);

  15.     puts("parent times");
  16.     doit("\tuser CPU", t_end.tms_utime);
  17.     doit("\tsys CPU", t_end.tms_stime);

  18.     puts("child times");
  19.     doit("\tuser CPU", t_end.tms_cutime);
  20.     doit("\tsys CPU", t_end.tms_cstime);

  21.     exit(EXIT_SUCCESS);

  22. }

  23. void doit(char *str, clock_t time)
  24. {
  25.     /* Get clock ticks/second */
  26.     long tps = sysconf(_SC_CLK_TCK);
  27.     printf("%s: %6.2f secs \n", str, (float)time/tps);
  28. }


[root@localhost c]# ./get_times
elpapsed:   0.05 secs
parent times
        user CPU:   0.00 secs
        sys CPU:   0.00 secs
child times
        user CPU:   0.02 secs
        sys CPU:   0.00 secs

    当程序调用system函数时, 它先产生一个子进程, 然后是子进程而不是父进程完成所有工作并消耗了CPU时间
  
    进程的执行时间0.05并不等于用户CPU时间和系统CPU时间之和 0.02秒。  原因是子进程执行的grep操作是I/O密集型而非CPU密集型的操作。 它扫描了这里讨论所使用的系统上的多个文件, 缺少的0.03秒全部用从硬盘读取数据。

    times返回的时间是相对而非绝对时间(系统自举后经过的时钟滴答数), 所以要让它有实用价值, 就必须做两次测量并使用它们的差值。 这就引入了 流逝时间, 或者称为墙上时钟时间。 resusg1通过把起止的时钟滴答数分别保存在start和end中来做到这一点。 另一种进程计时值可从中定义的tms结构中获得。 tms结构保存着一个进程及其子进程的当前CPU时间。

点击(此处)折叠或打开

  1. struct tms{
  2.          clock_t tms_utime; /* user cpu time */
  3.          clock_t tms_stime; /* system cpu time */
  4.          clock_t tms_cutime; /* user cpu time of children */
  5.          clock_t tms_cstime; /* system cpu time of children */
  6.    };


   注: 这些时间都是时钟滴答数,而不是秒数。 使用sysconf函数能把时钟滴答数转为秒数, 这个函数把它的参数转换成在运行时定义的系统限制值或选项值, 返回类型为long
   _SC_CLK_TCK 是定义每秒钟有多少滴答的宏。
   这个程序的关键处是doit函数, 它接受一个字符串指针和一个clock_t类型的值,然后计算并输出进程每部分实际的计时信息。

阅读(2305) | 评论(0) | 转发(0) |
0

上一篇:gprof的使用

下一篇:没有了

给主人留下些什么吧!~~