sigar如何获取linux的buffer内存,Linux 下使用Sigar 获取内存信息
上一篇文章介紹了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 了,這么一說相信聰明的你肯定明白了.
總結
以上是生活随笔為你收集整理的sigar如何获取linux的buffer内存,Linux 下使用Sigar 获取内存信息的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 没有固定工作怎么办信用卡
- 下一篇: linux配置ip地址 routes,C