Buffer和Cache的區別

Linux中Buffer和Cache的區別

原文:https://www.cnblogs.com/qiaoyanlin/p/6746791.html,侵刪
由本人(liudsl)用markdown重新排版,並作少量修改


相關概念

  1. Cache: 緩存區,是高速緩存,是位於CPU和主內存之間的容量較小但速度很快的存儲器,因爲CPU的速度遠遠高於主內存的速度,CPU從內存中讀取數據需等待很長的時間,而 Cache保存着CPU剛用過的數據或循環使用的部分數據,這時從Cache中讀取數據會更快,減少了CPU等待的時間,提高了系統的性能。

    Cache並不是緩存文件的,而是緩存塊的(塊是I/O讀寫最小的單元);Cache一般會用在I/O請求上,如果多個進程要訪問某個文件,可以把此文件讀入Cache中,這樣下一個進程獲取CPU控制權並訪問此文件直接從Cache讀取,提高系統性能。

  2. Buffer緩衝區, 用於存儲速度不同步的設備或優先級不同的設備之間傳輸數據;通過buffer可以減少進程間通信需要等待的時間,當存儲速度快的設備與存儲速度慢的設備進行通信時,存儲慢的數據先把數據存放到buffer,達到一定程度存儲快的設備再讀取buffer的數據,在此期間存儲快的設備CPU可以幹其他的事情。

    Buffer:一般是用在寫入磁盤的,例如:某個進程要求多個字段被讀入,當所有要求的字段被讀入之前已經讀入的字段會先放到buffer中。


Cache的例子

蓄水池

背景: 假設某地發生了自然災害(比如地震),居民缺衣少食,於是派救火車去給若干個居民點送水。救火車到達第一個居民點,開閘放水,老百姓就拿着盆盆罐罐來接水。

假如說救火車在一個居民點停留100分鐘放完了水,然後重新儲水花半個小時,再開往下一個居民點。這樣一個白天來來來回回的,也就是4-5個居民點。

但我們想想,救火車是何等存在,如果把水龍頭完全打開,其強大的水壓能輕易衝上10層樓以上, 10分鐘就可以把水全部放完。但因爲居民是拿盆罐接水,100%打開水龍頭那就是給人洗澡了,所以只能打開一小部分(比如10%的流量)。但這樣就降低了放水的效率(只有原來的10%了),10分鐘變100分鐘。

那麼,我們是否能改進這個放水的過程,讓救火車以最高效率放完水、儘快趕往下一個居民點呢?
方法就是:在居民點建蓄水池

救火車把水放到蓄水池裏,因爲是以100%的效率放水,10分鐘結束然後走人。居民再從蓄水池裏一點一點的接水。

我們分析一下這個例子,就可以知道Cache的含義了:

  • 救火車要給居民送水,居民要從救火車接水,就是說居民和救火車之間有交互,有聯繫。
  • 但救火車是“高速設備”,居民是“低速設備”,低速的居民跟不上高速的救火車,所以救火車被迫降低了放水速度以適應居民。
  • 爲了避免這種情況,在救火車和居民之間多了一層“蓄水池(也就是Cache)”,它一方面以100%的高效和救火車打交道,另一方面以10%的低效和居民打交道,這就解放了救火車,讓其以最高的效率運行,而不被低速的居民拖後腿,於是救火車只需要在一個居民點停留10分鐘就可以了。

所以說,蓄水池是“活雷鋒”,把高效留給別人,把低效留給自己。把10分鐘留給救火車,把100分鐘留給自己。

從以上例子可以看出,所謂Cache,就是“爲了彌補高速設備和低速設備之間的矛盾”而設立的一箇中間層。因爲在現實裏經常出現高速設備要和低速設備打交道,結果被低速設備拖後腿的情況。

CPU中的Cache和“蓄水池”聯繫

CPU速度很快,但CPU執行的指令是從內存取出的,計算的結果也要寫回內存,但內存的響應速度跟不上CPU。

CPU跟內存說:“你把某某地址的指令發給我”,內存聽到了,但因爲速度慢,遲遲不見指令返回,這段時間,CPU只能無所事事的等待了。這樣一來,再快的CPU也發揮不了效率。

怎麼辦呢? 在CPU和內存之間加一塊“蓄水池”,也就是Cache(片上緩存),這個Cache速度比內存快,從Cache取指令不需要等待:

  • 當CPU要讀內存的指令的時候先讀Cache再讀內存,但一開始Cache是空着的,只能從內存取,這時候的確是很慢,CPU需要等待。
  • 但從內存取回的不僅僅是CPU所需要的指令,還有其它的、當前不需要的指令,然後把這些指令存在Cache裏備用。
  • CPU再取指令的時候還是先讀Cache,看看裏面有沒有所需指令,如果碰巧有就直接從Cache取,不用等待即可返回(命中),這就解放了CPU,提高了效率。(當然不會是100%命中,因爲Cache的容量比內存小)

CPU-Z

CPU的Cache,可以有好幾層,而且還分數據Cache和指令Cache,見上圖

磁盤和內存之間的Cache

磁盤緩存也是一樣,剛纔說內存是慢速設備,所以需要cache(片上緩存),但這個“慢”是相對於CPU而言的,相對於機械硬盤HDD,內存的速度可快多了

對於磁盤的讀寫操作,在很久以前,讀寫過程需要CPU參與,後來出現了“DMA/直接內存訪問"就不再需要CPU了,但即使如此,高負荷、長時間的磁盤讀寫也非常的耗時,因爲磁盤是機械旋轉部件,其讀寫速度相比CPU和內存條的二進制電壓變化速度,那就是蒸汽機和火箭速度的差別。

