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

C++ 在C+;中寻找基于Windows RAM的共享内存解决方案+;,c++,windows,shared-memory,C++,Windows,Shared Memory,我面临的情况是,我需要将数百兆的内存从一个进程传递到另一个进程。现在我通过文件来做,速度太慢了。 我想,为了加快速度,这些文件应该直接写入RAM,并且可以从另一个进程访问。不需要任何复杂的同步。一个进程将创建共享内存对象并用数据填充它们。另一个进程将读取并删除它们。然而,我做了一个快速的研究,似乎你不能在Windows的RAM中共享内存-共享内存由文件或分页文件支持。boost::interprocess的文档证实了这一点。如果共享内存实现仍然使用磁盘,那么速度在哪里?有没有使用基于RAM的共享

我面临的情况是,我需要将数百兆的内存从一个进程传递到另一个进程。现在我通过文件来做,速度太慢了。 我想,为了加快速度,这些文件应该直接写入RAM,并且可以从另一个进程访问。不需要任何复杂的同步。一个进程将创建共享内存对象并用数据填充它们。另一个进程将读取并删除它们。然而,我做了一个快速的研究,似乎你不能在Windows的RAM中共享内存-共享内存由文件或分页文件支持。boost::interprocess的文档证实了这一点。如果共享内存实现仍然使用磁盘,那么速度在哪里?有没有使用基于RAM的共享内存的C++库? 编辑:我做了一些进一步的阅读: 1.来自boost::进程间文档: 由于操作系统必须将文件内容与内存内容同步,内存映射文件的速度不如共享内存快 2.发件人:
“一个内存映射文件也可以由多个应用程序同时映射。这是两个或多个进程在Windows NT中直接共享数据的唯一机制。”

由一个文件支持没有什么错——在内存压力下,数据必须到某个地方,您的选择是:

  • 将内存视为无法分页或删除的神圣数据

    可能只会产生更糟糕的内存压力问题,但对于某些嵌入式系统来说,这是一个不错的选择,因为在这些系统中,整个运行时环境都可以很好地控制

  • 放下记忆

    显然不适合所有数据。缓存内容?大概原始照片?可能不会

  • 将内存分页到磁盘

    好的通用选择


在使用共享内存工具时,您是否看到内存压力?添加更多RAM或了解如何缩小系统。:)

据我所知,这里基本上有两种选择

1) 您可以创建一个DLL,并使用data_seg pragma在两个进程中加载DLL。这有很大的缺点,下面将详细说明:

最重要的缺点是:空间必须静态初始化,并存储在已编译DLL的数据段中,这意味着如果您想使用此方法共享数百MB,那么您的DLL将有数百MB大


2) 使用常规内存映射文件并没有什么错,因为它们是缓存的。您甚至可以使用Systems页面文件来存储本文所述的数据:

我实际上测试了这个进程间通信的示例[1] 使用1 GiB内存映射文件,即使在用数据填充整个GiB之后,也可以确认没有写入磁盘


[1]

我仍然建议使用内存映射文件,而不是我将要提到的方法

如果确实要从另一个进程内存中读取,请使用


如果您偏执于将数据保存在RAM中,那么在MS Windows中有Unix mlock()等价物,我认为这是一个根本性的误解:您认为,如果您创建一个由分页文件支持的文件映射,它将与在磁盘上实际写入内容一样慢

事实并非如此:文档中“由分页文件支持”的含义意味着共享内存通常驻留在内存中,但如果没有足够的可用物理内存,并且虚拟内存管理器需要交换内存页,则共享内存在分页文件中有一个预留位置来写入此类数据

文档中并不清楚这一点,但MSDN上的页面确认:

[…]它由磁盘上的文件支持。这意味着当系统交换文件映射对象的页面时,,对文件映射对象所做的任何更改都会写入文件。当文件映射对象的页面调回时,它们将从文件中恢复

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


顺便说一句,用户进程中的“常规”(=虚拟)内存就是这样工作的:如果分页文件当前未使用,则分配的每一位内存都可以交换到分页文件中,并且系统需要使用物理内存来处理其他内容(例如,使您/另一个应用程序可以使用当前使用的内存页)与任何虚拟内存操作系统一样,Windows中的所有内存都由文件支持。文件由内存(文件系统缓存)支持。这使得你很可能看不到加速。这应该以RAM总线的速度移动,对于DDR2大约为5GB/秒。@Hans:你是说使用共享内存与直接将数据保存到磁盘文件相比不会给我带来任何速度提升吗?也许提升Windows共享内存是你的拿手好戏。它是非持久性的,如果这是你真正的意思的话@萨诺伊德:你没有抓住重点。我不在乎内存压力过大时,Windows是否会将RAM写入磁盘。我想避免磁盘文件和RAM之间的同步,无论RAM压力如何,都会发生这种同步——据我所知,这就是Windows共享内存的实现方式?据我所知,共享内存实际上只会在内存压力下移动到分页文件,顺便说一下,用户进程的每一位内存都会发生什么。@user467799:huh?然后使用页面文件支持的MMF。有什么大不了的?NT中的页面编写器是一个懒惰的人。这意味着它只会在绝对必要时(过于简化,但很接近)将页面写入磁盘。所以别担心。有了足够的RAM,您将不会看到任何性能下降。@状态:分页文件支持的内存是否比常规文件支持的内存具有显著优势