内存映射文件和实际内存使用是怎么回事?

What is up with memory mapped files and actual memory usage?

本文关键字:内存 怎么回事 映射 文件      更新时间:2023-10-16

我真的找不到任何关于这方面的细节,这里是我所知道的关于windows中的mmf的所有信息:

  1. 在windows中创建内存映射文件不会增加程序使用的表观内存量
  2. 创建该文件的视图所消耗的内存相当于视图大小

对我来说这看起来相当向后,因为首先,我知道mmf本身实际上在某处有内存。如果我在mmf中写入内容并销毁视图,数据仍然在那里。同时,为什么视图要占用内存呢?它只是一个指针,不是吗?

然后就奇怪了,ram里的东西和磁盘上的东西。在具有分布式访问模式的大型mmf中,有时速度是有的,有时不是。我猜,如果有一个绑定到它或分页文件,其中一些有时会存储在文件中,但实际上,我不知道。

无论如何,驱使我调查这个问题是,我有一个~2gb的文件,我想要多个程序共享。我不能在每个视图中创建2gb的视图,因为我只是"内存不足",所以我必须创建/销毁较小的视图。由于额外的偏移量计算和视图本身的创建,这会产生很多开销。有人能给我解释一下为什么会这样吗?

在像Windows这样的按需分页虚拟内存操作系统上,MMF的视图占用地址空间。只是给处理器的数字,每4096字节一个。只有在实际使用视图时才开始使用RAM。读取或写入数据。此时将触发一个页面错误,并迫使操作系统将虚拟内存页映射到物理内存。"需求页"部分

你不能在32位进程中获得一个2 GB的地址空间块,因为没有空间容纳其他任何东西。该限制是地址空间中其他代码和数据分配之间的最大漏洞,通常徘徊在~650兆字节左右。您需要以x64为目标。或者构建一个与/LARGEADDRESSAWARE链接并在64位操作系统上运行的x86程序。这个后门现在已经变得毫无意义了

内存映射文件中的事情是它允许您在没有I/O调用的情况下操作其数据。由于这种行为,当您访问该文件时,windows将其加载到物理内存中,因此可以在物理内存中而不是在磁盘上操作它。您可以在这里阅读更多信息:http://blogs.msdn.com/b/khen1234/archive/2006/01/30/519483.aspx

无论如何,驱使我调查这个问题是,我有一个~2gb的文件,我想要多个程序共享。我不能在每个视图中创建2gb的视图,因为我只是"内存不足",所以我必须创建/销毁较小的视图。

最可能的原因是程序是32位的。32位程序(默认情况下)只有2GB的地址空间,因此您不能在单个视图中映射2GB的文件。如果在64位模式下重新构建它们,问题就会消失。