Linux中Buffer和Cache的區別

2021-08-21 16:59:38 字數 4810 閱讀 7559

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中。

假設某地發生了自然災害(比如**),居民缺衣少食,於是派救火車去給若干個居民點送水。

救火車到達第乙個居民點,開閘放水,老百姓就拿著盆盆罐罐來接水。

假如說救火車在乙個居民點停留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的存在是為了解決什麼問題?速度太慢了,要加快速度!

再換句話說,為了完成最終目標:把葡萄放入卡車的空間,需要暫時把葡萄放入籮筐的空間。

再以程式設計為例,假設要實現乙個功能:接受使用者鍵入的字串,並賦值給乙個字串變數

其過程如下:

1:在記憶體中開闢乙個」鍵盤緩衝區「接受使用者鍵入的字串

2:把緩衝區中的字串copy到程式中定義的字串變數指向的記憶體空間(也就是賦值過程)

也就是說,為了完成最終目標:把字串放入字串變數指向的空間,需要暫時把字串放入「鍵盤緩衝區」的空間

以上舉的3個栗子:籮筐、bt的buffer,鍵盤緩衝區的buffer

buffer的存在是為了解決什麼問題?找個臨時的儲存空間!

總結:cache和buffer的相同點:都是2個層面之間的中間層,都是記憶體。

cache和buffer的不同點:cache解決的是時間問題,buffer解決的是空間問題。

為了提高速度,引入了cache這個中間層。

為了給資訊找到乙個暫存空間,引入了buffer這個中間層。

為了解決2個不同維度的問題(時間、空間),恰巧取了同一種解決方法:加入乙個中間層,先把資料寫到中間層上,然後再寫入目標。

這個中間層就是記憶體「ram」,既然是儲存器就有2個引數:寫入的速度有多塊(速度),能裝多少東西(容量)

cache利用的是ram提供的高讀寫速度,buffer利用的是ram提供的儲存容量(空間)。

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

linux記憶體中buffer和 cached的比較

經常遇到一些剛接觸linux的新手會問記憶體占用怎麼那麼多?在linux中經常發現空閒記憶體很少,似乎所有的記憶體都被系統占用了,表面感覺是記憶體不夠用了,其實不然。這是linux記憶體管理的乙個優秀特性,在這方面,區別於windows的記憶體管理。主要特點是,無論物理記憶體有多大,linux 都將...

linux 記憶體中Buffer和Cache的區別

具體怎麼理解?通過實驗發現,比較寫資料到檔案和寫資料到磁碟 比較從檔案中讀取資料和從磁碟中讀資料 實驗資料參考 簡單理解 buffer 是對磁碟資料的快取,而 cache 是檔案資料的快取。同學 geek 5258f8 的解答 理論上,乙個檔案讀首先到block buffer,然後到page cac...

Linux中Buffer和Cache的區別

今天監控linux資源時,在輸入top命令後,發現記憶體相關mem和swap的buffer與cache,順便研究了一下。什麼是cache?什麼是buffer?二者的區別是什麼?buffer和cache的區別 buffer與cache操作的物件就不一樣。1 buffer 緩衝 是為了提高記憶體和硬碟 ...