【发布时间】:2011-11-19 13:00:13
【问题描述】:
如何在没有文件支持的情况下保留和分配共享内存?我正在尝试保留一大块(数十 GiB)共享内存,并将其作为 IPC 的一种形式在多个进程中使用。然而,这个块的大部分根本不会被触及(访问将非常稀疏;在进程的整个生命周期中可能只有几百兆字节)并且我不关心应用程序结束时的数据。
因此,执行此操作的方法最好具有以下属性:
- 不提交整个范围。我会选择提交(实际使用的)哪些部分。(但模式非常难以预测。)
- 不需要内存映射文件或类似的东西。我不需要保留数据。
- 让我可以从多个进程访问内存区域(我将明确处理锁定。)
- 适用于 Linux 和 Windows(显然需要 64 位操作系统。)
- 实际上使用共享内存。我需要表演。
- (新)操作系统或库不会尝试初始化保留区域(为零或其他值)。这显然是不切实际且不必要的。
我一直在尝试使用 boost::interprocess::shared_memory_object,但这会导致在文件系统上创建一个大文件(与我的映射内存区域大小相同。)它之后确实删除了该文件,但是几乎没有帮助。
感谢任何帮助/建议/指针/参考。
附:我确实知道如何在 Windows 上使用本机 API 执行此操作。而且 POSIX 似乎具有相同的功能(只是界面更简洁!)我在这里寻找一种跨平台的方式。
更新:我做了一些挖掘,结果发现我认为存在于 Windows 中的支持只是内存映射文件的一种特殊情况,使用系统页面文件作为后盾。 (我以前从未注意到它,因为我在过去的项目中最多使用了几兆字节的共享内存。)
另外,我现在有一个新要求(上面的数字 6。)
【问题讨论】:
-
您知道如何以特定于平台的方式执行此操作,因此您可以自己编写一个包装器,它将隐藏特定于平台的 API。
-
嗯,当然可以。我希望有一个干净的跨平台方法让我的生活更轻松。对于像这样依赖于硬件和内核的东西,谁知道依赖于平台的 API 的所有扭结和曲折?我当然不会!
-
虚拟内存操作系统上不存在这样的功能。所有内存都由文件支持。如果不是显式文件,则为分页文件。否则它不会是虚拟内存。在 Windows 中无法直接分配 RAM。有一种保留内存但不提交内存的低级方法。但是Linux不支持。尽管它是一个移动的目标。
-
我没有尝试直接分配 RAM。我正在尝试分配(或保留)我的一些地址空间,并且只写入/读取其中的一小部分。我希望我只能为 RAM 和页面文件中的这一小部分付费。 并且能够在几个进程之间共享这个区域。也许我错了,但我会认为这正是虚拟内存系统的用途!拥有大的地址空间并且只使用其中的一部分。将相同的页面(在使用时)映射到多个进程的地址空间有多难?好吧,不能拥有我猜的一切。 :)
-
@Yaser:这就是你从页面文件支持的内存映射文件中得到的(Linux 上的共享内存也可以换出到页面文件)。
标签: c++ cross-platform ipc shared-memory virtual-memory