Linux中Buffer和Cache的區別

 

 

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

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

2. Buffer:緩衝區,用於存儲速度不一樣步的設備或優先級不一樣的設備之間傳輸數據;經過buffer能夠減小進程間通訊須要等待的時間,當存儲速度快的設備與存儲速度慢的設備進行通訊時,存儲慢的數據先把數據存放到buffer,達到必定程度存儲快的設備再讀取buffer的數據,在此期間存儲快的設備CPU能夠幹其餘的事情。緩存

Buffer:通常是用在寫入磁盤的,例如:某個進程要求多個字段被讀入,當全部要求的字段被讀入以前已經讀入的字段會先放到buffer中。網絡

 

 


假設某地發生了天然災害(好比地震),居民缺衣少食,因而派救火車去給若干個居民點送水。
救火車到達第一個居民點,開閘放水,老百姓就拿着盆盆罐罐來接水。
假如說救火車在一個居民點停留100分鐘放完了水,而後從新儲水花半個小時,再開往下一個居民點。這樣一個白天來來來回回的,也就是4-5個居民點。
但咱們想一想,救火車是何等存在,若是把水龍頭徹底打開,其強大的水壓能輕易衝上10層樓以上, 10分鐘就能夠把水所有放完。但由於居民是拿盆罐接水,100%打開水龍頭那就是給人洗澡了,因此只能打開一小部分(好比10%的流量)。但這樣就下降了放水的效率(只有原來的10%了),10分鐘變100分鐘。
那麼,咱們是否能改進這個放水的過程,讓救火車以最高效率放完水、儘快趕往下一個居民點呢?
方法就是:在居民點建蓄水池。
救火車把水放到蓄水池裏,由於是以100%的效率放水,10分鐘結束而後走人。居民再從蓄水池裏一點一點的接水。
咱們分析一下這個例子,就能夠知道Cache的含義了。
救火車要給居民送水,居民要從救火車接水,就是說居民和救火車之間有交互,有聯繫。
但救火車是「高速設備」,居民是「低速設備」,低速的居民跟不上高速的救火車,因此救火車被迫下降了放水速度以適應居民。
爲了不這種狀況,在救火車和居民之間多了一層「蓄水池(也就是Cache)」,它一方面以100%的高效和救火車打交道,另外一方面以10%的低效和居民打交道,這就解放了救火車,讓其以最高的效率運行,而不被低速的居民拖後腿,因而救火車只須要在一個居民點停留10分鐘就能夠了。
因此說,蓄水池是「活雷鋒」,把高效留給別人,把低效留給本身。把10分鐘留給救火車,把100分鐘留給本身。ide

從以上例子能夠看出,所謂Cache,就是「爲了彌補高速設備和低速設備之間的矛盾」而設立的一箇中間層。由於在現實裏常常出現高速設備要和低速設備打交道,結果被低速設備拖後腿的狀況。性能

以PC爲例。CPU速度很快,但CPU執行的指令是從內存取出的,計算的結果也要寫回內存,但內存的響應速度跟不上CPU。
CPU跟內存說:你把某某地址的指令發給我。內存聽到了,但由於速度慢,遲遲不見指令返回,這段時間,CPU只能無所事事的等待了。這樣一來,再快的CPU也發揮不了效率。
怎麼辦呢?在CPU和內存之間加一塊「蓄水池」,也就是Cache(片上緩存),這個Cache速度比內存快,從Cache取指令不須要等待。
當CPU要讀內存的指令的時候先讀Cache再讀內存,但一開始Cache是空着的,只能從內存取,這時候的確是很慢,CPU須要等待。
但從內存取回的不只僅是CPU所須要的指令,還有其它的、當前不須要的指令,而後把這些指令存在Cache裏備用。
CPU再取指令的時候仍是先讀Cache,看看裏面有沒有所需指令,若是碰巧有就直接從Cache取,不用等待便可返回(命中),這就解放了CPU,提升了效率。(固然不會是100%命中,由於Cache的容量比內存小)

CPU的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的容量遠小於硬盤容量)

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

硬盤也內置了Cache。某品牌硬盤的廣告強調了大緩存的優點翻譯

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

那麼buffer呢? 請容許我再次舉起栗子。
好比說吐魯番的葡萄熟了,要用大卡車裝葡萄運出去賣
果園的姑娘採摘葡萄,固然不是前手把葡萄摘下來,後手就放到卡車上,而是須要一箇中間過程「籮筐」:摘葡萄→放到籮筐裏→把籮筐裏的葡萄倒入卡車。
也就是說,雖然最終目的是「把葡萄倒入卡車」,但中間必需要通過「籮筐」的轉手,這裏的籮筐就是Buffer。是「暫時存放物品的空間」。
注意2個關鍵詞:暫時,空間
再換句話說,爲了完成最終目標:把葡萄放入卡車的空間,須要暫時把葡萄放入籮筐的空間。

