- 相關(guān)推薦
linux中pagbuffer和cache的區(qū)別
Page cache和buffer cache一直以來(lái)是兩個(gè)比較容易混淆的概念,在網(wǎng)上也有很多人在爭(zhēng)辯和猜想這兩個(gè)cache到底有什么區(qū)別,討論到最后也一直沒(méi)有一個(gè)統(tǒng)一和正確的結(jié)論,在我工作的這一段時(shí)間,page cache和buffer cache的概念曾經(jīng)困擾過(guò)我,但是仔細(xì)分析一下,這兩個(gè)概念實(shí)際上非常的清晰。如果能夠了解到這兩個(gè)cache的本質(zhì),那么我們?cè)诜治鰅o問(wèn)題的時(shí)候可能會(huì)更加得心應(yīng)手。
Page cache實(shí)際上是針對(duì)文件系統(tǒng)的,是文件的緩存,在文件層面上的數(shù)據(jù)會(huì)緩存到page cache。文件的邏輯層需要映射到實(shí)際的物理磁盤,這種映射關(guān)系由文件系統(tǒng)來(lái)完成。當(dāng)page cache的數(shù)據(jù)需要刷新時(shí),page cache中的數(shù)據(jù)交給buffer cache,但是這種處理在2.6版本的內(nèi)核之后就變的很簡(jiǎn)單了,沒(méi)有真正意義上的cache操作。
Buffer cache是針對(duì)磁盤塊的緩存,也就是在沒(méi)有文件系統(tǒng)的情況下,直接對(duì)磁盤進(jìn)行操作的數(shù)據(jù)會(huì)緩存到buffer cache中,例如,文件系統(tǒng)的元數(shù)據(jù)都會(huì)緩存到buffer cache中。
簡(jiǎn)單說(shuō)來(lái),page cache用來(lái)緩存文件數(shù)據(jù),buffer cache用來(lái)緩存磁盤數(shù)據(jù)。在有文件系統(tǒng)的情況下,對(duì)文件操作,那么數(shù)據(jù)會(huì)緩存到page cache,如果直接采用dd等工具對(duì)磁盤進(jìn)行讀寫,那么數(shù)據(jù)會(huì)緩存到buffer cache。
補(bǔ)充一點(diǎn),在文件系統(tǒng)層每個(gè)設(shè)備都會(huì)分配一個(gè)def_blk_ops的文件操作方法,這是設(shè)備的操作方法,在每個(gè)設(shè)備的inode下面會(huì)存在一個(gè)radix tree,這個(gè)radix tree下面將會(huì)放置緩存數(shù)據(jù)的page頁(yè)。這個(gè)page的數(shù)量將會(huì)在top程序的buffer一欄中顯示。如果設(shè)備做了文件系統(tǒng),那么會(huì)生成一個(gè)inode,這個(gè)inode會(huì)分配ext3_ops之類的操作方法,這些方法是文件系統(tǒng)的方法,在這個(gè)inode下面同樣存在一個(gè)radix tree,這里會(huì)緩存文件的page頁(yè),緩存頁(yè)的數(shù)量在top程序的cache一欄進(jìn)行統(tǒng)計(jì)。從上面的分析可以看出,2.6內(nèi)核中的buffer cache和page cache在處理上是保持一致的,但是存在概念上的差別,page cache針對(duì)文件的cache,buffer是針對(duì)磁盤塊數(shù)據(jù)的cache,僅此而已。
buffer 與cache 的區(qū)別
A buffer is something that has yet to be “written” to disk. A cache is something that has been “read” from the disk and stored for later use.
更詳細(xì)的解釋參考:Difference Between Buffer and Cache
對(duì)于共享內(nèi)存(Shared memory),主要用于在UNIX 環(huán)境下不同進(jìn)程之間共享數(shù)據(jù),是進(jìn)程間通信的一種方法,一般的應(yīng)用程序不會(huì)申請(qǐng)使用共享內(nèi)存,筆者也沒(méi)有去驗(yàn)證共享內(nèi)存對(duì)上面等式的影響。如果你有興趣,請(qǐng)參考:What is Shared Memory?
cache 和 buffer的區(qū)別:
Cache:高速緩存,是位于CPU與主內(nèi)存間的一種容量較小但速度很高的存儲(chǔ)器。由于CPU的速度遠(yuǎn)高于主內(nèi)存,CPU直接從內(nèi)存中存取數(shù)據(jù)要等待一定時(shí)間周期,Cache中保存著CPU剛用過(guò)或循環(huán)使用的一部分?jǐn)?shù)據(jù),當(dāng)CPU再次使用該部分?jǐn)?shù)據(jù)時(shí)可從Cache中直接調(diào)用,這樣就減少了CPU的等待時(shí)間,提高了系統(tǒng)的效率。Cache又分為一級(jí)Cache(L1 Cache)和二級(jí)Cache(L2 Cache),L1 Cache集成在CPU內(nèi)部,L2 Cache早期一般是焊在主板上,現(xiàn)在也都集成在CPU內(nèi)部,常見(jiàn)的容量有256KB或512KB L2 Cache.
Buffer:緩沖區(qū),一個(gè)用于存儲(chǔ)速度不同步的設(shè)備或優(yōu)先級(jí)不同的設(shè)備之間傳輸數(shù)據(jù)的區(qū)域。通過(guò)緩沖區(qū),可以使進(jìn)程之間的相互等待變少,從而使從速度慢的設(shè)備讀入數(shù)據(jù)時(shí),速度快的設(shè)備的操作進(jìn)程不發(fā)生間斷。
Free中的buffer和cache:(它們都是占用內(nèi)存):
buffer :作為buffer cache的內(nèi)存,是塊設(shè)備的讀寫緩沖區(qū)
cache:作為page cache的內(nèi)存, 文件系統(tǒng)的cache
如果 cache 的值很大,說(shuō)明cache住的文件數(shù)很多。如果頻繁訪問(wèn)到的文件都能被cache住,那么磁盤的讀IO 必會(huì)非常小。
【linux中pagbuffer和cache的區(qū)別】相關(guān)文章:
Unix和Linux有什么區(qū)別11-17
關(guān)于Linux系統(tǒng)命令中exit與exit的區(qū)別03-07
Linux和windows操作系統(tǒng)有哪些區(qū)別11-09
Java中hashmap和hashtable的區(qū)別03-30
php中的daddslashes()和saddslashes()的區(qū)別03-31
java中String和StringBuffer的區(qū)別03-18
java中i++和++i的區(qū)別04-02