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