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

时间:2015-10-09 20:02:44

标签: c++ windows memory-mapped-files

真的找不到任何细节,以下是关于mmf在windows中的所有知识:

  1. 在Windows中创建内存映射文件不会增加程序使用的明显内存量
  2. 创建该文件的视图会占用与视图大小相当的内存
  3. 这看起来倒退了我,因为对于一个人,我知道mmf本身实际上有记忆......某处。如果我在mmf中写入内容并破坏视图,数据仍然存在。同时,为什么视图会占用任何内存?它只是一个指针,不是吗?

    然后是什么奇怪的事实在公羊和什么是在磁盘上。在具有分布式外观访问模式的大型mmf中,有时速度在那里,有时则没有。我猜其中一些有时会存储在文件中,如果有人将其与页面文件或页面文件绑在一起,但实际上,我没有任何线索。

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

3 个答案:

答案 0 :(得分:7)

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

在32位进程中,您无法获得单个2 GB的地址空间,因为没有其他任何空间。限制是代码和数据的其他分配之间地址空间中的最大漏洞,通常徘徊在大约650兆字节,给予或接受。您需要定位x64。或构建一个与/ LARGEADDRESSAWARE链接的x86程序,并在64位操作系统上运行。一个后门,这些日子变得毫无意义。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

  

无论如何,驱使我去调查的问题是我有一个~2gb的文件,我希望多个程序共享。我不能在每个视图中创建一个2gb的视图,因为我只是“内存不足”#34;所以我必须创建/销毁较小的那些。

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