2012-04-20 100 views
0

我試着去了解MMAP,得到了以下鏈接閱讀:
http://duartes.org/gustavo/blog/post/page-cache-the-affair-between-memory-and-files理解文件映射

我理解一般的文本,並將其對我來說很有意義。但最後是一段,我不明白或不符合我的理解。

上面顯示的只讀頁表條目並不意味着映射是隻讀的,它們僅僅是共享物理內存直到最後一刻的內核技巧。你可以看到'私人'是否有點用詞不當,除非你記得它只適用於更新。這種設計的結果是,只要從只讀取了頁面,其他程序就可以私下映射文件的虛擬頁面可以看到文件所做的更改。一旦寫入完成,其他人的更改將不再顯示。內核無法保證這種行爲,但這是您在x86中獲得的,並且從API的角度來看是有意義的。相比之下,共享映射簡單地映射到頁面緩存上,就是這樣。其他進程可以看到更新並最終進入磁盤。最後,如果上面的映射是隻讀的,頁面錯誤將觸發分段錯誤,而不是寫入時複製。

下面的行與我不符。我沒有意識到。

這種設計的結果是映射文件的虛擬頁面私下認爲只要頁面只被從讀取其他程序做文件變化。

它是私人的。所以無法看到其他人的更改!

最後,如果上面的映射是隻讀的,頁面錯誤將觸發分段錯誤而不是寫入時複製。

不知道作者的意思是什麼。他們是否是「MAP_READ_ONLY」的標誌?在寫入發生之前,從程序虛擬頁面到頁面緩存中的頁面表項的每個指針是只讀

你能幫我理解這兩行嗎? 感謝

更新
看來它得到它,與一些幫助。

這種設計的結果是映射文件的虛擬頁面私下認爲只要在頁面僅被讀取其他程序做的文件更改。

儘管映射是私有的,但虛擬頁面確實可以看到其他人的更改,直到它修改自己的頁面爲止。修改爲是私人的,並且只對寫入程序的虛擬頁面可見。

最後,如果上面的映射是隻讀的,頁面錯誤將觸發分段錯誤而不是寫入時複製。

我被告知,頁面本身也可以有權限(讀/寫/執行)。

告訴我,如果我錯了。

回答

1

這個片段:

這種設計的結果是映射文件的虛擬頁面私下看到了由其他程序完成對文件的更改只要頁面只被從讀取。

告訴你,內核在優化的名字中有點作弊。儘管你已經要求一個私有映射,但內核實際上會給你一個共享映射。那麼,如果你寫這個頁面,它就變成了私人的。

如果所有正在訪問該文件的進程都在使用MAP_PRIVATE,那麼觀察到這種「作弊」並不重要(沒有任何區別),因爲在這種情況下不會發生文件實際更改。根據每個進程首次寫入文件的不同時間,不同時間的不同進程映射將從「假作弊MAP_PRIVATE」升級到真正的「MAP_PRIVATE」。這可能是一種常見的情況。只有通過其他方式(MAP_SHAREDPROT_WRITE或其他常規,非mmap I/O操作)同時更新文件時,纔會產生影響。

我被告知頁面本身也可以有權限(讀/寫/執行)。當然

,他們可以。你要問你想要當您最初映射文件,實際上權限:第三個參數mmap,這將是PROT_READPROT_WRITEPROT_EXECPROT_NONE的組合。

+0

謝謝!得到它了。 – Peter 2012-04-21 15:09:14