以BT爲例,BT下載須要長時間的掛機,電腦就有可能24小時連軸轉,但BT下載的數據是碎片化的,體如今硬盤寫入上也是碎片化的,由於硬盤是機械尋址器件,這種碎片化的寫入會形成硬盤長時間高負荷的機械運動,形成硬盤過早老化損壞,當年有大量的硬盤由於BT下載而損壞。
因而新出的BT軟件在內存裏開闢了Buffer,數據暫時寫入Buffer,攢到必定的大小(好比512M)再一次性寫入硬盤,這種「化零爲整」的寫入方式大大下降了硬盤的負荷。
這就是:爲了完成最終目標:把數據寫入硬盤空間,須要暫時寫入Buffer的空間

再以編程爲例,假設要實現一個功能:接受用戶鍵入的字符串,並賦值給一個字符串變量
其過程以下:
1:在內存中開闢一個」鍵盤緩衝區「接受用戶鍵入的字符串
2:把緩衝區中的字符串copy到程序中定義的字符串變量指向的內存空間(也就是賦值過程)
也就是說,爲了完成最終目標:把字符串放入字符串變量指向的空間,須要暫時把字符串放入「鍵盤緩衝區」的空間

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

總結:
Cache和Buffer的相同點:都是2個層面之間的中間層,都是內存。
Cache和Buffer的不一樣點: Cache解決的是時間問題,Buffer解決的是空間問題。
爲了提升速度,引入了Cache這個中間層。
爲了給信息找到一個暫存空間,引入了Buffer這個中間層。
爲了解決2個不一樣維度的問題(時間、空間),恰巧取了同一種解決方法:加入一箇中間層,先把數據寫到中間層上,而後再寫入目標。
這個中間層就是內存「RAM」,既然是存儲器就有2個參數:寫入的速度有多塊(速度),能裝多少東西(容量)
Cache利用的是RAM提供的高讀寫速度,Buffer利用的是RAM提供的存儲容量(空間)。

 

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



 

監控linux資源時,在輸入top命令後,發現內存相關MEM和SWAP的buffer與Cache,順便研究了一下。

什麼是Cache?什麼是Buffer?兩者的區別是什麼? 

Buffer和Cache的區別 buffer與cache操做的對象就不同。

一、buffer(緩衝)是爲了提升內存和硬盤(或其餘I/O設備)之間的數據交換的速度而設計的。

二、cache(緩存)

從CPU角度考慮,是爲了提升cpu和內存之間的數據交換速度而設計的,例如日常見到的一級緩存、二級緩存、三級緩存。 cpu在執行程序所用的指令和讀數據都是針對內存的,也就是從內存中取得的。因爲內存讀寫速度慢,爲了提升cpu和內存之間數據交換的速度,在cpu和內存之間增長了cache,它的速度比內存快,可是造價高,又因爲在cpu內不能集成太多集成電路,因此通常cache比較小,之後intel等公司爲了進一步提升速度,又增長了二級cache,甚至三級cache,它是根據程序的局部性原理而設計的,就是cpu執行的指令和訪問的數據每每在集中的某一塊,因此把這塊內容放入cache後,cpu就不用在訪問內存了,這就提升了訪問速度。固然若cache中沒有cpu所須要的內容,仍是要訪問內存的。

從內存讀取與磁盤讀取角度考慮,cache能夠理解爲操做系統爲了更高的讀取效率,更多的使用內存來緩存可能被再次訪問的數據。

緩衝(buffers)是根據磁盤的讀寫設計的,把分散的寫操做集中進行,減小磁盤碎片和硬盤的反覆尋道,從而提升系統性能。linux有一個守護進程按期清空緩衝內容(即寫入磁盤),也能夠經過sync命令手動清空緩衝。簡單來講,buffer是即將要被寫入磁盤的,而cache是被從磁盤中讀出來的。 buffer是由各類進程分配的,被用在如輸入隊列等方面。一個簡單的例子如某個進程要求有多個字段讀入,在全部字段被讀入完整以前,進程把先前讀入的字段放在buffer中保存。cache常常被用在磁盤的I/O請求上,若是有多個進程都要訪問某個文件,因而該文件便被作成cache以方便下次被訪問,這樣可提升系統性能。

相關文章
相關標籤/搜索