天天看點

buffer和cache的差別

在free指令展示機器的記憶體消耗情況,會像如下展示:

[root@lcoal ~]# free -m

             total       used       free     shared    buffers     cached

Mem:         64369      64030        339       1068        395      57651

-/+ buffers/cache:       5982      58386

Swap:        97759        164      97595

buffered 和cached本質内容有什麼差別呢?

英文是這樣解釋:

A buffer is something that has yet to be "written" to disk.  這些資料準備寫到磁盤的,但還沒有寫到磁盤,緩存在記憶體中。

之是以有這樣的機制,因為頻繁地寫入磁盤,會造成磁盤i/0,是以一般資料不會馬上寫入到磁盤去,而是定期積累到一定量後寫入磁盤去。

buffer的英文本意是緩沖器,緩沖一下,不要馬上寫入到磁盤,沖擊磁盤。

A cache is something that has been "read" from the disk and stored for later use.

從磁盤上讀取資料存儲到記憶體中緩存起來,友善下一次使用。目的是避免頻繁的去磁盤上讀取資料,直接從記憶體中讀取使用了。

之是以有cache,一般是對頻繁使用到的資料(讀的資料),進行緩存到記憶體。

從上面分析看,兩個記憶體區域要解決的問題和目标都不同。一個是解決頻繁讀的問題。另外一個是解決頻繁寫入到磁盤的問題。

但相同點是:他們都是為了減少磁盤i/0次數。因為磁盤是機械性的旋轉,靠磁頭定位來讀、寫資料。頻繁讀、寫磁盤,就會造成磁頭頻繁定位,

這個就是磁盤i/0(資料庫系統的實作裡面有磁盤的原理介紹,然後專門講解實作一個資料庫系統如何針對磁盤做優化)

free指令中的used項(已經使用的記憶體),其實是已經包含了buffer和cache部分。

根據上面對buffer和cache的分析,buffer和cache部分實際上是可以拿來使用的記憶體區(都是緩存資料,釋放掉這部分記憶體空間并不影響)

正因為這樣,為了想要準确得知到底有多少可用的記憶體,linux的free指令,會第二列專門給出減去buffer和cache部分的統計結果來看。

第二列 :-/+ buffers/cache

顯示兩個值,第一個值,是used-buffers-cache的計算結果。第二個值 是free+buffers+cache的計算結果

思考

從作業系統角度來看,它隻關注真正的實體記憶體剩餘多少。是以buffer區域和cache區域它也認為不是剩餘的。這沒有錯。作業系統關注是實體記憶體真實有多少。

而應用程式角度來看,它關注的是有多少實體記憶體是自己可以調用的。它認為buffer和cache部分也是可以拿過來用的。也沒有錯誤。

現實中例子用什麼來形象化描述呢?

一個人有多少錢,站在不同的角度算法不一樣。

有人存款10萬。我們隻是看它真實錢有多少。那就是10萬(作業系統這麼認為)

而從另外一個角度,他有房子,如果需要,房子可以賣掉,賣成錢,估算一下價格。假設房子80萬,那麼他的錢就是80+10=90萬(應用程式這麼認為)

兩個計算方式都沒有錯。角度不同。

buffer和cache,對于應用程式而言,覺得這部分是可以回收的(我需要的時候随時可以用。房子随時可以套現拿到錢使用)

版權聲明:原創作品,如需轉載,請注明出處。否則将追究法律責任

本文轉自    鵬愛   51CTO部落格,原文連結:http://blog.51cto.com/pengai/1892252

繼續閱讀