【发布时间】:2012-07-31 14:46:31
【问题描述】:
是否有人确定当您从 MMF 中提取时,本地 App 进程是否会为共享内存中的内容创建自己的内存存储?还是直接引用内存?
我问这个问题是因为我正在考虑在 MMF 中使用 4gb 文件,如果它为使用该资源的每个应用程序(进程)拉低本地内存,我将查看大量 RAM。有什么想法吗?
【问题讨论】:
标签: .net c#-4.0 shared-memory
是否有人确定当您从 MMF 中提取时,本地 App 进程是否会为共享内存中的内容创建自己的内存存储?还是直接引用内存?
我问这个问题是因为我正在考虑在 MMF 中使用 4gb 文件,如果它为使用该资源的每个应用程序(进程)拉低本地内存,我将查看大量 RAM。有什么想法吗?
【问题讨论】:
标签: .net c#-4.0 shared-memory
基本上有两种内存映射。最常见的是您通过MemoryMappedFile.CreateFromFile(string) 获得的共享映射。共享映射通常使用 IO 缓存内存页面来保存文件内容,并将这些页面映射到访问映射文件相应部分的那些进程的虚拟地址空间中。它只消耗与文件常驻部分的总大小一样多的内存。并且由于此内容来自/去往的物理介质是,操作系统可以在内存不足时释放此内存(通过在此之前将脏页写入磁盘)。
还有另一种映射类型,称为私有或 CoW(写入时复制)映射。最初它的工作方式与共享映射非常相似,但是当任何进程写入它的任何部分时,都会创建一个新的内存页面,该进程私有,并将原始页面的内容复制到其中(因此 copy 上 写)。这个新的内存页面是进程私有的,不是由原始文件备份,而是由系统页面文件备份。因此私有映射会消耗额外的内存,并且一个进程所做的更改在其他进程中不可见。私有映射是使用 MemoryMappedFile.CreateFromFile(path, mode, map, capacity, access) 创建的,access 设置为 System.IO.MemoryMappedFiles.MemoryMappedFileAccess.CopyOnWrite。
【讨论】:
映射的内存不会被复制进去。它是按需加载的,也是按需卸载的。
只是映射它什么都不做。您只加载您访问的内容,并且操作系统可以在它认为这是正确的事情时卸载内存。
同一映射文件的内存也在进程之间共享。
【讨论】: