在 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 共享内存的主要内容,如果未能解决你的问题,请参考以下文章