如何拥有一个孤立的内存部分,它根本不支持任何文件或额外的管理层,例如管道,可以在同一台Windows机器上的两个专用进程之间共享?
大多数文章都指向了CreateFileMapping的方向。让我们从那里开始:
如何使用hFile = INVALID_HANDLE_VALUE的CreateFileMapping实际工作? 根据
https://msdn.microsoft.com/en-us/library/windows/desktop/aa366537(v=vs.85).aspx
它 “...创建一个指定大小的文件映射对象,该对象由系统页面文件而不是文件系统中的文件支持...”
假设我在内存中写了一些内容,它由CreateFileMapping映射,并带有hFile = INVALID_HANDLE_VALUE。在什么条件下将此内容写入磁盘上的页面文件?
此外,我对使用共享内存的动机的理解是保持性能和优化。为什么文章“创建命名共享内存” (https://msdn.microsoft.com/de-de/library/windows/desktop/aa366551(v=vs.85).aspx)参考 CreateFileMapping,如果没有单个属性组合,则会阻止写入文件,例如页面文件?
回到最初的问题:我担心,CreateFileMapping不够好......那么什么会起作用?
答案 0 :(得分:6)
你误解了记忆的含义是什么"支持"由系统分页文件。 (不要感到难过; Raymond Chen已经将您从MSDN引用的文字描述为" one of the most misunderstood sentences in the Win32 documentation。")几乎所有计算机的内存都是"备份"通过磁盘上的某些东西;只有内核专用的"非分页池"并且尽可能少,不是。如果页面不是由普通的命名文件支持,那么它将由系统页面文件支持。除非需要,否则操作系统不会将页面写入系统页面文件,但如果确实需要,则可以将页面写入。
此架构旨在确保流程完全"分页"当他们无所事事时,RAM。这曾经比现在重要得多,但它仍然很有价值;一个典型的Windows桌面将有几十个进程"空闲"等待可能永远不会发生的事件(例如需要假脱机打印作业)。这些进程可以被分页,内存可以更有建设性地使用。
CreateFileMapping
hfile=INVALID_HANDLE_VALUE
实际上就是您想要的。只要共享内存的进程正在积极地处理它,它就会保留在RAM中并且不存在性能问题。如果他们闲着,是的,它可能会被淘汰,但这很好,因为他们没有做任何事情。
你可以指示系统不要寻找一大块内存;这是VirtualLock的用途。但它意味着用于包含秘密信息的小块内存,将其写入页面文件可能会泄漏秘密。 MSDN页面警告您"每个版本的Windows都限制进程可以锁定的最大页数。这个限制是故意小的,以避免严重的性能下降。"