使用CreateFileMapping分配页面到页面文件的目的是什么?

5
函数CreateFileMapping可以用于在页面文件中分配空间(如果第一个参数是INVALID_HANDLE_VALUE)。稍后,可以将已分配的空间映射到进程虚拟地址空间中。
为什么我要这样做而不只使用VirtualAlloc
似乎这两个函数的作用几乎相同。由VirtualAlloc分配的内存可能在某些时候被推送到页面文件中。为什么我需要一个特别请求在首次分配时将我的页面分配到那里的API?我为什么要关心我的私有页面位于何处?
这只是向操作系统提供有关我的预期内存使用模式的提示吗? (即,前者是更积极地交换这些页面的提示。)
还是说这只是在32位进程上处理非常大的数据集时的一种方便方法? (即,我可以使用CreateFileMapping进行> 4Gb的分配,然后根据需要将较小的空间映射到内存中。使用页面文件可以省去手动管理自己的“交换”文件集的工作。)
PS。 这个问题是由我最近阅读的一篇文章引发的:http://blogs.technet.com/markrussinovich/archive/2008/11/17/3155406.aspx
2个回答

4

从CreateFileMapping函数开始:

A single file mapping object can be shared by multiple processes.

虚拟内存是否可以在多个进程之间共享?

啊,没错,就是这个: http://msdn.microsoft.com/en-us/library/aa366551(VS.85).aspx我还没有在Win32上使用共享内存的理由,所以我不知道CreateFileMapping是实现它的方法。 - pauldoo
这是否意味着在Win32中所有共享内存都是从页面文件中分配的?普通物理内存分配需要在需要时进行交换有什么问题吗? - pauldoo
内存模型不允许您访问其他进程内存空间中的内存。 - Kieveli

1
一个原因是在不同的进程之间共享内存。只要知道映射对象的名称,不同的进程就可以通过页面文件进行通信。这比创建实际文件并进行通信更可取。当然,可能还有其他用例。您可以参考MSDN上的使用文件映射进行IPC获取更多信息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接