是否可以与另一个进程共享现有的 RAM 块?

Is it possible to share an existing chunk of RAM with another process?

背景

我有一个现有的 32 位应用程序,它分配了相当大的 RAM (>128 MB) 块(通过 malloc/new)并填充了一些图像数据(多帧值)。应用程序的插件可以通过 SDK-API 调用访问指向此 RAM 块开头的只读指针 (const char *)。其他 API 调用可用于检索元数据,例如 width/height/bit 深度等。我在 SDK-API 调用之外 no/little 控制了这个应用程序。

我还有另一个 64 位应用程序(在我的控制下),它需要上述数据作为输入,并且由于 sampling/3D 保证 64 位进程的卷重建需要更多的 RAM。

问题

我希望与 64 位进程共享映射到 32 位进程中此现有指针的物理内存(最初不是通过 CreateFileMapping/MapViewOfFile 等调用而是通过 malloc/new 运算符调用创建的)位过程。

这可能吗?

通常我会在 32 位进程中创建一个相同大小的共享内存,复制内容并使用某种同步方法来表示数据可用。然而,在我的例子中,32 位进程也被许多插件挤满了,因此它非常接近可用的免费虚拟 space 的限制。由于内存碎片,MapViewOfFile 有可能失败。因为我只需要 RAM 块的只读副本,所以我试图避免额外的分配和复制。

我的目标是 64 位 Windows 7,Visual C++ 2010/2015

没有。对于初学者来说,"shared memory" 实际上是共享页面。您的 malloc 调用决不能保证 return 页面对齐内存。此外,这些共享页面必须在您的虚拟地址 space 的空闲区域中创建,但是 malloced 内存由分配的和未共享的页面支持。