我面临着一种情况,我需要将多达数百兆字节的内存从一个进程传递到另一个进程。现在我正在通过文件来完成它,但速度太慢了。
我想为了更快,这些文件应该直接写入 RAM 并且可以从另一个进程访问。不需要花哨的同步。一个进程将创建共享内存对象并用数据填充它们。另一个进程将读取并删除它们。不过,我进行了一项快速研究,似乎您无法在 Windows 中共享 RAM 中的内存 - 共享内存由文件或分页文件支持。 boost::interprocess 的文档证实了这一点。如果共享内存实现仍然使用磁盘,那么速度在哪里?有没有使用基于 RAM 的共享内存的 C++ 库?
编辑:我做了一些进一步的阅读:
1.来自 boost::interprocess 文档:
“由于操作系统必须将文件内容与内存内容同步,因此内存映射文件的速度不如共享内存。”
2. 来自http://msdn.microsoft.com/en-us/library/ms810613.aspx:
“内存映射文件也可以同时被多个应用程序映射。这是 Windows NT 中两个或多个进程直接共享数据的唯一机制。”
我认为这是一个根本性的误解:您认为,如果创建由分页文件支持的文件映射,那么它会像实际在磁盘上写入内容一样慢。
绝对不是这种情况:文档中“由分页文件支持”的含义意味着共享内存通常驻留在内存中,但如果没有足够的可用空间,它在分页文件中保留了一个位置来写入此类数据物理内存和虚拟内存管理器需要交换内存页面。
文档中并不清楚这一点,但文件映射MSDN 页面确认:
[...] 它由磁盘上的文件支持。这意味着当系统交换文件映射对象的页面时,对文件映射对象所做的任何更改都会写入该文件。当文件映射对象的页面被换回时,它们将从文件中恢复。
请注意,这适用于由分页文件支持的共享内存以及由常规文件支持的内存(VMM 保证各种视图保持一致)。
顺便说一句,这就是用户进程中“常规”(=虚拟)内存的工作方式:如果当前未使用分配的内存,并且系统需要将物理内存用于其他内容(例如,当前使用的内存页可供您/另一个应用程序使用)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)