【總結】
概念:cache和buffer都是內存模塊,只是作用不同所以名稱不同,主要是為了解決磁盤IO慢的問題,借用內存來儲存磁盤IO需要的數據。
一句話的描述:
buffer就是記錄修改的信息,用於系統寫入數據到磁盤。
cache就是記錄磁盤的信息,用於系統從磁盤讀數據。
在操作系統中的角色:
buffer:即 os =》修改操作想要落地到盤 =》先全部記錄到 buffer =》根據壓力和同步策略 批量持久化到磁盤(避免小而多的頻繁寫入磁盤,前面說了磁盤寫入比內存操作慢多了)
cache:即 os =》想要讀取一個文件 =》先去cache內存里面看有沒有 =》沒有則讀取硬盤上的文件內容到 cache,有則直接讀cache內存(避免小而多的頻繁讀磁盤,前面說了磁盤讀比內存操作慢多了)
在數據庫里面的角色:
buffer就是臟頁、索引緩存頁,定時根據數據庫/os 策略來批量落盤臟頁,避免小而多的頻繁寫入磁盤。
cache 就是查詢緩存/數據緩存,以減少回表次數。
在free命令展示機器的內存消耗情況,會像這樣展示
buffered 和cached本質內容有什么區別呢?
我沒搞明白。我覺得需要追根溯源會更加理解本質。
英文是這樣解釋
A buffer is something that has yet to be "written" to disk. 這些數據准備寫到磁盤的,但還沒有寫到磁盤,緩存在內存中。
之所以有這樣的機制,因為頻繁地寫入磁盤,會造成磁盤i/0,所以一般數據不會馬上寫入到磁盤去,而是定期積累到一定量后寫入磁盤去。
buffer的英文本意是緩沖器,緩沖一下,不要馬上寫入到磁盤,沖擊磁盤。
這個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的計算結果。第二個值 是used+buffers+cache的計算結果
思考
從操作系統角度來看,它只關注真正的物理內存剩余多少。所以buffer區域和cache區域它也認為不是剩余的。這沒有錯。操作系統關注是物理內存真實有多少。
而應用程序角度來看,它關注的是有多少物理內存是自己可以調用的。它認為buffer和cache部分也是可以拿過來用的。也沒有錯誤。
現實中例子用什么來形象化描述呢?
一個人有多少錢,站在不同的角度算法不一樣。
有人存款10萬。我們只是看它真實錢有多少。那就是10萬(操作系統這么認為)
而從另外一個角度,他有房子,如果需要,房子可以賣掉,賣成錢,估算一下價格。假設房子80萬,那么他的錢就是80+10=90萬(應用程序這么認為)
兩個計算方式都沒有錯。角度不同。
buffer和cache,對於應用程序而言,覺得這部分是可以回收的(我需要的時候隨時可以用。房子隨時可以套現拿到錢使用)
