linux下free命令中buffer和cache的區別

首先看一下free命令展示的信息

在這裏插入圖片描述

第1列 Mem

物理內存使用情況

total used free shared buff/cache available
物理內存總容量 已使用內存容量 空閒內存容量 共享內存容量 緩存容量 可用內存容量

從截圖中的值可以明顯看出,total≠used+free,而是total≈used+available
由此可以看出free和available的區別所在。
free:是實際未使用的物理內存容量
available:是應用程序認爲可用的內存容量,available≈free+buff/cache,關鍵就是buff/cache這部分。

第2列Swap

交換區內存使用情況

total used free
交換區總容量 交換區使用容量 交換區空閒容量

看完上面的描述,你可能會有如下3個問題:

  1. 爲什麼會有buff和cache呢?
  2. 爲什麼buff和cache會被應用程序認爲是可用的呢?
  3. buff和cache又有什麼區別呢?

想要回答以上3個問題,可能都需要先理解buff和cache有什麼作用。

以下內容均來自https://www.cnblogs.com/M18-BlankBox/p/5326484.html

buff和cache的作用

從字面上和語義來看,buffer名爲緩衝,cache名爲緩存。我們知道各種硬件存在製作工藝上的差別,所以當兩種硬件需要交互的時候,肯定會存在速度上的差異,而且只有交互雙方都完成纔可以各自處理別的其他事務。假如現在有兩個需要交互的設備A和B,A設備用來交互的接口速率爲1000M/s,B設備用來交互的接口速率爲500M/s,那他們彼此訪問的時候都會出現以下兩種情況:(以A來說)

一.A從B取一個1000M的文件結果需要2s,本來需要1s就可以完成的工作,卻還需要額外等待1s,B設備把剩餘的500M找出來,這等待B取出剩下500M的空閒時間內(1s)其他的事務還幹不了

二.A給B一個1000M的文件結果也需要2s,本來需要也就1s就可以完成的工作,卻由於B,1s內只能拿500M,剩下的500M還得等下一個1sB來取,這等待下1s的時間還做不了其他事務。

那有什麼方法既可以讓A在‘取’或‘給’B的時候既能完成目標任務又不浪費那1s空閒等待時間去處理其他事務呢?我們知道產生這種結果主要是因爲B跟不上A的節奏,但即使這樣A也得必須等B處理完本次事務才能幹其他活(單核cpu來說),除非你有三頭六臂。那有小夥伴可能會問了,能不能在A和B之間加一層區域比如說ab,讓ab既能跟上A的頻率也會照顧B的感受,沒錯我們確實可以這樣設計來磨合接口速率上的差異,你可以這樣想象,在區域ab提供了兩個交互接口一個是a接口另一個是b接口,a接口的速率接近A,b接口的速率最少等於B,然後我們把ab的a和A相連,ab的b和B相連,ab就像一座橋把A和B鏈接起來,並告知A和B通過他都能轉發給對方,文件可以暫時存儲,最終拓撲大概如下:
在這裏插入圖片描述

現在我們再來看上述兩種情況:

對於第一種情況A要B:當A從B取一個1000M的文件,他把需求告訴了ab,接下來ab通過b和B進行文件傳送,由於B本身的速率,傳送第一次ab並沒有什麼卵用,對A來說不僅浪費了時間還浪費了感情,ab這傢伙很快感受到了A的不滿,所以在第二次傳送的時候,ab揹着B偷偷緩存了一個一模一樣的文件,而且只要從B取東西,ab都會緩存一個拷貝下來放在自己的大本營,如果下次A或者其他C來取B的東西,ab直接就給A或C一個貨真價實的贗品,然後把它通過a接口給了A或C,由於a的速率相對接近A的接口速率,所以A覺得不錯爲他省了時間,最終和ab的a成了好基友,說白了此時的ab提供的就是一種緩存能力,即cache,絕對的走私!因爲C取的是A執行的結果。所以在這種工作模式下,怎麼取得的東西是最新的也是我們需要考慮的,一般就是清cache。例如cpu讀取內存數據,硬盤一般都提供一個內存作爲緩存來增加系統的讀取性能

