Linux中Buffer和Cache的區別

2021-07-29 07:50:26 字數 3495 閱讀 6338

文章來至於

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

一. 記憶體使用說明

free 命令相對於top 提供了更簡潔的檢視系統記憶體使用情況:

[root@rac1 ~]# free 

total       used       free     shared    buffers     cached

mem:       

1035108

1008984      26124      0     124212     413000

-/+ buffers/cache:        471772      563336

swap:       2096472   842320     1254152

這裡顯示的單位是kb。

在linux的記憶體分配機制中,優先使用物理記憶體,當物理記憶體還有空閒時(還夠用),不會釋放其占用記憶體,就算占用記憶體的程式已經被關閉了,該程式所占用的記憶體用來做快取使用,對於開啟過的程式、或是讀取剛訪問過得資料會比較快。有關linux記憶體機制參考:

linux 

記憶體機制

mem:表示物理記憶體統計。

-/+ buffers/cached:表示物理記憶體的快取統計 

swap:表示硬碟上交換分割槽的使用情況。只有mem被當前程序實際占用完,即沒有了buffers和cache時,才會使用到swap。

mem 

行(第一行)資料說明:

total:1035108kb。表示物理記憶體總大小。

used:1008984kb。表示總計分配給快取(包含buffers 與cache )使用的數量,但其中可能部分快取並未實際使用。

free:26124kb。表示未被分配的記憶體。

shared:0kb。共享記憶體,一般系統不會用到。

buffers:124212kb。系統分配但未被使用的buffers 數量。

cached:413000kb。系統分配但未被使用的cache 數量。

-/+ buffers/cache 

行(第二行)資料說明:

used:471772kb,實際使用的buffers 與cache 總量,也是實際使用的記憶體總量。

free: 563336kb, 未被使用的buffers 與cache 和未被分配的記憶體之和,這就是系統當前實際可用記憶體。

根據以上分析,可以得出一下結論:

1.  

實際可用記憶體大小:

free(-/+ buffers/cache行)= free(mem)+buffers(mem)+cached(mem);

563336 = 26124 + 124212+ 413000

2.  

已經分配的記憶體大小:

used(mem) = used(-/+ buffers/cache)+ buffers(mem) + cached(mem)

1008984kb = 471772 + 124212 +413000

3.  

物理記憶體總大小

total(mem) = used(-/+ buffers/cache) + free(-/+ buffers/cache)

1035108 = 471772 + 563336

二.  buffer 

與cache 

的區別

a buffer is something that has yet to be "written" to disk.

a cache is something that has been "read" from the disk and stored for later use.

2.1 cache

cache:快取記憶體,是位於cpu與主記憶體間的一種容量較小但速度很高的儲存器。

由於cpu的速度遠高於主記憶體,cpu直接從記憶體中訪問資料要等待一定時間週期,cache中儲存著cpu剛用過或迴圈使用的一部分資料,當cpu再次使用該部分資料時可從cache中直接呼叫,這樣就減少了cpu的等待時間,提高了系統的效率。

cache又分為一級cache(l1 cache)和二級cache(l2 cache),l1 cache整合在cpu內部,l2 cache早期一般是焊在主機板上,現在也都整合在cpu內部,常見的容量有256kb或512kb l2 cache。

2.2 buffer

buffer

:緩衝區,乙個用於儲存速度不同步的裝置或優先順序不同的裝置之間傳輸資料的區域。通過緩衝區,可以使程序之間的相互等待變少,從而使從速度慢的裝置讀入資料時,速度快的裝置的操作程序不發生間斷。

在free

命令中顯示的

buffer

和cache

,它們都是占用記憶體:

buffer : 作為buffer cache的記憶體,是塊裝置的讀寫緩衝區,更靠近儲存裝置,或者直接就是disk的緩衝區。

cache: 作為page cache的記憶體, 檔案系統的cache,是memory的緩衝區

如果 cache 的值很大,說明cache住的檔案數很多。如果頻繁訪問到的檔案都能被cache住,那麼磁碟的讀io 必會非常小。

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 緩衝 是為了提高記憶體和硬碟 ...