【问题标题】:Memory mapped file gets loaded in user mode address space or kernel address space of process?内存映射文件在进程的用户模式地址空间或内核地址空间中加载?
【发布时间】:2014-06-28 22:51:59
【问题描述】:

我一直在阅读有关 memory mapped files 的信息,它允许文件在多个进程之间共享。

每个进程(具体为 32 位)都有 4GB 的私有地址空间,如所述 @ 987654322@Eric Lippert。用户态地址空间是每个进程私有的,不能被其他进程修改。

那么,这是否意味着 MMF 被映射到内核模式地址空间,因为它在所有进程之间共享?

我已经搜索了很多关于 MMF 的映射位置,但找不到任何说明这一点的资源。那么,如果我的假设是正确的或者我在这里遗漏了什么,请在这里发布问题? MSDN 的任何资源都很好。

【问题讨论】:

  • 比这要复杂一些。其他进程无法直接访问地址空间的任何部分。但是,您可以与其他进程显式共享部分地址空间,并且在获得正确的进程权限的情况下,外部进程可以访问您的进程的内存(例如,调试器基本上就是这样做的)
  • @jalf - 我的意思是私有的,一个地址空间的用户模式不能被其他进程写入。
  • 当一个进程写入一个指针时,它是一个虚拟指针。操作系统决定它写入的实际内存。如果您已指示操作系统,两个不同进程中的两个不同虚拟指针碰巧都映射到同一个后备存储,那么一个进程可以写入内存,而另一个进程可以看到这种变化。
  • 这样想:你相信一个进程可以写一个文件,另一个进程可以读那个文件,并且一个进程的写对另一个进程可见吗? 内存就是磁盘文件,所以你认为可以使用文件的任何事情,你应该相信也可以使用内存。

标签: c# .net memory-management memory-mapped-files


【解决方案1】:

进程无权访问内核地址空间。对于一个进程来说,上面的 2GB 只是由于未知的原因而无法访问。

内存映射进入地址空间的用户模式部分。

借助虚拟内存硬件,物理页面可以存在于多个进程中。

私有内存不是共享的,尽管它全部位于用户模式地址范围内。内存映射由内核特别处理。它指示硬件使物理页面可用于多个进程。私有内存实际上是一种特殊情况,其中页面恰好被映射到一个进程中。硬件不在乎。事实上,如果你愿意,你可以将同一个页面多次映射到同一个进程中。

【讨论】:

  • 如果所有内存映射都进入用户模式地址空间是真的。然后,所有内存映射都应该在多个进程之间共享。为什么只有 MMF?我可能错了,所以想正确理解。
  • 私有内存不是共享的,尽管它全部位于用户模式地址范围内。内存映射由内核专门处理。它指示硬件使物理页面可用于多个进程。私有内存实际上是一种特殊情况,其中页面恰好被映射到一个进程中。硬件不在乎。事实上,如果你愿意,你可以将同一个页面多次映射到同一个进程中。
  • @RohitVats:假设两个进程都加载 foo.dll。考虑一个 4K 的 foo.dll 页面,其中包含在两个不同进程中运行的代码。代码页映射到两个不同的进程;对于使用 DLL 的每个进程,它不会一次加载到内存中!可能有数百个这样的过程!
  • @usr - 为你 +1。你也是对的。但我正在寻找区分私人代码和 Eric 在他的回答中提供的 MMF 的实际原因。谢谢你的帮助伙伴。 :)
  • 页面文件与此无关,与文章所暗示的相反。您可以禁用页面文件,一切仍然有效。如果页面文件是必不可少的,它怎么还能工作?顺便说一句,您还可以在进程之间共享基于非文件的内存映射。
【解决方案2】:

内存映射文件被映射到用户模式地址空间。

这样想。假设您有一个内存映射到两个进程的 4K 文件。这仅仅意味着磁盘上的一个存储页面与两个进程中的每个进程中的虚拟地址空间的特定页面相关联。

此页面上的图 3 可能会有所帮助:

http://msdn.microsoft.com/en-us/library/ms810613.aspx

【讨论】:

  • 谢谢埃里克。图 3 让我明白了很多。 Executable ImageSystem page file 是代码和 MMF 的区别。
  • 我有一个查询。如果 MMF 也映射到用户模式地址空间。因此,文件大小将计入 2GB 最大进程限制的计算。如果我错了,请纠正。如果我在 LOH 上连续分配 16MB 的内存,应用程序会在一段时间后因 OOM 而崩溃,但如果我在 MMF 中分配内存,应用程序不会因 OOM 而崩溃。 (我保留 MMF 文件,即不调用 dispose 以便它不会被 GC 处理)。 OOM 的第二种情况也应该失败。这种理解是不是我错了?
  • @RohitVats:您不必将整个文件映射到地址空间;如果你真的想要,你可以一次将其映射为 4K。
猜你喜欢
  • 2016-05-05
  • 1970-01-01
  • 2011-06-30
  • 2017-11-18
  • 1970-01-01
  • 2017-05-18
  • 2018-01-16
  • 1970-01-01
  • 2023-03-03
相关资源
最近更新 更多