爲了加快數據的讀寫速度,在磁盤和內存之間也插入一層Cache(Windows在內存裏劃分出一塊區域作爲Cache,硬盤也有板載Cache)

寫入數據的時候先寫入到Cache裏;因爲Cache很快,所以數據很快就寫入。

比方說,1G的數據,如果直接寫入硬盤需要10秒,但寫入Cache(也就是系統內存)只需要1秒。
這樣一來用戶就有了系統速度很快的“幻覺”。但這只是障眼法,數據暫存在Cache裏並沒有被真正寫入磁盤,等系統空閒的時候再慢慢寫入。

同理,在讀數據的時候,除了所需的數據,還有一堆目前不需要的數據也都被讀出來放到內存的Cache裏。下次再讀的時候,如果恰巧Cache裏有所需的數據就可直接讀入(命中),這就避免了從慢速的HDD讀數據的尷尬。用戶的體驗同樣也是速度很快。(同樣不會100%命中,因爲RAM的容量遠小於硬盤容量)
磁盤和內存之間的Cache

PC有16G的內存,磁盤Cahce佔用了3.59G,這是動態的,會自動調整大小, 見上圖

某品牌硬盤的廣告強調了大緩存的優勢

硬盤也內置了Cache。某品牌硬盤的廣告強調了大緩存的優勢,見上圖

以上舉了3個栗子:蓄水池、CPU的Cache、磁盤的Cache, Cache的存在是爲了解決什麼問題?速度太慢了,要加快速度!


Buffer的例子

那麼buffer呢? 請允許我再次舉起栗子。

吐魯番的葡萄

吐魯番的葡萄熟了,要用大卡車裝葡萄運出去賣

果園的姑娘採摘葡萄,當然不是前手把葡萄摘下來,後手就放到卡車上,而是需要一箇中間過程“籮筐”:摘葡萄→放到籮筐裏→把籮筐裏的葡萄倒入卡車。

也就是說,雖然最終目的是“把葡萄倒入卡車”,但中間必須要經過“籮筐”的轉手,這裏的籮筐就是Buffer,是“暫時存放物品的空間”。

注意2個關鍵詞:暫時,空間 ,再換句話說,爲了完成最終目標:把葡萄放入卡車的空間,需要暫時把葡萄放入籮筐的空間。

BT下載

BT下載需要長時間的掛機,電腦就有可能24小時連軸轉,但BT下載的數據是碎片化的,體現在硬盤寫入上也是碎片化的,因爲硬盤是機械尋址器件,這種碎片化的寫入會造成硬盤長時間高負荷的機械運動,造成硬盤過早老化損壞,當年有大量的硬盤因爲BT下載而損壞

於是新出的BT軟件在內存裏開闢了Buffer,數據暫時寫入Buffer,攢到一定的大小(比如512M)再一次性寫入硬盤,這種“化零爲整”的寫入方式大大降低了硬盤的負荷。

這就是,爲了完成最終目標:把數據寫入硬盤空間,需要暫時寫入Buffer的空間

編程爲例

假設要實現一個功能:接受用戶鍵入的字符串,並賦值給一個字符串變量
其過程如下:

  1. 在內存中開闢一個”鍵盤緩衝區“接受用戶鍵入的字符串
  2. 把緩衝區中的字符串copy到程序中定義的字符串變量指向的內存空間(也就是賦值過程)

也就是說,爲了完成最終目標:把字符串放入字符串變量指向的空間,需要暫時把字符串放入“鍵盤緩衝區”的空間。

以上舉的3個栗子:籮筐、BT的Buffer,鍵盤緩衝區的Buffer
Buffer的存在是爲了解決什麼問題?找個臨時的存儲空間!


Buffer和Cache的區別

  1. Buffer(緩衝區)是系統兩端處理速度平衡(從長時間尺度上看)時使用的。它的引入是爲了減小短期內突發I/O的影響,起到流量整形的作用。比如生產者——消費者問題,他們產生和消耗資源的速度大體接近,加一個buffer可以抵消掉資源剛產生/消耗時的突然變化。
  2. Cache(緩存)則是系統兩端處理速度不匹配時的一種折衷策略。因爲CPU和memory之間的速度差異越來越大,所以人們充分利用數據的局部性(locality)特徵,通過使用存儲系統分級(memory hierarchy)的策略來減小這種差異帶來的影響。
  3. 假定以後存儲器訪問變得跟CPU做計算一樣快,cache就可以消失,但是buffer依然存在。比如從網絡上下載東西,瞬時速率可能會有較大變化,但從長期來看卻是穩定的,這樣就能通過引入一個buffer使得OS接收數據的速率更穩定,進一步減少對磁盤的傷害。

以上觀點屬於程老大,無節操默寫


總結:

  • Cache和Buffer的相同點:都是2個層面之間的中間層,都是內存
  • Cache和Buffer的不同點:Cache解決的是時間問題,Buffer解決的是空間問題
  • 爲了提高速度,引入了Cache這個中間層
  • 爲了給信息找到一個暫存空間,減小短期內突發I/O的影響,引入了Buffer這個中間層
  • 爲了解決2個不同維度的問題(時間、空間),恰巧取了同一種解決方法:加入一箇中間層,先把數據寫到中間層上,然後再寫入目標。這個中間層就是內存“RAM”,既然是存儲器就有2個參數:寫入的速度有多塊(速度),能裝多少東西(容量)
  • Cache利用的是RAM提供的高讀寫速度,Buffer利用的是RAM提供的存儲容量(空間)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章