2014-05-11 100 views
4

我一直在阅读有关memory mapped files,它允许跨多个进程共享文件。内存映射文件被装入用户态地址空间或进程内核地址空间?

每个进程(32位是特异性的)具有专用地址空间4GB其通过Eric Lippert分为2GB的用户模式地址空间2GB保留用于内核如上所述here。用户模式地址空间对每个进程是私有的,不能被其他进程修改。

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

我已经搜索了很多关于MMF的地方,但它找不到任何资源说明。所以,在这里发布问题,如果我的假设是正确的,或者我在这里错过了什么?任何资源到MSDN也会很好。

+0

这是比这更复杂一些。其他进程不能直接访问地址空间的任何部分。然而,你可以明确地将你的地址空间的一部分与其他进程共享,并且给予正确的进程权限,一个外部进程*可以*访问你的进程的内存(这基本上就是调试器所做的)例如 – jalf

+0

@jalf - 私人我的意思是,一个地址空间的用户模式不能被其他进程写入。 –

+0

当进程写入指针时,这是一个虚拟指针。操作系统决定它写入的实际内存。如果您已经指示操作系统两个不同进程中的两个不同虚拟指针发生映射到同一个后备存储,则一个进程可以写入内存,而另一个进程可以看到该更改。 –

回答

3

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

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

图3可以帮助:

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

+0

谢谢埃里克。图3对我来说很重要。 “可执行映像”和“系统页面文件”是区分代码和MMF的区别。 –

+0

虽然我有一个查询。如果MMF也映射到用户模式地址空间。所以文件大小将在计算最大进程数2GB时计算。如果我错了,请纠正。如果我在LOH上连续分配16MB内存,应用程序在一段时间后会与OOM崩溃,但如果我在MMF中分配内存,应用程序不会与OOM崩溃。 (我坚持MMF文件,即不调用处理它,使它不会GC'ed)。第二种情况也应该是OOM失败了。在这种理解中,它不是我错了吗? –

+0

@RohitVats:您不必将*整个*文件映射到地址空间;如果你真的想要,你可以一次把它映射到4K。 –

3

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

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

感谢虚拟内存硬件,物理页面可以出现在多个进程中。

私有内存不共享,尽管它全部位于用户模式地址范围内。内存映射被内核专门处理。它会指示硬件将物理页面提供给多个进程。专用内存实际上是一种特殊情况,即页面恰好映射到一个进程中。硬件不关心。实际上,如果需要,可以将同一页面多次映射到同一个进程中。

+0

如果确实所有内存映射都进入用户模式地址空间。然后,所有的内存映射都应该在多个进程间共享。为什么只有MMF?我可能错了,所以想正确理解。 –

+0

私有内存不共享,尽管它全部位于用户模式地址范围内。内存映射由内核专门处理。它会指示硬件将物理页面提供给多个进程。专用内存实际上是一种特殊情况,即页面恰好映射到一个进程中。硬件不关心。实际上,如果需要,可以将同一页面多次映射到同一个进程中。 – usr

+0

@RohitVats:假设两个进程都加载foo.dll。考虑包含运行在两个不同进程中的代码的foo.dll的4K页面。代码页被映射到两个不同的进程;对于使用DLL的每个进程,它都不会加载到内存中!可能有数百个这样的过程! –

相关问题