在 c++ 程序中有效使用 POSIX 共享内存

Posted

技术标签:

【中文标题】在 c++ 程序中有效使用 POSIX 共享内存【英文标题】:Efficient use of POSIX shared memory in a c++ program 【发布时间】:2015-10-25 20:10:51 【问题描述】:

我在 Linux 机器上使用基于 POSIX API 的共享内存在多​​个 MPI 进程之间进行通信。我有一个可行的解决方案,但我想知道如何有效地利用共享内存空间来存储大数据。

我有一台具有 64GB 共享内存限制的机器,我可能必须将 > 64GB 的数据写入该空间,但这些都是 1-2GB 的较小块。

我想知道的是:

我如何才能真正删除我的 1-2GB 块占用的内存,因为它的目的已经达到并且我不再需要这些数据了?

我正在使用 shm_unlink(),但它似乎没有清除 /dev/shm/ 中的空间

请帮忙!

【问题讨论】:

在 unix 中,您可以删除文件,但它仍然存在,直到存在至少一个指向它的描述符。所以你确定所有使用 shmem 的进程都调用close 是的,我想你的意思是所有进程上的 shm_unlink()(?) 另外,你考虑过大页面的使用吗?将您的 GB 内存拆分为 4K 页面并管理它们需要付出很多努力。 >您的意思是所有进程上的 shm_unlink() 否,shm_unlink 删除名称,而不是文件,就像 inode 与文件一样。你需要关闭文件 是的,我既取消链接又关闭。 【参考方案1】:

来自http://pubs.opengroup.org/onlinepubs/009695399/functions/shm_unlink.html中的sum_unlink描述 看来内存删除实际上可能会推迟,请阅读以下内容:

如果在对象被取消链接时存在对共享内存对象的一个​​或多个引用,则应在 shm_unlink() 返回之前删除该名称,但应推迟删除内存对象内容,直到所有打开和映射到该对象的引用共享内存对象已被删除。

希望对你有所帮助。

【讨论】:

以上是关于在 c++ 程序中有效使用 POSIX 共享内存的主要内容,如果未能解决你的问题,请参考以下文章

system v和posix的共享内存对比

linux c编程:Posix共享内存区

在 C/C++ 共享内存中等待和通知

如何在 c 中使用 posix 命名信号量和 Linux 上两个进程之间的共享内存?

POSIX 共享内存 - 有多少个内存副本

POSIX 共享内存写入/读取