Linux內存窺視--free

   free命令是linux系統中常用來查看內存大概情況的shell命令,其執行的效果如下:

root@mimosa_24FD52F24E00:/# free

             total         used         free       shared      buffers

Mem:         61056        34296        26760            0         3776

-/+ buffers:              30520        30536

Swap:            0            0            0

root@mimosa_24FD52F24E00:/# 

(這個輸出的基本單位爲KB)


free這個結果的產生由調用sysinfo()系統調用函數得到對應的結果,在2.6.36內核中跟蹤的結果如下:


[kernel/timer.c]

SYSCALL_DEFINE1(sysinfo, struct sysinfo __user *, info)

{

struct sysinfo val;


do_sysinfo(&val);


if (copy_to_user(info, &val, sizeof(struct sysinfo)))

return -EFAULT;


return 0;

}

sysinfo()系統調用最終由上面的函數給出內核的統計值。


    其中,do_sysinfo()函數的實現也在同一文件中,其定義的部分內容如下:

[kernel/timer.c: sysinfo()->do_sysinfo()]

/**

 * do_sysinfo - fill in sysinfo struct

 * @info: pointer to buffer to fill

 */

int do_sysinfo(struct sysinfo *info)

{

...

si_meminfo(info);

        ...

bitcount = 0;

mem_unit = info->mem_unit;

while (mem_unit > 1) {

bitcount++;

mem_unit >>= 1;

sav_total = mem_total;

mem_total <<= 1;

if (mem_total < sav_total)

goto out;

}


/*

 * If mem_total did not overflow, multiply all memory values by

 * info->mem_unit and set it to 1.  This leaves things compatible

 * with 2.2.x, and also retains compatibility with earlier 2.4.x

 * kernels...

 */


info->mem_unit = 1;

info->totalram <<= bitcount;

info->freeram <<= bitcount;

info->sharedram <<= bitcount;

info->bufferram <<= bitcount;

info->totalswap <<= bitcount;

info->freeswap <<= bitcount;

info->totalhigh <<= bitcount;

info->freehigh <<= bitcount;


out:

return 0;

}

    其中,do_sysinfo()調用si_meminfo()獲取vm_stat[]當前的未被使用內存總量,通過global_page_state()函數獲得:

[mm/page_alloc.c: sysinfo()->do_sysinfo()->si_meminfo()]

void si_meminfo(struct sysinfo *val)

{

val->totalram = totalram_pages;

val->sharedram = 0;

val->freeram = global_page_state(NR_FREE_PAGES);

val->bufferram = nr_blockdev_pages();

val->totalhigh = totalhigh_pages;

val->freehigh = nr_free_highpages();

val->mem_unit = PAGE_SIZE;

}

    

    由global_page_state()函數的名稱可以猜測,vm_stat對內存的管理的基本單位爲頁,此處爲4KB內存大小。


    確定了freeram的取值來源,也可以知道free命令的輸出的基本單位爲4KB,即free會存在最多4KB的誤差。此時,若檢查程序的內存泄露,對於泄露的內存遠小於4KB的情況,可能需要一定時間的累加才能獲知free得到的剩餘內存在降低,由於系統一般在運行中,而且linux內核會儘可能地使用內存用於提高系統的執行效率,所以,要想明確得到較小內存泄露程序的證據,時間會增加很多,最終,應該是比較長時間的free結果的剩餘內存的統計值處於波動降低的這麼一個現象。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章