轉(zhuǎn)自知乎
原文鏈接
Cache 是把最常用的工具放在手邊,Buffer 是你家的垃圾桶,你平時(shí)的垃圾先扔在垃圾桶里,等垃圾桶滿了再扔垃圾。
Cache 的存在原因是對資源調(diào)用的空間局部性,你現(xiàn)在在看一本數(shù)學(xué)書,那么極有可能你一會(huì)兒還要再去圖書館的數(shù)學(xué)書架上找同類型的書,所以你在圖書館找了一個(gè)離數(shù)學(xué)區(qū)很近的位置坐下,你微信和一些人聊天,聊的最多的那個(gè)往往在微信消息列表靠頂部的位置,因?yàn)榱牡淖疃?,很有可能你一?huì)還要和她聊,你上午訪問知乎,很有可能最近幾天你都要訪問,所以瀏覽器就把知乎網(wǎng)站的靜態(tài)資源先緩存下來,下次訪問無需再次下載,這是 Cache。
Buffer 的存在原因是生產(chǎn)者和消費(fèi)者對資源的生產(chǎn)/效率速率不一致。比如你看視頻,視頻控件會(huì)先預(yù)加載幾秒的視頻資源到緩沖區(qū),看視頻的你是資源消費(fèi)者,你消費(fèi)視頻的速率就是視頻資源按照其時(shí)間速率正常播放,但是你下載視頻的速率可能時(shí)快時(shí)慢。如果剛開始先預(yù)加載幾秒資源緩沖區(qū),就算有一兩秒網(wǎng)絡(luò)擁塞了,視頻還能順暢播放,如果網(wǎng)速給力,則會(huì)有更多的資源被下載進(jìn)來,這時(shí)資源會(huì)越積越多,這時(shí)可能緩沖區(qū)滿了,就暫時(shí)停止加載,等你的資源消費(fèi)的緩沖區(qū)空出一部分了,再繼續(xù)開始加載,這樣雖然視頻的下載速度是波動(dòng)的,但是你看的視頻是穩(wěn)定等速率播放的。當(dāng)你有資源要寫入硬盤時(shí),硬盤的最小寫入大小往往是一個(gè) block,一般是 4KB,但是你準(zhǔn)備寫入數(shù)據(jù)的時(shí)候,有可能是一大堆字符,所以這時(shí),你要把數(shù)據(jù)寫到內(nèi)存里,就要先準(zhǔn)備好 4KB 的數(shù)據(jù),然后寫 4KB,再準(zhǔn)備 4KB 數(shù)據(jù),而不是每次準(zhǔn)備好了一個(gè) byte 的數(shù)據(jù),就要寫到磁盤里,這時(shí),你是生產(chǎn)者,磁盤是消費(fèi)者,磁盤是每次 4KB 的速率消費(fèi)數(shù)據(jù),而你生產(chǎn)數(shù)據(jù)是字節(jié)流方式生產(chǎn),這時(shí)就需要一個(gè)緩沖區(qū),暫時(shí)存放那些還沒攢夠 4KB 的數(shù)據(jù)。網(wǎng)絡(luò)連接過程中,內(nèi)核中保持的 TCP 連接,因?yàn)榫W(wǎng)速和對面生產(chǎn)者的原因,可能會(huì)有大量數(shù)據(jù)寫入 TCP 的緩沖區(qū),一方面因?yàn)閿?shù)據(jù)可能seq對不上,需要等待,另一方面是因?yàn)閷?yīng)該 socket 的應(yīng)用程序并不一定能及時(shí)地把這些數(shù)據(jù)取走(消費(fèi))。