提到這個(gè)問題,可能意味著題主意識(shí)到了兩者的相關(guān)性。的確,他們確實(shí)有那么一些聯(lián)系。
首先cache是緩存,buffer是緩沖,雖然翻譯有那么一個(gè)字的不同,但這不是重點(diǎn)。
個(gè)人認(rèn)為他們最直觀的區(qū)別在于cache是隨機(jī)訪問,buffer往往是順序訪問。雖然這樣說并沒有直擊本質(zhì),不過我們可以待分析完畢之后再來討論真正的本質(zhì)。
為了說明這個(gè)問題,讓我將他們分開來說:read cache(讀緩存),read buffer(讀緩沖),write cache(寫緩存),write buffer(寫緩沖)。
無論緩存還是緩沖,其實(shí)本質(zhì)上解決的都是讀寫速度不匹配的問題,從這個(gè)角度,他們非常相似。
首先討論讀緩存跟讀緩沖。
讀緩存跟讀緩沖的最大區(qū)別在于,讀緩存的目標(biāo)數(shù)據(jù)是始終有效的,如果不從緩存中讀取,也可以直接讀取實(shí)際數(shù)據(jù),只不過實(shí)際數(shù)據(jù)讀取會(huì)慢一些,當(dāng)這個(gè)數(shù)據(jù)在緩存中,讀取速度將會(huì)變快。
當(dāng)一個(gè)緩存中的數(shù)據(jù)被多次讀取,實(shí)際上就減少了該數(shù)據(jù)從慢速設(shè)備中讀取的量,這就存在某種算法去選擇「什么數(shù)據(jù)需要保存在cache中」,因?yàn)楸M可能多的讓cache命中能提高性能。
先進(jìn)入cache的數(shù)據(jù)不一定先被讀取,甚至說進(jìn)入cache的數(shù)據(jù)有可能永遠(yuǎn)不被讀取就被清除了,因此read cache呈現(xiàn)出非常明顯的隨機(jī)訪問特性。
而讀緩沖buffer的數(shù)據(jù)則不是始終有效,而是實(shí)時(shí)生成的數(shù)據(jù)流,每當(dāng)buffer滿或者主動(dòng)flush buffer的時(shí)候觸發(fā)一次讀取,對于小數(shù)據(jù),這樣可以減少讀取次數(shù),對于大數(shù)據(jù),這可以控制單次讀取的數(shù)據(jù)量。
換句話說,無論數(shù)據(jù)量大還是小,單次讀取數(shù)據(jù)量都按照buffer尺寸進(jìn)行歸一化了。通常來說,先喂給buffer的數(shù)據(jù)一定會(huì)先被讀取,所有buffer的數(shù)據(jù)幾乎一定會(huì)被讀取,這是很明顯的順序訪問特性。
從上面的情況看到,讀緩存以及讀緩沖很明確的反應(yīng)出了我所說的表面特性。而其本質(zhì)特性在于cache的目標(biāo)是減少讀取總量每次cache命中都減小了讀取總量。
而buffer并不能減少讀取總量,只能規(guī)整化每次讀取數(shù)據(jù)的尺寸大小。
要說到write cache跟write buffer?
我們先說write buffer,write buffer是read buffer的對應(yīng),對于小數(shù)據(jù)的寫入,它需要填滿write buffer再進(jìn)行一次寫入,對于大數(shù)據(jù),大數(shù)據(jù)會(huì)被分割到buffer尺寸的大小分批寫入。
因此,write buffer 的用處在于使得每次寫入的數(shù)據(jù)量相對固定。如果一次寫入4k對某個(gè)設(shè)備來說效率最高,那么把buffer定為4k,小數(shù)據(jù)積攢到4k寫一次,大數(shù)據(jù)分割到每個(gè)碎片4k多次寫入,這樣就是write buffer的用處。
最后我們來說write cache。所謂write cache,就是要設(shè)法減少寫入次數(shù)。也就是說,如果某些數(shù)據(jù)需要產(chǎn)生多次寫入,那么使用cache就可以只將最終數(shù)據(jù)寫入,導(dǎo)致最終寫入數(shù)據(jù)減少。
在實(shí)際應(yīng)用中,我們有時(shí)會(huì)使用到write buffer跟write cache的合體形態(tài)。buffer本身需要規(guī)整尺寸,與此同時(shí),buffer還允許多次隨機(jī)寫入,使得多次寫入的數(shù)據(jù)只用寫入最后一次,這屬于cache的特性。
BT軟件使用的寫緩存往往具有類似特性,因而這種形態(tài)它同時(shí)既是buffer又是cache。
正因?yàn)樵趯懭雸龊蟗uffer跟cache沒有那么明顯的分界,所以才會(huì)有產(chǎn)生buffer跟cache究竟有啥區(qū)別的疑問。
結(jié)論
在read(讀取)的場合,cache通常被用于減少重復(fù)讀取數(shù)據(jù)時(shí)的開銷,而buffer則用于規(guī)整化每次讀取數(shù)據(jù)的尺寸,在讀取場合兩者用途差別很大。
在write(寫入)的場合,兩者功能依然沒變,但由于cache跟buffer的功能在寫入場合可以融合使用,所以兩者可以被混淆,寫入緩沖跟寫入緩存往往會(huì)同時(shí)擔(dān)當(dāng)規(guī)整化寫入尺寸以及減少寫入次數(shù)的功能,所以兩者有時(shí)會(huì)被混淆,但這只是個(gè)名稱問題,沒有原則性關(guān)系。