1. 程式人生 > 其它 >Buffer 和 cache

Buffer 和 cache

要問Cache和Buffer的區別,首先要問另一個問題:為何會存在Cache和Buffer?

無論快取還是緩衝,其實本質上解決的都是讀寫速度不匹配的問題,從這個角度,他們非常相似。

知乎上關於Cache 和 Buffer 都是快取,主要區別是什麼? - 知乎 (zhihu.com)的回答有上百個,把一個問題撥開了鑿穿了分析,看過了許多資料之後,發現博主們從多方面進行了回答,認為有必要對其中比較精闢的回答進行一次整理和彙總,希望對大家也有用

cache 快取

cache是為解決重複多次讀取硬碟資料提供解決方案

cache字面意思理解快取,在臺灣翻譯為快取,快取更加形象的表明了cache的作用,快速讀取。我們通常把經常訪問的資料儲存cache中,讀取時則不需要再次從硬碟讀取,從硬碟上讀取資料比較慢,按照原文的意思是從記憶體讀資料和從硬碟讀取資料的速度就好比火箭之於蒸汽機的差別。cache可以設定超時時間,超時後記憶體空間被回收,否則可以一直訪問,被清理後的cache資料可以從源資料(硬碟)重新讀取,實際資料不丟失。

Buffer 緩衝

背景知識一:我們現在的計算機、手機都是馮諾依曼架構,CPU只能操作記憶體中的資料,無法直接操作硬碟上的資料。

背景知識二:硬碟上的資料,最小讀寫單位是扇區(Sector)。老式硬碟上一個扇區是512位元組,現代硬碟上一個扇區是4K位元組。計算機不能以單個位元組為單位訪問硬碟上的資料。現在很常見的固態硬碟,物理上最小讀寫單位是頁(Page),但大部分固態硬碟通過主控晶片模擬傳統硬碟的扇區來進行讀寫。現代硬碟常用的LBA(Logical Block Addressing,邏輯塊定址)定址方式,是把硬碟上的扇區分配從0~N-1的編號(N為硬碟上所有可用扇區數量)。

介紹完背景,假設某個應用現在需要讀取一個大小為15K位元組的檔案A。作業系統和檔案系統會把檔案路徑轉換為具體的LBA地址,可能最終轉換為讀取硬碟上從B扇區開始的4個扇區(按照每個扇區4KB計算)。然而,前面我們說了,CPU並不能直接訪問硬碟,因此需要先把這四個扇區的資料,傳輸到記憶體中。存放這四個扇區資料的記憶體,就是Buffer。忽略CPU內部的Cache機制,CPU現在可以對這一段記憶體以位元組為單位進行操作,在所有操作完成後,Buffer所佔用的記憶體會被回收。

buffer的其他應用場景:在寫入文件的時候,我們以字元為單位輸入,資料並沒有儲存至硬碟裝置,而是暫存至buffer緩衝區,等到緩衝區滿或者flush,使用儲存按鈕的時候,緩衝區的資料才會被寫入硬碟,buffer的存在也為了減少硬碟的IO 讀寫次數,因為每次從記憶體寫入硬碟裝置速度也很慢,進而同時也提高了速度。

cache和buffer的聯絡:從以上介紹讀取檔案的過程中發現,把資料從硬碟上的扇區傳輸到記憶體的過程中,需要把扇區的資料暫存到buffer,將buffer flush寫入cache 快取之後,我們 就可以快取這些資料了。

總結:

涉及到IO裝置讀寫的場景中,Cache的一部分本身就是Buffer的一種。如果說某些場合Buffer可以提升IO裝置的讀寫效能,只不過是因為Buffer本身是Cache系統的一部分,效能提升來自於

Cache機制。Buffer不是快取,國內常用的翻譯是緩衝區

其次,大部分場景中,Buffer是特指記憶體中臨時存放的IO裝置資料——包括讀取和寫入;而Cache的用處很多——很多IO裝置(例如硬碟、RAID卡)上都有Cache,CPU內部也有Cache,瀏覽器也有Cache。

本文來自部落格園,作者:jiayouliucui,轉載請註明原文連結:https://www.cnblogs.com/cheery-go/p/15691856.html