c++ - 在 C++ 中寻找基于 Windows RAM 的共享内存解决方案

标签 c++ windows shared-memory

我面临这样一种情况,我需要将多达数百兆字节的内存从一个进程传递到另一个进程。现在我是通过文件来做的,它太慢了。 我想为了让它更快,这些文件应该直接写入 RAM 并且可以从另一个进程访问。不需要花哨的同步。一个进程将创建共享内存对象并用数据填充它们。另一个进程将读取并删除它们。但是我做了一个快速的研究,看起来你不能在 Windows 中共享 RAM 中的内存 - 共享内存由文件或页面文件支持。 boost::interprocess 的文档证实了这一点。如果共享内存实现仍然使用磁盘,那么速度在哪里?有没有使用基于 RAM 的共享内存的 C++ 库?

编辑:我做了一些进一步的阅读: 1. 来自 boost::interprocess 文档: “由于操作系统必须将文件内容与内存内容同步,因此内存映射文件不如共享内存快。” 2. 来自 http://msdn.microsoft.com/en-us/library/ms810613.aspx : “内存映射文件也可以同时被多个应用程序映射。这是 Windows NT 中两个或多个进程直接共享数据的唯一机制。”

最佳答案

我认为这是一个根本性的误解:你认为,如果你创建一个由分页文件支持的文件映射,它会像在磁盘上实际写东西一样慢。

肯定不是这样的:文档中“backed by the paging file”的意思是指共享内存一般驻留在内存中,但是如果有没有足够的空闲物理内存,虚拟内存管理器需要换出内存页。

这在文档中不是很清楚,但是 File Mapping MSDN 上的页面确认:

[...] It is backed by the file on disk. This means that when the system swaps out pages of the file mapping object, any changes made to the file mapping object are written to the file. When the pages of the file mapping object are swapped back in, they are restored from the file.

请注意,这适用于分页文件支持的共享内存以及常规文件支持的内存(VMM 保证各种 View 保持一致)。

顺便说一句,这就是用户进程中“常规”(=虚拟)内存的工作方式:如果当前未使用且系统需要将物理内存用于其他内容,则分配的每一位内存都可以换出到页面文件(例如,使当前使用的内存页面可供您/其他应用程序使用)。

关于c++ - 在 C++ 中寻找基于 Windows RAM 的共享内存解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6209277/

相关文章:

c++ - C/C++ - 共享内存中的环形缓冲区(POSIX 兼容)

c++ - 线程参数的高效快速方法

c++ - 普通 ctor(或 dtor)和用户定义的空 ctor(或 dtor)之间有什么区别

python - 尝试在 MS Windows 上运行时出现 "mlflow ui"错误

postgresql - 向 postgres 添加更多索引会导致 "out of shared memory"错误

c++ - boost进程间是否支持在进程之间共享包含指针的对象?

c++ - 根据对象的成员函数从 vector 中删除对象

c++ - 库 Png : Png24 To Png32 and Vice-Versa

Windows Phone 7 开发指南

linux - jssc windows 和 linux