上一篇文章介绍了linux下的sigar 库,并使用sigar 库来获取cpu 使用率,本文在这里介绍一下如何使用sigar 库获取内存信息.
和cpu 一样,sigar中有和内存相关的结构体sigar_mem_t,我们来看一下结构体原型:
typedef struct {
sigar_uint64_t
ram,
total,
used,
free,
actual_used,
actual_free;
double used_percent;
double free_percent;
} sigar_mem_t;
从中可以看到和结构体相关的信息还是比较全面的,包括内存总量(total),实际内存使用量(actual_used),实际内存剩余量(actual_free),并且还包括内存使用率(used_percent),和内存空闲率(free_percent).
好了,接下来我们看看怎样获得这些数据.
对于内存信息的获取,我们要用到sigar_mem_get 函数,函数原型如下:
SIGAR_DECLARE(int) sigar_mem_get(sigar_t *sigar, sigar_mem_t *mem);
很简单,传递一个sigar_t 类型和sigar_mem_t 类型的指针就可以了.其中这个sigar_t 上一篇文章中我们介绍过,程序的初始化都要用到这个sigar_t.
另外,sigar中对于虚拟内存(swap 分区)信息的获取也有特定的结构体sigar_swap_t,感兴趣的同学可以参照获取内存信息的方式来获取一下虚拟内存的信息.
好了,下面是程序的源码,因代码较少,就不逐一分析了,相信你一看就明白了.
#include
#include
#include
using namespace std;
int main(int argc,char **argv)
{
sigar_t *sigar_mem;
sigar_mem_t mem;
sigar_open(&sigar_mem);
sigar_mem_get(sigar_mem,&mem);
uint64_t total = mem.total/1024;
uint64_t used = mem.actual_used/1024;
uint64_t free = mem.actual_free/1024;
double used_percent = mem.used_percent;
double free_percent = mem.free_percent;
cout<
cout<
cout<
cout<
cout<
sigar_close(sigar_mem);
return 0;
}
我们打印一下输出结果:
细心的同学可能会用free 命令的结果做一下比较:
结果发现free 的值和程序中获取的不一样,这是怎么回事?
其实,这里涉及到linux 内存管理机制的东西,linux 内核会把剩余的内存申请为cached,而cached不属于free范畴。
直观的看free命令的free值很小,但并不代表可用的内存小,当一个程序需要申请较大的内存时,如果free的内存不够,内核会把部分cached的内存回收,回收的内存再分配给应用程序。
所以对于linux系统,可用于分配的内存不只是free的内存,还包括cached 的内存 和buffers 的内存.
这就是为什么我们程序中计算可用内存的时候用mem.actual_free 而不是 mem.free 了,这么一说相信聪明的你肯定明白了.