uclinux中, 如何获得系统cpu占用率

转载时请注明出处和作者联系方式: http://blog.csdn.net/mimepp
题目: uclinux中, 如何获得系统cpu占用率
作者:余涛(yut616_at_sohu.com)
关键字:linux cpu 占用率 代码 使用情况

在近期的设计中, 有涉及到在配置信息改变时, 需要写flash.但写flash有时会非常慢, 特别是在系统繁忙时,如播放video文件时, 如果同时还写flash, 整个系统就好像hang住了一样. 这个时候就想到了,最好是让flash monitor部分在系统不太繁忙的时候做配置保存的工作. 但如何得到cpu是否繁忙呢, 查了一下, 这里做个笔记.

我们可以cat /proc/stat来先看一下:
# cat  / proc / stat
cpu  
2826   0   2666   37305
cpu0 
2826   0   2666   37305
page 
2386   16
swap 
0   0
intr 
85096   14812   7413   0   0   0   42797   19   0   0   0   12   0   12   0   19994   0   0   0   0   0   0   35   0   2   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
disk_io:
ctxt 
115363
btime 
1079703901
processes 
98

/proc/stat包含有cpu的信息, 每个cpu的时间片都用在什么地方, 在这里都有记载. 一般嵌入系统都是一个cpu,所以我们就不关心多个的情况了.
这里看到的时间片的分配情况, 是从开机到当前时间,所总共使用了的情况.
输出的cpu信息, 它的格式有5项:
名称, 合计用户进程所占的时间片总数, 合计nice时间片总数, 合计系统所占的时间片总数, 合计空闲时间片总数

可以用如下结构来表示:

typedef  struct  _cpu_occupy
{
        
char name[20];
        unsigned 
int user;
        unsigned 
int nice;
        unsigned 
int system;
        unsigned 
int idle;
}
cpu_occupy;

这样, 想得到近期cpu的使用情况, 可以拿两次cpu的时间片信息做差值就能得到了.
如以两次比较近的时间点,取两次/proc/stat信息, prev, now, 那么cpu的使用情况就是:
这段时间内的user和system所占用的总数/这段时间所有的时间片总数

从/proc/stat中取cpu信息:
void get_cpu_occupy (cpu_occupy *o)
{
        FILE 
*fd = NULL;
        
char buff[256= {0};

        fd 
= fopen ("/proc/stat""r");
        fgets(buff, 
sizeof(buff), fd);
        fgets(buff, 
sizeof(buff), fd); /* 读到第二行cpu0处 */
        sscanf(buff, 
"%s %u %u %u %u"&o->name, &o->user, &o->nice,
                        
&o->system, &o->idle);
        fprintf (stderr, 
"%s %u %u %u %u ", o->name, o->user, o->nice,
                        o
->system, o->idle);
        fclose(fd);
}

得到两次的差值:
void  cal_cpu_occupy (cpu_occupy prev, cpu_occupy now)
{
        
double prev_all_ticks, now_all_ticks;
        
double user_ticks, system_ticks;
        
float cpu_used;

        prev_all_ticks 
= (double) (prev.user + prev.nice + prev.system +
                        prev.idle);

        now_all_ticks 
= (double) (now.user + now.nice + now.system +
                        now.idle);

        user_ticks 
= (double) (now.user - prev.user);
        system_ticks 
= (double) (now.system - prev.system);
        cpu_used 
= ((user_ticks+system_ticks)*100.0)/(now_all_ticks-prev_all_ticks);
        fprintf(stderr, 
"cpu_used; %f. ", cpu_used);
}

这样就得到了cpu的占用率了.
cpu0  1137   0   1990   13653
cpu_used; 
15.686275 .
cpu0 
1145   0   1992   13694
cpu_used; 
19.607843 .
cpu0 
1150   0   1997   13735
cpu_used; 
19.607843 .
cpu0 
1154   0   1999   13780
cpu_used; 
11.764706 .

你可能感兴趣的:(uclinux中, 如何获得系统cpu占用率)