【问题标题】:Reserving Shared Memory with No File Backing (Linux/Windows) (boost::interprocess)保留没有文件备份的共享内存 (Linux/Windows) (boost::interprocess)
【发布时间】:2011-11-19 13:00:13
【问题描述】:

如何在没有文件支持的情况下保留和分配共享内存?我正在尝试保留一大块(数十 GiB)共享内存,并将其作为 IPC 的一种形式在多个进程中使用。然而,这个块的大部分根本不会被触及(访问将非常稀疏;在进程的整个生命周期中可能只有几百兆字节)并且我不关心应用程序结束时的数据。

因此,执行此操作的方法最好具有以下属性:

  1. 不提交整个范围。我会选择提交(实际使用的)哪些部分。(但模式非常难以预测。)
  2. 不需要内存映射文件或类似的东西。我不需要保留数据。
  3. 让我可以从多个进程访问内存区域(我将明确处理锁定。)
  4. 适用于 Linux 和 Windows(显然需要 64 位操作系统。)
  5. 实际上使用共享内存。我需要表演。
  6. )操作系统或库不会尝试初始化保留区域(为零或其他值)。这显然是不切实际且不必要的。

我一直在尝试使用 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


【解决方案1】:

在 Windows 上,所有内存都必须以某种方式由磁盘支持。

我认为你可以在 Windows 上完成的最接近的工作是内存映射一个稀疏文件。我认为这将适用于您的情况,原因有两个:

  1. 在 Windows 上,只有您实际接触的共享内存才会成为常驻内存。这符合第一个要求。
  2. 因为文件是稀疏的,只有修改过的部分才会真正存储在磁盘上。如果您查看文件的属性,它会说“大小:500 MB,磁盘大小:32 KB”。

我意识到这在技术上不符合您的第二个要求,但不幸的是,我认为这在 Windows 上是不可能的。至少使用这种方法,只有您实际使用的区域才会占用空间。 (并且仅当 Windows 决定将内存提交到磁盘时,它可能会或可能不会自行决定。)

至于将其转变为跨平台解决方案,一种选择是修改 boost::interprocess 以便它在 Windows 上创建稀疏文件。我相信 boost::interprocess 已经满足了您在 Linux 上的要求,在 Linux 上可以使用 POSIX 共享内存。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-21
    • 2020-10-19
    • 2015-02-14
    • 2012-11-05
    • 2012-09-06
    • 1970-01-01
    • 2014-11-30
    相关资源
    最近更新 更多