小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Linux Kernel and Tao | Just another linux kernel site

 astrotycoon 2013-09-07

free命令中的buffers和cached

Posted on January 17, 2012 by admin

原創(chuàng)文章,轉(zhuǎn)載請注明

最近有好幾位同事問我關(guān)于free(1)結(jié)果中buffers和cached的區(qū)別,一直很佩服@淘寶褚霸 對知識的無私分享,所以今天就以這個話題開始我的blog吧,但愿有機會時常更新它,爭取2012年能夠做到至少一個月一篇吧,呵呵!閑話少說,進入正題。

free命令大家都經(jīng)常使用,

taotaoma@tma-laptop1:~/kernel/linux-2.6$ free
total       used       free     shared    buffers     cached
Mem:       5918476    1675260    4243216          0     157664     819004
-/+ buffers/cache:     698592    5219884
Swap:            0          0          0

各個內(nèi)容的顯示應該還算是簡單明了的,唯一比較讓人困惑的兩項就是buffers和cached。一般的認識都是說buffers指的是元數(shù)據(jù)的數(shù)量,而cached是指文件的page cache的數(shù)量。那么真的是這樣么?

其 實現(xiàn)在的linux內(nèi)核中對于緩存的管理都是以page的形式進行的,也就是說在系統(tǒng)底層只存在各種page,這些page保存在不同的tree 中,buffer這個概念實際上已經(jīng)過時了,但是為了保持對過往系統(tǒng)的兼容性,linux內(nèi)核中還保留了這個概念,并仍然用它來代表文件系統(tǒng)中的一些所謂的元數(shù)據(jù),但是由于已經(jīng)沒有buffer了,那么free該怎么顯示buffers呢?內(nèi)核巧妙的利用了一個特性,那就是文件系統(tǒng)在讀取元數(shù)據(jù)的時候一般都是通過它所對應的塊設(shè)備來進行,也就是說元數(shù)據(jù)存儲的page一般都是保存在塊設(shè)備對應的tree中,而一般文件的page  cache則是保存在它的宿主文件的tree中。有了這個假設(shè),我們就可以通過統(tǒng)計所有在塊設(shè)備的tree上的page來得出系統(tǒng)的buffers數(shù)量。

這一塊對應的代碼是這樣的(以2.6.32的代碼為例):

free是通過讀取/proc/meminfo里面的數(shù)據(jù)來顯示的,而/proc/meminfo的具體實現(xiàn)代碼在Linux內(nèi)核中的fs/proc/meminfo.c里面。

sysinfo.bufferram是通過函數(shù)si_meminfo得到的,查看si_memeinfo可以看到這樣一行:

val->bufferram = nr_blockdev_pages();

而對應的函數(shù)就很簡單了

long nr_blockdev_pages(void)
{
struct block_device *bdev;
long ret = 0;
spin_lock(&bdev_lock);
list_for_each_entry(bdev, &all_bdevs, bd_list) {
ret += bdev->bd_inode->i_mapping->nrpages;
}
spin_unlock(&bdev_lock);
return ret;
}

遍歷所有的塊設(shè)備,然后把所有的塊設(shè)備tree上的pages數(shù)目加起來,然后返回,是不是一目了然呢!

問題到這里真的就結(jié)束了么?非也非也,這樣的算法明顯很不精確,因為如果我直接操作裸設(shè)備,那內(nèi)核如何區(qū)分呢?大家可以做一個簡單的測試。

echo 3 > /proc/sys/vm/drop_caches

free

dd if=/dev/sda of=/dev/null bs=1M count=1000

free

相信大家一定都看到了buffers的劇烈增長了吧!由于你像文件系統(tǒng)一樣直接通過塊設(shè)備來讀取設(shè)備的內(nèi)容,所以內(nèi)核把你這次操作讀取的page都算作了buffers,也就從側(cè)面驗證了free命令中計算buffers所用的算法。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多