1. 程式人生 > >Linux中Buffer和Cache的區別

Linux中Buffer和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分鐘留給自己。

從以上例子可以看出,所謂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,這是動態的,會自動調整大小

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


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

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

Buffer和Cache的區別 buffer與cache操作的物件就不一樣。

1、buffer(緩衝)是為了提高記憶體和硬碟(或其他I/O裝置)之間的資料交換的速度而設計的。

2、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以方便下次被訪問,這樣可提高系統性能。

相關推薦

no