内核在文件/proc/stat中保存了有关自身活动的各种信息。所有的统计数字都是自系统启动后累加起来的。使用cat命令简单的查看下文件:
通过查看Linux系统下该文件的信息,我们可以初步计算出系统CPU的利用率,代码如下:
double gCpuRate; //挑选一个稳定的线程,定期(3秒)刷gCpuRate
typedef struct CPU_INFO
{
char name[20];
unsigned int user;
unsigned int nice;
unsigned int system;
unsigned int idle;
unsigned int iowait;
unsigned int irq;
unsigned int softirq;
}CPU_INFO;
double cal_cpu_occupy(CPU_INFO *o, CPU_INFO *n)
{
double od, nd;
double id, sd;
double cpu_use;
od = (double)(o->user + o->nice + o->system + o->idle + o->softirq + o->iowait + o->irq);
nd = (double)(n->user + n->nice + n->system + n->idle + n->softirq + n->iowait + n->irq);
id = (double)(n->idle);
sd = (double)(o->idle);
if (0 != (nd - od))
{
cpu_use = 100.0 - ((id - sd))/(nd - od)*100.00;
}
else
{
cpu_use = 0;
}
return cpu_use;
}
void get_cpu_occupy(CPU_INFO *cpuinfo)
{
FILE *fd;
int n;
char buff[256] = {0};
fd = fopen("/proc/stat", "r");
fgets(buff, sizeof(buff), fd);
sscanf(buff, "%s %u %u %u %u %u %u %u", cpuinfo->name, &cpuinfo->user, &cpuinfo->nice, &cpuinfo->system, \
&cpuinfo->idle, &cpuinfo->iowait, &cpuinfo->irq, &cpuinfo->softirq);
fclose(fd);
}
void getCpuRate(void)
{
CPU_INFO cpu_stat1;
CPU_INFO cpu_stat2;
memset(&cpu_stat1, 0, sizeof(CPU_INFO));
memset(&cpu_stat2, 0, sizeof(CPU_INFO));
get_cpu_occupy((CPU_INFO *)&cpu_stat1);
sleep(1);
get_cpu_occupy((CPU_INFO *)&cpu_stat2);
gCpuRate = cal_cpu_occupy((CPU_INFO *)&cpu_stat1, (CPU_INFO *)&cpu_stat2);
//printf("[SD_CARD] gCpuRate = %f\n", gCpuRate);
return;
}
也可以利用ps命令来查看该进程下各线程的cpu占用率:
查看某个具体线程的CPU占用率,可用ps命令 ./ps -L c -e -o pid,tid,pcpu,cmd