Page cache和Buffer cache[转1]
http://www.cnblogs.com/mydomain/archive/2013/02/24/2924707.html
Page cache實(shí)際上是針對文件系統(tǒng)的,是文件的緩存,在文件層面上的數(shù)據(jù)會緩存到page cache。文件的邏輯層需要映射到實(shí)際的物理磁盤,這種映射關(guān)系由文件系統(tǒng)來完成。當(dāng)page cache的數(shù)據(jù)需要刷新時(shí),page cache中的數(shù)據(jù)交給buffer cache,但是這種處理在2.6版本的內(nèi)核之后就變的很簡單了,沒有真正意義上的cache操作。
在Linux 2.6的內(nèi)核中Page cache和Buffer cache進(jìn)一步結(jié)合,Buffer pages其實(shí)也是Page cache里面的頁。從Linux算法實(shí)現(xiàn)的角度,Page cache和Buffer cache目前是一樣的,只是多了一層抽象,通過buffer_head來進(jìn)行一些訪問管理。可以理解為只有Page cache概念亦可。在Linux 2.6的內(nèi)核中Page cache和Buffer cache進(jìn)一步結(jié)合,Buffer pages其實(shí)也是Page cache里面的頁。從Linux算法實(shí)現(xiàn)的角度,Page cache和Buffer cache目前是一樣的,只是多了一層抽象,通過buffer_head來進(jìn)行一些訪問管理。可以理解為只有Page cache概念亦可。
標(biāo)準(zhǔn)IO:
在?Linux?中,這種訪問文件的方式是通過兩個(gè)系統(tǒng)調(diào)用實(shí)現(xiàn)的:read()?和?write()。當(dāng)應(yīng)用程序調(diào)用?read()?系統(tǒng)調(diào)用讀取一塊數(shù)據(jù)的時(shí)候,如果該塊數(shù)據(jù)已經(jīng)在內(nèi)存中了,那么就直接從內(nèi)存中讀出該數(shù)據(jù)并返回給應(yīng)用程序;如果該塊數(shù)據(jù)不在內(nèi)存中,那么數(shù)據(jù)會被從磁盤上讀到頁高緩存中去,然后再從頁緩存中拷貝到用戶地址空間中去。如果一個(gè)進(jìn)程讀取某個(gè)文件,那么其他進(jìn)程就都不可以讀取或者更改該文件;對于寫數(shù)據(jù)操作來說,當(dāng)一個(gè)進(jìn)程調(diào)用了?write()?系統(tǒng)調(diào)用往某個(gè)文件中寫數(shù)據(jù)的時(shí)候,數(shù)據(jù)會先從用戶地址空間拷貝到操作系統(tǒng)內(nèi)核地址空間的頁緩存中去,然后才被寫到磁盤上。但是對于這種標(biāo)準(zhǔn)的訪問文件的方式來說,在數(shù)據(jù)被寫到頁緩存中的時(shí)候,write()?系統(tǒng)調(diào)用就算執(zhí)行完成,并不會等數(shù)據(jù)完全寫入到磁盤上。Linux?在這里采用的是我們前邊提到的延遲寫機(jī)制(?deferred writes?)。如果用戶采用的是延遲寫機(jī)制(?deferred writes?),那么應(yīng)用程序就完全不需要等到數(shù)據(jù)全部被寫回到磁盤,數(shù)據(jù)只要被寫到頁緩存中去就可以了。在延遲寫機(jī)制的情況下,操作系統(tǒng)會定期地將放在頁緩存中的數(shù)據(jù)刷到磁盤上。
直接IO:
凡是通過直接?I/O?方式進(jìn)行數(shù)據(jù)傳輸,數(shù)據(jù)均直接在用戶地址空間的緩沖區(qū)和磁盤之間直接進(jìn)行傳輸,完全不需要頁緩存的支持。操作系統(tǒng)層提供的緩存往往會使應(yīng)用程序在讀寫數(shù)據(jù)的時(shí)候獲得更好的性能,但是對于某些特殊的應(yīng)用程序,比如說數(shù)據(jù)庫管理系統(tǒng)這類應(yīng)用,他們更傾向于選擇他們自己的緩存機(jī)制,因?yàn)閿?shù)據(jù)庫管理系統(tǒng)往往比操作系統(tǒng)更了解數(shù)據(jù)庫中存放的數(shù)據(jù),數(shù)據(jù)庫管理系統(tǒng)可以提供一種更加有效的緩存機(jī)制來提高數(shù)據(jù)庫中數(shù)據(jù)的存取性能。
簡單說來,page cache用來緩存文件數(shù)據(jù),buffer cache用來緩存磁盤數(shù)據(jù)。在有文件系統(tǒng)的情況下,對文件操作,那么數(shù)據(jù)會緩存到page cache,如果直接采用dd等工具對磁盤進(jìn)行讀寫,那么數(shù)據(jù)會緩存到buffer cache。
補(bǔ)充一點(diǎn),在文件系統(tǒng)層每個(gè)設(shè)備都會分配一個(gè)def_blk_ops的文件操作方法,這是設(shè)備的操作方法,在每個(gè)設(shè)備的inode下面會存在一個(gè)radix tree,這個(gè)radix tree下面將會放置緩存數(shù)據(jù)的page頁。這個(gè)page的數(shù)量將會在top程序的buffer一欄中顯示。如果設(shè)備做了文件系統(tǒng),那么會生成一個(gè)inode,這個(gè)inode會分配ext3_ops之類的操作方法,這些方法是文件系統(tǒng)的方法,在這個(gè)inode下面同樣存在一個(gè)radix tree,這里會緩存文件的page頁,緩存頁的數(shù)量在top程序的cache一欄進(jìn)行統(tǒng)計(jì)。從上面的分析可以看出,2.6內(nèi)核中的buffer cache和page cache在處理上是保持一致的,但是存在概念上的差別,page cache針對文件的cache,buffer是針對磁盤塊數(shù)據(jù)的cache,僅此而已。
"如果一個(gè)進(jìn)程讀取某個(gè)文件,那么其他進(jìn)程就都不可以讀取或者更改該文件;"?對這一句話存在質(zhì)疑。
原文
http://blog.chinaunix.net/uid-1829236-id-3152172.html
轉(zhuǎn)載于:https://www.cnblogs.com/anruy/p/5009295.html
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的Page cache和Buffer cache[转1]的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CentOS快捷键总结
- 下一篇: 深入了解webservice_概念总结