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

相關推薦

LinuxBufferCache區別

2. Buffer:緩衝區,用於儲存速度不同步的裝置或優先順序不同的裝置之間傳輸資料;通過buffer可以減少程序間通訊需要等待的時間,當儲存速度快的裝置與儲存速度慢的裝置進行通訊時,儲存慢的資料先把資料存放到buffer,達到一定程度儲存快的裝置再讀取buffer的資料,在此期間儲存快的裝置CPU可以幹其他

Linux記憶體 BufferCache區別Linux檢視記憶體的命令free

一. Linux中檢視記憶體的命令free (1) free檢視的內在預設是以kb為單位,如果想以MB為單位檢視用命令 free -m     二.Linux記憶體 Buffer和Cache的區別 A buffer is something that has ye

linux ll ls 區別

彩色 顯示文件 時間排序 linux 常用 所有 數字 名稱 sub ll 列出來的結果詳細,有時間,是否可讀寫等信息 ,象windows裏的 詳細信息ls 只列出文件名或目錄名 就象windows裏的 列表ll -t 是降序, ll -t | tac 是升序 ll不是

Linuxflockfcntl區別

http://blog.csdn.net/icenic/article/details/8892461 從核心實現的角度來看,每當建立一把檔案鎖的時候,系統就會例項化一個struct file_lock物件,這個file_lock物件會記錄鎖的相關資訊:如鎖的型別(共享鎖,

Linuxsusu -區別,別再傻傻分不清

寫在前面   如果你不清楚su和su -切換使用者的區別,你一定會遇到在使用su切換使用者執行命令出現報錯"command not found"感到驚訝。分明之前這個指令執行的好好的,為什麼現在就報錯了呢?關鍵原因就在於你不清楚su和su -命令使用的區別。 su與su -區別   su和

linuxbuffercache區別

做成 內存 緩沖 交換 簡單 text 操作 進程 linux系統中 ***今天我們再來簡單討論下linux系統中關於Buffer和Cache的區別,buffer與cache操作的對象就不一樣、``` 1.buffer(緩沖區) 是為了提高內存的硬盤(或其他i/o設備)

Linux 記憶體 buffer cache區別

細心的朋友會注意到,當你在Linux下頻繁存取檔案後,實體記憶體會很快被用光,當程式結束後,記憶體不會被正常釋放,而是一直作為caching.這個問題,貌似有不少人在問,不過都沒有看到有什麼很好解決的辦法.那麼我來談談這個問題。 先來說說free命令 其中: total

Linux記憶體buffercache區別

cache是快取記憶體,用於CPU和記憶體之間的緩衝; buffer是I/O快取,用於記憶體和硬碟的緩衝 cache最初用於cpu cache, 主要原因是cpu 與memory, 由於cpu快,memory跟不上,且有些值使用次數多,所以放入 cache中,主要目的是,重複使用, 並且一級\二級物理cach

Linux性能優化實戰:怎麽理解內存BufferCache?(16)

inux tro parsing 內核 echo buffers block sed 性能優化 一、free數據的來源 1、碰到看不明白的指標時該怎麽辦嗎? 不懂就去查手冊。用 man 命令查詢 free 的文檔、就可以找到對應指標的詳細說明。比如,我們執行 man f

Linuxyumapt-get用法及區別

記錄 auto yum安裝軟件 mirror 內核 epo 綁定 提示 們的 Linux中yum和apt-get用法及區別 一般來說著名的linux系統基本上分兩大類: 1.RedHat系列:Redhat、Centos、Fedora等 2.Debian系列:De

buffercache區別

buffer cache 1 cache 緩存區高速緩存,是位cpu和主內存之間容量較小但是速度很快的存儲器,因為cpu的速度遠遠高於主內存的速度,cpu從內存中讀取數據需要等待很長一段時間,cache中保存著cpu剛用過的數據或者是循環使用的數據,這時,從cache中讀取數據就會很快,減少了cpu等待

學習筆記---buffercache區別

cache一.概念buffer:緩沖區,一個用於存儲速度不同步的設備或優先級不同的設備之間傳輸數據的區域。cache: 緩存,位於CPU與主內存間的一種容量較小但速度很高的存儲器。保存著CPU剛用過或循環使用的一部分數據。二、應用場景buffer:由各種進程分配,被用在輸入隊列等方面。cache: 用在磁盤的

簡單說明buffercache區別

buffer cache 1、什麽是buffer buffer(即緩沖區),簡單的說就是將寫入磁盤的IO先寫入到內存中,當達到了一定的時間或者是一定的大小的時候,再一次性地寫入到磁盤中,這是一個取的過程!數據流向:CPU ==》內存==》磁盤 2、什麽是cache cache(緩存區),簡單的說就是為

運維職責,buffercache什麽區別?機房防止服務器斷電,遠程控制卡

電源 小時 網站 蓄電池 管理 重啟 遠程控制 遠程 進行 1.運維職責·數據不能丟·網站7*24小時運行·用戶體驗要好2.buffer和cache什麽區別?buffeer 緩沖區 數據寫入到內存的buffer區域 寫buffer‘ 寫緩沖cache

linuxwhichwhereis、loacte、find的區別

幫助 可執行文件 執行 匹配 環境變量 命令 建立 環境變量path 當前 1,which在當前環境變量PATH中依此查找 一般用於查找命令/可執行文件所在路徑 2,whereis 返回與名稱匹配的二進制文件,源文件,幫助文件, 使用之前可以用updatadb命令來更新

linux find grep 的區別??

col linu 它的 -s glob 操作 功能 相關 round Linux 系統中 grep 命令是一種強大的文本搜索工具,它能使用正則表達式搜索文本,並把匹配的行打印出來。grep 全稱是 Global Regular Expression Print,表示

linuxllls的區別

linux下命令“ll”是“ls -l"的別名,"ll"和“ls -l”的功能是一樣的。 ls 命令可以說是linux下最常用的命令之一。 -a 列出目錄下的所有檔案,包括以 . 開頭的隱含檔案。 -b 把檔名中不可輸出的字元用反斜槓加字元編號(就象在C語言

linux,$*[email protected]有什麼區別

看了很多的文章,依然似懂非懂。現在,終於理解了它們兩者之間的區別。 $*會把當前指令碼的所有引數作為一個引數傳遞給子指令碼。(在英文中,*字元有“所有”的意思) [email protected]會把當前指令碼的所有引數分別作為一個引數傳遞給子指令碼。(在英文中,@字元有“獨立”的

Linux工具效能調優系列二:buffercache

一,案例入門 我們來看一個例子,我們來看free輸出,free採集資料來源是:/proc/meminfo檔案,對於這個檔案,會貫穿這個系列。 [email protected]:~# free total used free sh

linuxsusudo的區別

root使用者 su和sudo都用於執行具有root許可權的命令。root使用者基本上等同於Windows上的管理員使用者 - root使用者具有最大許可權,可以對系統執行任何操作。Linux上的普通使用者以較低的許可權執行 - 例如,他們無法安裝軟體或寫入系統目錄。 要執行需要這些