转载时请注明出处和作者联系方式: 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
.