.NET 4内存映射文件

时间:2012-07-31 14:46:32

标签: .net c#-4.0 shared-memory

有没有人确切知道当你从MMF拉出来的时候,本地App进程是否为共享内存中的内容创建了自己的内存存储?还是直接引用内存?

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

2 个答案:

答案 0 :(得分:1)

不会复制映射内存。它是需求加载的,也需要卸载。

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

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

答案 1 :(得分:1)

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

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