windows - 两个进程之间的普通共享内存(没有文件映射,没有管道,没有其他额外的)
windows - plain shared memory between 2 processes (no file mapping, no pipe, no other extra)
如何拥有一个独立的内存部分,它根本不支持任何文件或额外的管理层,例如管道,并且可以在同一台 Windows 机器上的两个专用进程之间共享?
大多数文章都将我指向 CreateFileMapping 的方向。让我们从这里开始:
带 hFile=INVALID_HANDLE_VALUE 的 CreateFileMapping 实际上是如何工作的?
根据
https://msdn.microsoft.com/en-us/library/windows/desktop/aa366537(v=vs.85).aspx
它
"...创建一个指定大小的文件映射对象,该对象由系统页面文件而不是文件系统中的文件支持..."
假设我向内存中写入了一些内容,该内存由带有 hFile=INVALID_HANDLE_VALUE 的 CreateFileMapping 映射。在什么情况下这个内容会被写入到磁盘上的页面文件中?
另外,我对使用共享内存的动机的理解是保持性能的提升和优化。为什么文章"Creating Named Shared Memory"
(https://msdn.microsoft.com/de-de/library/windows/desktop/aa366551(v=vs.85).aspx) 参考
CreateFileMapping,如果没有单个属性组合,这将阻止写入文件,例如页面文件?
回到最初的问题:我担心 CreateFileMapping 不够好......那么什么会起作用?
你误解了内存被系统分页文件"backed"是什么意思。 (不要难过;Raymond Chen 将您从 MSDN 引用的文本描述为“one of the most misunderstood sentences in the Win32 documentation”。) ] 在磁盘上;只有 "non-paged pool",由内核专门使用并且尽可能少地使用,不是。如果页面没有普通命名文件支持,则它由系统页面文件支持。除非需要,否则操作系统不会将页面写出到系统页面文件,但如果确实需要,它可以。
此架构旨在确保进程在无事可做时可以完全 "paged out" RAM。这在过去比现在重要得多,但仍然很有价值;典型的 Windows 桌面将有数十个进程 "idle" 等待可能 永远不会发生 的事件(例如,需要假脱机打印作业)。这些进程可以调出,内存可以用于更有建设性的用途。
CreateFileMapping
和 hfile=INVALID_HANDLE_VALUE
实际上就是您想要的。只要共享内存的进程正在积极地使用它做事,它就会一直驻留在 RAM 中并且不会有性能问题。如果他们闲置,是的,它可能会被换页,但这没关系,因为他们没有对它做任何事情。
您可以指示系统不要调出内存块;这就是 VirtualLock 的用途。但它旨在用于包含 secret 信息的小块内存,将其写入页面文件可能会泄露秘密。 MSDN 页面警告您 "Each version of Windows has a limit on the maximum number of pages a process can lock. This limit is intentionally small to avoid severe performance degradation."
如何拥有一个独立的内存部分,它根本不支持任何文件或额外的管理层,例如管道,并且可以在同一台 Windows 机器上的两个专用进程之间共享?
大多数文章都将我指向 CreateFileMapping 的方向。让我们从这里开始:
带 hFile=INVALID_HANDLE_VALUE 的 CreateFileMapping 实际上是如何工作的? 根据
https://msdn.microsoft.com/en-us/library/windows/desktop/aa366537(v=vs.85).aspx
它 "...创建一个指定大小的文件映射对象,该对象由系统页面文件而不是文件系统中的文件支持..."
假设我向内存中写入了一些内容,该内存由带有 hFile=INVALID_HANDLE_VALUE 的 CreateFileMapping 映射。在什么情况下这个内容会被写入到磁盘上的页面文件中?
另外,我对使用共享内存的动机的理解是保持性能的提升和优化。为什么文章"Creating Named Shared Memory" (https://msdn.microsoft.com/de-de/library/windows/desktop/aa366551(v=vs.85).aspx) 参考 CreateFileMapping,如果没有单个属性组合,这将阻止写入文件,例如页面文件?
回到最初的问题:我担心 CreateFileMapping 不够好......那么什么会起作用?
你误解了内存被系统分页文件"backed"是什么意思。 (不要难过;Raymond Chen 将您从 MSDN 引用的文本描述为“one of the most misunderstood sentences in the Win32 documentation”。) ] 在磁盘上;只有 "non-paged pool",由内核专门使用并且尽可能少地使用,不是。如果页面没有普通命名文件支持,则它由系统页面文件支持。除非需要,否则操作系统不会将页面写出到系统页面文件,但如果确实需要,它可以。
此架构旨在确保进程在无事可做时可以完全 "paged out" RAM。这在过去比现在重要得多,但仍然很有价值;典型的 Windows 桌面将有数十个进程 "idle" 等待可能 永远不会发生 的事件(例如,需要假脱机打印作业)。这些进程可以调出,内存可以用于更有建设性的用途。
CreateFileMapping
和 hfile=INVALID_HANDLE_VALUE
实际上就是您想要的。只要共享内存的进程正在积极地使用它做事,它就会一直驻留在 RAM 中并且不会有性能问题。如果他们闲置,是的,它可能会被换页,但这没关系,因为他们没有对它做任何事情。
您可以指示系统不要调出内存块;这就是 VirtualLock 的用途。但它旨在用于包含 secret 信息的小块内存,将其写入页面文件可能会泄露秘密。 MSDN 页面警告您 "Each version of Windows has a limit on the maximum number of pages a process can lock. This limit is intentionally small to avoid severe performance degradation."