有沒有人知道當你從MMF中取出時,本地App進程是否爲共享內存中的內容創建它自己的內存存儲?還是直接引用內存?.NET 4內存映射文件
我問這個問題,因爲我在考慮在MMF中使用4GB文件,並且如果它爲使用該資源的每個應用程序(進程)拉下本地內存,我將查看大量的RAM。有任何想法嗎?
有沒有人知道當你從MMF中取出時,本地App進程是否爲共享內存中的內容創建它自己的內存存儲?還是直接引用內存?.NET 4內存映射文件
我問這個問題,因爲我在考慮在MMF中使用4GB文件,並且如果它爲使用該資源的每個應用程序(進程)拉下本地內存,我將查看大量的RAM。有任何想法嗎?
基本上有兩種存儲器映射。最常見的是您通過MemoryMappedFile.CreateFromFile(string)
獲得的共享映射。共享映射通常使用IO高速緩存內存頁面來保存文件內容,並將這些頁面映射到訪問映射文件相應部分的進程的虛擬地址空間中。它只消耗與文件駐留部分的總大小相同的內存。由於有內容來自/去往的物理介質,操作系統可以在內存不足的情況下釋放此內存(通過在此之前將髒頁寫入磁盤)。
還有另一種映射類型,稱爲專用或CoW(寫時複製)映射。最初它的工作原理與共享映射非常相似,但是當任何進程寫入其任何部分時,將創建一個專用於此進程的新內存頁面,並將原始頁面的內容複製到其中(因此,複製寫入)。這個新的內存頁面對進程是私有的,並且不是由原始文件而是由系統頁面文件進行備份。所以私有映射消耗額外的內存,一個進程所做的更改在其他進程中不可見。私有映射使用MemoryMappedFile.CreateFromFile(path, mode, map, capacity, access)
創建,access
設置爲System.IO.MemoryMappedFiles.MemoryMappedFileAccess.CopyOnWrite
。
映射的內存不會被複制進來。它被加載並且需求被卸載。
只是映射它什麼都不做。您只需加載您訪問的內容,並且操作系統可以在確定這是正確的操作時卸載內存。
進程之間共享同一映射文件的內存。
內存映射對象上的任何輸入? – M4V3R1CK 2012-07-31 14:57:00
怎麼樣?如果這是一個不同的問題,你最好問問一個新問題。 – usr 2012-07-31 15:23:34