共享命名内存 (Windows)

Posted

技术标签:

【中文标题】共享命名内存 (Windows)【英文标题】:Shared-Named memory (Windows) 【发布时间】:2014-04-17 07:10:22 【问题描述】:

我最近开始了一个需要使用共享/命名内存的项目。我有一个工作原型 - 但在我致力于当前的实现之前,我想了解更多关于这个主题的知识。

我查看了 MSDN 文档(以及各种其他来源),掌握了一切工作原理背后的基本原理,但我无法在下面找到问题的答案。

1) 如果您创建共享内存空间并且未提供有效的文件句柄,它会使用系统页面文件进行存储。我的问题是 - 如果我创建自己的文件,并将视图映射到该文件 - 性能会与映射到系统页面文件时相比相同吗?

2) 您可以通过使用 CopyMemory(创建数据的副本)或将 MapViewOfFile 的结果转换为最初写入的类型来访问共享内存空间中的数据。假设我们在那里写了一个数据结构“MyStruct”。执行以下操作是否省钱?

auto pReferenceToSharedMemory = (MyStruct*)MapViewOfFile(....);

pReferenceToSharedMemory->SomeField = 12345;
pReferenceToSharedMemory->SomeField2 = ...;
...

假设上述操作是安全的 - 将数据更改应用到存储在共享内存空间中的数据肯定比复制数据、更改一些值并将其复制回来更有效?

3) 最后 - OpenFileMapping 和 MapViewOfFile 操作有多昂贵?我认为理想情况下,您应该只执行一次 OpenFileMapping(在操作开始时),执行一次 MapViewOfFile,并使用它在整个操作过程中返回的引用,而不是每次您想访问数据时都执行 MapViewOfFile?

最后:会不会是 MapViewOfFile 返回的引用和 MapViewOfFile 中存储的数据不同步了?

【问题讨论】:

【参考方案1】:

1) 你自己的文件和系统页面文件之间的选择不是性能;是坚持。下次运行程序时,对文件的更改仍然存在。

2) 正确的解决方案是 `new (MapViewOfFile(...)) MyStruct,如果映射由页面文件支持,因此仍然为空。

3) 昂贵的操作是读取和写入,而不是元操作。

4) 我什至不知道这意味着什么,所以我相当肯定答案是否定的。

【讨论】:

感谢您的信息。我的问题 4 的意思是,如果 MapViewOfFile 返回的引用可能由于映射视图的某些更改(由于大小更改等而移动内存)而变得无效(空引用指针) @user3544144:您正在混合“指针”和“参考”。这些词在 C++ 中具有非常特殊的含义。 MapViewOfFile 绝对不返回引用。 你是对的 - 我为混乱道歉。 MapViewOfFile 返回的指针指向当前在设置的视图中映射的数据。我认为提出问题的更好方法是问 - MapViewOfFile 返回的指针是否可能在某些情况下变得无效(即内存中的数据已转移到新位置) @Floris:当然不是。它会一直存在,直到您取消映射视图。

以上是关于共享命名内存 (Windows)的主要内容,如果未能解决你的问题,请参考以下文章

共享内存锁定和进程崩溃

2017-2018-1 20155317 IPC

Python进程间通信之共享内存

Qt笔记-Windows管道通信

简单例子windows 共享内存 Demo -----

Windows进程间共享内存通信实例