2014-05-11 96 views
4

我一直在閱讀有關memory mapped files,它允許跨多個進程共享文件。內存映射文件被裝入用戶態地址空間或進程內核地址空間?

每個進程(32位是特異性的)具有專用地址空間4GB其通過Eric Lippert分爲2GB的用戶模式地址空間2GB保留用於內核如上所述here。用戶模式地址空間對每個進程是私有的,不能被其他進程修改。

那麼,這是否意味着MMF被映射到內核模式地址空間,因爲它在所有進程之間共享?

我已經搜索了很多關於MMF的地方,但它找不到任何資源說明。所以,在這裏發佈問題,如果我的假設是正確的,或者我在這裏錯過了什麼?任何資源到MSDN也會很好。

+0

這是比這更復雜一些。其他進程不能直接訪問地址空間的任何部分。然而,你可以明確地將你的地址空間的一部分與其他進程共享,並且給予正確的進程權限,一個外部進程*可以*訪問你的進程的內存(這基本上就是調試器所做的)例如 – jalf

+0

@jalf - 私人我的意思是,一個地址空間的用戶模式不能被其他進程寫入。 –

+0

當進程寫入指針時,這是一個虛擬指針。操作系統決定它寫入的實際內存。如果您已經指示操作系統兩個不同進程中的兩個不同虛擬指針發生映射到同一個後備存儲,則一個進程可以寫入內存,而另一個進程可以看到該更改。 –

回答

3

內存映射文件映射到用戶模式地址空間。

想想這樣。假設你有一個4K內存映射到兩個進程的文件。這僅僅意味着磁盤上的一個存儲頁面與兩個進程中的每一個進程中的特定頁面的虛擬地址空間相關聯。此頁面上

圖3可以幫助:

http://msdn.microsoft.com/en-us/library/ms810613.aspx

+0

謝謝埃裏克。圖3對我來說很重要。 「可執行映像」和「系統頁面文件」是區分代碼和MMF的區別。 –

+0

雖然我有一個查詢。如果MMF也映射到用戶模式地址空間。所以文件大小將在計算最大進程數2GB時計算。如果我錯了,請糾正。如果我在LOH上連續分配16MB內存,應用程序在一段時間後會與OOM崩潰,但如果我在MMF中分配內存,應用程序不會與OOM崩潰。 (我堅持MMF文件,即不調用處理它,使它不會GC'ed)。第二種情況也應該是OOM失敗了。在這種理解中,它不是我錯了嗎? –

+0

@RohitVats:您不必將*整個*文件映射到地址空間;如果你真的想要,你可以一次把它映射到4K。 –

3

進程無法訪問內核地址空間。對於一個進程來說,上面的2GB僅僅因爲一個未知的原因而無法訪問。

內存映射進入地址空間的用戶模式部分。

感謝虛擬內存硬件,物理頁面可以出現在多個進程中。

私有內存不共享,儘管它全部位於用戶模式地址範圍內。內存映射被內核專門處理。它會指示硬件將物理頁面提供給多個進程。專用內存實際上是一種特殊情況,即頁面恰好映射到一個進程中。硬件不關心。實際上,如果需要,可以將同一頁面多次映射到同一個進程中。

+0

如果確實所有內存映射都進入用戶模式地址空間。然後,所有的內存映射都應該在多個進程間共享。爲什麼只有MMF?我可能錯了,所以想正確理解。 –

+0

私有內存不共享,儘管它全部位於用戶模式地址範圍內。內存映射由內核專門處理。它會指示硬件將物理頁面提供給多個進程。專用內存實際上是一種特殊情況,即頁面恰好映射到一個進程中。硬件不關心。實際上,如果需要,可以將同一頁面多次映射到同一個進程中。 – usr

+0

@RohitVats:假設兩個進程都加載foo.dll。考慮包含運行在兩個不同進程中的代碼的foo.dll的4K頁面。代碼頁被映射到兩個不同的進程;對於使用DLL的每個進程,它都不會加載到內存中!可能有數百個這樣的過程! –

相關問題