在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