如何拥有一个孤立的内存部分,它根本不支持任何文件或额外的管理层,如管道,可以在同一台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不够好......那么什么会起作用?
你误解了系统分页文件"支持"内存意味着什么.(不要感觉不好; Raymond Chen将您从MSDN引用的文本描述为" Win32文档中最容易被误解的句子之一.")几乎所有计算机的内存都被磁盘上的某些内容"支持" ; 只有内核专用且尽量少使用的"非分页池"才是.如果页面没有普通命名文件支持,则它由系统页面文件支持.除非需要,否则操作系统不会将页面写入系统页面文件,但如果确实需要,则可以.
该体系结构旨在确保当进程无关时,可以将进程完全 "分页"到RAM中.这曾经比现在重要得多,但它仍然很有价值; 典型的Windows桌面将有许多进程"空闲"等待可能永远不会发生的事件(例如需要假脱机打印作业).这些进程可以被分页,内存可以更有建设性地使用.
CreateFileMapping
同hfile=INVALID_HANDLE_VALUE
是,其实你想要什么.只要共享内存的进程正在积极地处理它,它就会保留在RAM中并且不存在性能问题.如果他们闲着,是的,它可能会被淘汰,但这很好,因为他们没有做任何事情.
您可以指示系统不要将一大块内存分页; 这就是VirtualLock的用途.但它意味着用于包含秘密信息的小块内存,将其写入页面文件可能会泄露秘密.MSDN页面警告您"每个版本的Windows都有一个进程可以锁定的最大页数限制.这个限制是故意小的,以避免严重的性能下降."