内存映射文件和实际内存使用情况如何?

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

真的找不到任何关于这个的细节,这是我在 windows:

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

这对我来说看起来很倒退,因为一方面,我知道 mmf 本身实际上有记忆……在某处。如果我在 mmf 中写一些东西并破坏视图,数据仍然存在。同时,为什么视图会占用任何内存?它只是一个指针,不是吗?

然后是 ram 中的实际内容和磁盘中的内容的奇怪之处。在具有分布式访问模式的大型 mmf 中,有时速度很快,有时则不然。我猜其中的一些有时会存储在文件中,如果一个与它或分页文件相关联,但实际上,我不知道。

无论如何,促使我对此进行调查的问题是我有一个 ~2gb 文件,我希望多个程序共享该文件。我无法在每个视图中创建一个 2gb 的视图,因为我只是 "out of memory",所以我必须 create/destroy 更小的视图。由于额外的偏移量计算和视图本身的创建,这会产生大量开销。谁能向我解释为什么会这样?

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

Anyways, the problem that drove me to investigate this is that I have a ~2gb file that I want multiple programs to share. I can't create a 2gb view in each of them since I'm just "out of memory" so I have to create/destroy smaller ones.

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

在像Windows这样的请求分页虚拟内存操作系统上,MMF 的视图占用地址space。只是处理器的编号,每个 4096 字节一个。在实际使用视图之前,您才开始使用 RAM。读取或写入数据。此时您触发页面错误并强制 OS 将虚拟内存页面映射到物理内存。 "demand-paged" 部分。

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