0

有谁知道当您从 MMF 中提取时,本地 App 进程是否为共享内存中的内容创建自己的内存存储?还是直接引用内存?

我问这个问题是因为我正在考虑在 MMF 中使用 4gb 文件,如果它为使用该资源的每个应用程序(进程)拉下本地内存,我将查看大量 RAM。有任何想法吗?

4

2 回答 2

1

映射的内存不会被复制进去。它是按需加载的,也是按需卸载的。

只是映射它什么都不做。您只加载您访问的内容,并且操作系统可以在它认为这是正确的事情时卸载内存。

同一映射文件的内存也在进程之间共享。

于 2012-07-31T14:50:15.683 回答
1

基本上有两种内存映射。最常见的一种是您通过 获取的共享映射MemoryMappedFile.CreateFromFile(string)。共享映射通常使用 IO 缓存内存页面来保存文件内容,并将这些页面映射到访问映射文件相应部分的那些进程的虚拟地址空间中。它只消耗与文件常驻部分的总大小一样多的内存。并且由于存在此内容来自/去往的物理介质,因此操作系统可以在内存不足时释放此内存(通过在此之前将脏页写入磁盘)。

还有另一种映射类型,称为私有或 CoW(写时复制)映射。最初它的工作方式与共享映射非常相似,但是当任何进程写入其中的任何部分时,都会创建一个新的内存页面,该进程私有,并将原始页面的内容复制到其中(因此写入复制) . 这个新的内存页面是进程私有的,不是由原始文件备份,而是由系统页面文件备份。因此,私有映射会消耗额外的内存,并且一个进程所做的更改在其他进程中不可见。私有映射是使用with set to创建的。MemoryMappedFile.CreateFromFile(path, mode, map, capacity, access)accessSystem.IO.MemoryMappedFiles.MemoryMappedFileAccess.CopyOnWrite

于 2012-08-03T15:08:25.370 回答