在linux上用C++获取CPU的使用率等信息
近期的工作中需要使用到CPU的使用率信息来在CPU的闲时做一些大计算量的工作,例如缩略图的计算,视频文件海报的生成等。怎么得到CPU的使用率信息成了需要解决的一个问题。
得到CPU的使用率最直接的方法就是调用Top命令,然后对Top的输出字符串进行解析,把相应的CPU使用率得出来。但是这里要使用system(), execv()的系统函数来直接调用命令行,这是我所不推荐的。不推荐的原因可以参考这篇文章Why system() is evil, 具体的就不展开了。
所以我们还是采用在代码里直接读取/proc/stat文件并解析里面相应的数据从而得到CPU的使用率。对于/proc/stat文件里所有的数据的解释,我们可以参考Linux Kernel的文档,在Proc里,参考1.8 Miscellaneous kernel statistics in /proc/stat。这里需要注意的有两点:
文件中所有数据的单位是USER_HZ,这个单位的意思原文是这样说的(typically hundredths of a second),其实就是1/100秒。
文件中所有的数据代表的意思是从系统启动到现在,各个不同的执行环境一共使用的USER_HZ数。所以这就决定了,只采样一次是没有办法知道相应的CPU使用率的,所以得至少采样2次,取它们的差值除以采样的间隔时间才能得到每秒CPU的使用率。
具体的核心代码如下:
CPUStat firstStat;
CPUStat secondeStat;
if( readCPUStat(firstStat) == -1) {
return 0;
}
sleep(1);
if( readCPUStat(secondeStat) == -1) {
return 0;
}
unsigned long long totalDiff = secondeStat.getTotal() - firstStat.getTotal();
unsigned long long idleDiff = secondeStat.idle - firstStat.idle;
return ((totalDiff - idleDiff) * 1000 / totalDiff + 5 ) / 10;
注意这里对最后的百分比信息做了四舍五入。
所有的代码可以在我的代码库里找到CPU Usage