找回密码
 注册
搜索

24.进程之四(附加的进程信息)

已有 283 次阅读2014-2-9 16:13 |个人分类:Linux编程| 进程, linux, 编程, 附加信息

(GNU_linux编程指南-第二版-P202 )

除了进程、用户和组ID之外,系统调用和库函数含有能够检索进程的其他属性,比如资源利用情况和执行次数。注意,我说的是执行次数,而不是执行时间。这是因为Linux内核维护者进程的三个独立的时间值,他们如下:

(1)       wall clock tme(墙上时钟时间)是流逝的时间。

(2)       User CPUtime(用户CPUtime)是进程花在执行用户模式(非内核模式)代码上的时间总量。

(3)       System CPU time(系统CPU时间)是花在执行内核代码上的时间总量。

通过调用timesgetrusage可以获得这些信息。进程的资源利用情况,比如它的内存占用量只能从getrusage调用获得。本节里,你将首先接触如何获得时间信息的内容,然后再考虑如何获得资源利用情况。

进程计时

Time函数的原型如下:

#include <sys/times.h>

clock_t times(struct tms *buf);

         times返回自系统自举后经过的时钟滴答数,也称为墙上时钟时间。buf是指向tms结构的指针,这个结构保存了当前进程的时间。

         程序清单13.4中的程序使用system函数执行一条外部命令。然后,它使用times调用打印输出计时信息的结果。

         程序清单 13.4 resusg1.c

/*

*resusg1.c –c Cat process times

*/

#include <stdio.h>

#include <stdlib.h>

#include <sys/times.h>

#include <time.h>

#include <unistd.h>

 

void doit(char *, clock_t)

 

Int main(void)

{

         clock_t start, end;

         struct tms t_start, t_end;

         start = times(&t_start);

         /* redirect output to prevent screen clutters */

         system(“grep the /usr/doc/*.* >  /dev/null 2> /dev/null”);

         end = times(&t_end);

 

         doit(“elapsed”, end - start);

 

         puts(“parent times”);

         doit(“\tuser CPU”, t_end.tms_utime);

         doit(“\tsys  CPU”, t_end.tms_stime);

 

         puts(“child times”);

         doit(“\tuser CPU”, t_end.tms_cuttime);

         doit(“\tuser CPU”, t_end.tms_cstime);

 

         exit(EXIT_SUCCESS);

}

 

void doit(char *str, clock_t time)

{

         /*Get clock ticks/second */

         long tps = sysconf(_SC_CLK_TCK);

         printf(“%s: %6.2f secs \n”, str, (float)time/tps);

}

执行make resusg1 编译该程序。其输出应类似下面:

$ ./resusg1

Elapsed: 21.37 sec

Parent time user CPU: 0.01 secssys CPU: 0.00 secs

child time user CPU: 1.25 secssys CPU: 0.00 secs

         通常你的计时信息会和这里列出的有所不同。要注意的第一点是父进程积累非常少的时间----一秒的百分之一。虽然在13.3节中会更详细地讨论,但这里还要说明,当程序调用了system函数时,它先产生了一个子进程,然后是子进程而不是父进程完成所有工作并消耗了CPU时间。

         值得注意的第二点是进程的执行时间21.37秒并不等于用户CPU时间和系统CPU时间之和,即2.42秒。这种明显的差异是因为子进程执行的grep操作是I/O密集型而非CPU密集型操作。它扫描了这里讨论所使用的系统上2331个文件,这些文件大约是10MB的文本。缺少的18.95秒全部用于从硬盘读取数据。

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

         struct tms){

                            clock_t tms_utime; /* User CPU time */

                            clock_t tms_stime; /* System CPU time */

                            clock_t tms_cutime; /* User CPU time of children */

                            clock_t tms_cstime; /* System CPU time of children */

                            }

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


路过

雷人

握手

鲜花

鸡蛋

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 注册

Archiver|手机版|小黑屋|52RD我爱研发网 ( 沪ICP备2022007804号-2 )

GMT+8, 2024-11-24 06:43 , Processed in 0.029616 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

返回顶部