您的位置:首页 > 其它

获取操作系统CPU及内存使用信息的另一种方法

2011-07-22 15:01 519 查看
我们可以使用两种方法来获取CPU及内存信息:使用Linux自带的top工具,或者直接读取文件系统中目录/proc/{进程ID}/stat。那么在这里我要介绍另一种获取这些信息的方法,无论是系统全局的还是具体到某个进程都适用。获取这种方法更容易掌握。我们将使用libgtop库来实现。接下来就开始介绍libgtop并使用它来编写一个简单的示例工具。首先需在系统中安装libgtop库,如未安装可以在网上搜索并下载该库。值得注意的是libgtop-2.0依赖于glib-2.0库,因此需确保glib-2.0库已经正确安装。在装好libgtop-2.0之后,可以使用其包含的头文件来编程了。这里就是一个监控CPU及内存使用率的例子:
#include <stdio.h>
#include <glibtop.h>
#include <glibtop/cpu.h>
#include <glibtop/mem.h>
#include <glibtop/proctime.h>
#include <glibtop/procmem.h>
#include <unistd.h>
int main(int argc,char *argv[])
{
glibtop_cpu cpu_begin,cpu_end;                                 /////////////////////////////
glibtop_proc_time proctime_begin,proctime_end;                 ///Declare the CPU info and
glibtop_mem memory;                                            ///memory info struct
glibtop_proc_mem procmem;                                      ///////////////////////////////

int du,dn,ds,di;
int dpu,dps;
float cpurate,memrate;
int pid = fork();                                              //create a process to run the specified program
if(pid ==0)                                                    //the child process
{
execvp(argv[1],&argv[1]);
}
else                                                           //the parent process
{
while(1)
{
glibtop_get_cpu (&cpu_begin);
glibtop_get_proc_time(&proctime_begin,pid);
sleep(1);                                                   //the interval time is 1 second
glibtop_get_cpu (&cpu_end);
glibtop_get_proc_time(&proctime_end,pid);
du = cpu_end.user - cpu_begin.user;
dn = cpu_end.nice - cpu_begin.nice;
ds = cpu_end.sys - cpu_begin.sys;
di = cpu_end.idle - cpu_begin.idle;
dpu = proctime_end.utime -  proctime_begin.utime;
dps = proctime_end.stime - proctime_begin.stime;
cpurate =100.0* (dpu+dps)/((du+dn+ds+di)*1.0);              //calculate the CPU usage
glibtop_get_mem(&memory);
glibtop_get_proc_mem(&procmem,pid);
memrate = 100*(procmem.resident) /((memory.total)*1.0);     // calculate the memory usage

fprintf(stderr,"du:%d, dn:%d, ds:%d, di:%d, ",du,dn,ds,di);
fprintf(stderr,"dpu:%d, dps:%d ",dpu,dps);
fprintf(stderr,"cpu rate is: %0.3f%   ",cpurate);
fprintf(stderr,"mem rate is: %0.3f%\n",memrate);
}
}
Return 0;
}


[/code]
然后使用下面命令编译程序:
gcc procmonitor.c -o procmonitor -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/libgtop-2.0 -lgtop-2.0 -lglib-2.0
得到可执行程序procmonitor,然后通过命令行参数传递启动该程序,如:
./procmonitor mplayer movie.mkv
播放器mplayer将启动并播放文件movie.mkv,同时CPU及内存信息也将在命令行中显示出来。也可以使用重定向'>'符号来将这些信息打印到文件中,如下所示:
./procmonitor mplayer movie.mkv  2>infofile.txt
注意:1、构建本程序时需同时指定glib-2.0及libgtop-2.0库。2、所有涉及的结构体及函数原型都可在/usr/include/libgtop-2.0中找到。3、计算内存使用率的公式为:
(memory of resident) ÷(memory of total).
CPU使用率计算公式:
(user_mode CPU time + kernel_mode CPU time) ÷(total CPU time).
与top命令的结果相比较,内存使用率基本相同,但CPU使用率百分比完全不同。那是因为我们测试的目标机有多个CPU所致。因此top命令所计算的CPU使用率是指进程所使用的该CPU使用率,而我们程序所得结果是指所有CPU的平均使用率。当然我们也可以得到与top相同的结果,这就需要使用其他结构体成员(如:glibtop_proc_time中的 xcpu_utime [GLIBTOP_NCPU] and xcpu_stime[GLIBTOP_NCPU])采用同样计算方法即可。因此使用libgtop库,我们可以更简便更灵活的获取CPU及内存信息。
CPU%(top)mem%(top)cpuusage%( procmonitor)Memusage(procmonitor)process
16.90.74.260.72:32.41 mplayer
17.60.74.3540.72:32.94 mplayer
16.90.74.3410.72:33.45 mplayer
17.00.74.2180.72:33.96 mplayer
17.90.74.2810.72:34.50 mplayer
17.30.74.4010.72:35.02 mplayer
7.30.74.2330.72:35.54 mplayer
16.90.74.2850.72:36.05 mplayer
17.60.74.380.72:36.58 mplayer
17.30.74.3240.72:37.10 mplayer
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: