有没有人知道,当你从MMF中提取数据时,本地应用程序进程是否会为共享内存中的内容创建自己的内存存储空间?或者它直接引用内存?
我问这个问题是因为我正在考虑在MMF中使用一个4 4gb的文件,如果它为使用该资源的每个应用程序(进程)拉下本地内存,我将查看大量的RAM。有什么想法吗?
发布于 2012-08-03 23:08:25
基本上有两种内存映射。最常见的是通过MemoryMappedFile.CreateFromFile(string)获得的共享映射。共享映射通常使用IO缓存内存页面来保存文件内容,并将这些页面映射到那些访问映射文件的相应部分的进程的虚拟地址空间中。它消耗的内存仅相当于文件驻留部分的总大小。由于这些内容的来源/去向都有物理介质,因此只要内存不足,操作系统就可以释放该内存(通过在此之前将脏页写入磁盘)。
还有另一种映射类型,称为私有或CoW (写入时复制)映射。最初,它的工作原理非常类似于共享映射,但是当任何进程写入它的任何部分时,都会创建一个新的内存页,该内存页是该进程的私有页,并且将原始页的内容复制到其中(因此是写入时复制)。这个新的内存页是进程专用的,不是由原始文件备份的,而是由系统页文件备份的。因此,私有映射会消耗额外的内存,并且一个进程所做的更改在其他进程中不可见。私有映射是使用MemoryMappedFile.CreateFromFile(path, mode, map, capacity, access)创建的,并将access设置为System.IO.MemoryMappedFiles.MemoryMappedFileAccess.CopyOnWrite。
发布于 2012-07-31 22:50:16
映射内存不会被复制进去。它是按需加载的,也是按需卸载的。
只是映射它什么也做不了。您只需加载您访问的内容,只要操作系统认为这是正确的操作,它就可以卸载内存。
同样,同一映射文件的内存也在进程之间共享。
https://stackoverflow.com/questions/11742771
复制相似问题