對於第二種情況A給B:當A發給B一個1000M的文件,因爲A知道通過ab的a接口就可以轉交給B,而且通過a接口要比通過B接口傳送文件需要等待的時間更短,所以1000M通過a接口給了ab ,站在A視圖上他認爲已經把1000M的文件給了B,但對於ab並不立即交給B,而是先緩存下來,除非B執行sync命令,即使B馬上要,但由於b的接口速率最少大於B接口速率,所以也不會存在漏洞時間,但最終的結果是A節約了時間就可以幹其他的事務,說白了就是推卸責任,哈哈而ab此時提供的就是一種緩衝的能力,即buffer,它存在的目的適用於當速度快的往速度慢的輸出東西。例如內存的數據要寫到磁盤,cpu寄存器裏的數據寫到內存。

看了上面這個例子,那我們現在看一下在計算機領域,在處理磁盤IO讀寫的時候,cpu,memory,disk基於這種模型給出的一個實例。我們先來一幅圖:(我從別家當來的,我覺得,看N篇文檔 不如瞄此一圖)
在這裏插入圖片描述
page cache:文件系統層級的緩存,從磁盤裏讀取的內容是存儲到這裏,這樣程序讀取磁盤內容就會非常快,比如使用grep和find等命令查找內容和文件時,第一次會慢很多,再次執行就快好多倍,幾乎是瞬間。但如上所說,如果對文件的更新不關心,就沒必要清cache,否則如果要實施同步,必須要把內存空間中的cache clean下

buffer cache:磁盤等塊設備的緩衝,內存的這一部分是要寫入到磁盤裏的。這種情況需要注意,位於內存buffer中的數據不是即時寫入磁盤,而是系統空閒或者buffer達到一定大小統一寫到磁盤中,所以斷電易失,爲了防止數據丟失所以我們最好正常關機或者多執行幾次sync命令,讓位於buffer上的數據立刻寫到磁盤裏。


瞭解了buff和cache的作用之後,就自然明白了buff和cache爲什麼會存在,以及buff和cache的區別了。
但是針對第2個問題,buff和cache爲什麼會被應用程序認爲可用呢。這個問題就需要再瞭解swap交換區的概念了。

swap分區通常被稱爲交換分區,這是一塊特殊的硬盤空間,即當實際內存不夠用的時候,操作系統會從內存中取出一部分暫時不用的數據,放在交換分區中,從而爲當前運行的程序騰出足夠的內存空間。也就是說,當內存不夠用時,我們使用 swap 分區可以把原本存放在buff和cache中的內容轉移至硬盤中,這樣騰出來的內存空間就可以給應用程序使用了,所以說buff和cache部分的內存,也可以認爲是可用的內存。

總結:

1.buffer和cache都是爲了解決互訪的兩種設備存在速率差異,使磁盤的IO的讀寫性能或cpu更加高效,減少進程間通信等待的時間

2.buffer:緩衝區-用於存儲速度不同步的設備或優先級不同的設備之間傳輸數據,通過buffer可以減少進程間通信需要等待的時間,當存儲速度快的設備與存儲速度慢的設備進行通信時,存儲快的設備先把數據緩存到buffer上,等到系統統一把buffer上的數據寫到速度慢的設備上。常見的有把內存的數據往磁盤進行寫操作,這時你可以查看一下buffers

3.cache:緩存區-用於對讀取速度比較嚴格,卻因爲設備間因爲存儲設備存在速度差異,而不能立刻獲取數據,這時cache就會爲了加速緩存一部分數據。常見的是CPU和內存之間的數據通信,因爲CPU的速度遠遠高於主內存的速度,CPU從內存中讀取數據需等待很長的時間,而Cache保存着CPU剛用過的數據或循環使用的部分數據,這時Cache中讀取數據會更快,減少了CPU等待的時間,提高了系統的性能。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章