sigar如何获取linux的buffer内存,Linux 下使用Sigar 获取内存信息
上一篇文章介紹了linux下的sigar 庫,并使用sigar 庫來獲取cpu 使用率,本文在這里介紹一下如何使用sigar 庫獲取內(nèi)存信息.
和cpu 一樣,sigar中有和內(nèi)存相關(guān)的結(jié)構(gòu)體sigar_mem_t,我們來看一下結(jié)構(gòu)體原型:
typedef struct {
sigar_uint64_t
ram,
total,
used,
free,
actual_used,
actual_free;
double used_percent;
double free_percent;
} sigar_mem_t;
從中可以看到和結(jié)構(gòu)體相關(guān)的信息還是比較全面的,包括內(nèi)存總量(total),實際內(nèi)存使用量(actual_used),實際內(nèi)存剩余量(actual_free),并且還包括內(nèi)存使用率(used_percent),和內(nèi)存空閑率(free_percent).
好了,接下來我們看看怎樣獲得這些數(shù)據(jù).
對于內(nèi)存信息的獲取,我們要用到sigar_mem_get 函數(shù),函數(shù)原型如下:
SIGAR_DECLARE(int) sigar_mem_get(sigar_t *sigar, sigar_mem_t *mem);
很簡單,傳遞一個sigar_t 類型和sigar_mem_t 類型的指針就可以了.其中這個sigar_t 上一篇文章中我們介紹過,程序的初始化都要用到這個sigar_t.
另外,sigar中對于虛擬內(nèi)存(swap 分區(qū))信息的獲取也有特定的結(jié)構(gòu)體sigar_swap_t,感興趣的同學(xué)可以參照獲取內(nèi)存信息的方式來獲取一下虛擬內(nèi)存的信息.
好了,下面是程序的源碼,因代碼較少,就不逐一分析了,相信你一看就明白了.
#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;
}
我們打印一下輸出結(jié)果:
細(xì)心的同學(xué)可能會用free 命令的結(jié)果做一下比較:
結(jié)果發(fā)現(xiàn)free 的值和程序中獲取的不一樣,這是怎么回事?
其實,這里涉及到linux 內(nèi)存管理機(jī)制的東西,linux 內(nèi)核會把剩余的內(nèi)存申請為cached,而cached不屬于free范疇。
直觀的看free命令的free值很小,但并不代表可用的內(nèi)存小,當(dāng)一個程序需要申請較大的內(nèi)存時,如果free的內(nèi)存不夠,內(nèi)核會把部分cached的內(nèi)存回收,回收的內(nèi)存再分配給應(yīng)用程序。
所以對于linux系統(tǒng),可用于分配的內(nèi)存不只是free的內(nèi)存,還包括cached 的內(nèi)存 和buffers 的內(nèi)存.
這就是為什么我們程序中計算可用內(nèi)存的時候用mem.actual_free 而不是 mem.free 了,這么一說相信聰明的你肯定明白了.
總結(jié)
以上是生活随笔為你收集整理的sigar如何获取linux的buffer内存,Linux 下使用Sigar 获取内存信息的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 没有固定工作怎么办信用卡
- 下一篇: 车贷还清后GPS会拆除吗