如果无法删除共享内存段会发生什么
what happen if fail to delete a shared memory segment
根据我的观察,如果我在不删除共享内存段的情况下终止我的进程,该共享内存段将只保留在那里,在 /dev/shm/xxxx
中,甚至没有其他进程正在使用它。 这是否意味着内存泄漏?(并且在我重新启动我的机器后它会消失)为什么 linux 不提供一种机制来维护共享内存的引用计数然后当没有进程使用时,系统可以删除它。
因为进程可能会崩溃,或者我只是未能捕捉到一些异常....无论如何,当进程异常终止时,我很有可能无法删除该共享内存段。
我的用例:我是 运行 几个共享同一内存段进行通信的工作进程。而且没有主节点来协调事情。该策略是最后一个出口节点将关闭共享内存段。
顺便说一下,我使用的是 boost::interprocess
而不是系统级别 shm_open
,但我认为它们的行为应该是相同的。
Posix 标准要求(强调):
When a shared memory object is created, the state of the shared memory object, including all data associated with the shared memory object, persists until the shared memory object is unlinked and all other references are gone. It is unspecified whether the name and shared memory object state remain valid after a system reboot.
换句话说,共享内存对象基本上就像临时文件;它们旨在持续存在,至少在会话期间是这样。使用特定命名的共享内存对象的所有进程都可能崩溃,但您仍然可以启动一个新进程并恢复共享内存对象的内容。
由于 Linux 试图与 Posix 标准保持一致,它以相同的方式实现共享内存对象,这意味着它们会一直存在(直到重新启动),除非手动清理。
不再被任何活动进程使用的共享内存对象不完全是内存泄漏,因为如果存在内存压力(并且启用了交换),它会迅速被换出。但是,最好自己定期清理共享内存对象。根据您的应用程序的具体性质,可以采用多种策略。
一个简单(但绝非通用)的解决方案是在您知道没有新进程需要打开它时立即取消链接共享内存对象。取消链接对象有效地删除了它的名称,因此不再可能 shm_open
它,但只要某个进程对它有开放引用,取消链接的对象就会持续存在。 (OS 确实保留了一个引用计数;但是,只要名称存在,该名称就算作一个引用,对象也一样。)创建临时文件的应用程序也经常使用同样的策略。
根据我的观察,如果我在不删除共享内存段的情况下终止我的进程,该共享内存段将只保留在那里,在 /dev/shm/xxxx
中,甚至没有其他进程正在使用它。 这是否意味着内存泄漏?(并且在我重新启动我的机器后它会消失)为什么 linux 不提供一种机制来维护共享内存的引用计数然后当没有进程使用时,系统可以删除它。
因为进程可能会崩溃,或者我只是未能捕捉到一些异常....无论如何,当进程异常终止时,我很有可能无法删除该共享内存段。
我的用例:我是 运行 几个共享同一内存段进行通信的工作进程。而且没有主节点来协调事情。该策略是最后一个出口节点将关闭共享内存段。
顺便说一下,我使用的是 boost::interprocess
而不是系统级别 shm_open
,但我认为它们的行为应该是相同的。
Posix 标准要求(强调):
When a shared memory object is created, the state of the shared memory object, including all data associated with the shared memory object, persists until the shared memory object is unlinked and all other references are gone. It is unspecified whether the name and shared memory object state remain valid after a system reboot.
换句话说,共享内存对象基本上就像临时文件;它们旨在持续存在,至少在会话期间是这样。使用特定命名的共享内存对象的所有进程都可能崩溃,但您仍然可以启动一个新进程并恢复共享内存对象的内容。
由于 Linux 试图与 Posix 标准保持一致,它以相同的方式实现共享内存对象,这意味着它们会一直存在(直到重新启动),除非手动清理。
不再被任何活动进程使用的共享内存对象不完全是内存泄漏,因为如果存在内存压力(并且启用了交换),它会迅速被换出。但是,最好自己定期清理共享内存对象。根据您的应用程序的具体性质,可以采用多种策略。
一个简单(但绝非通用)的解决方案是在您知道没有新进程需要打开它时立即取消链接共享内存对象。取消链接对象有效地删除了它的名称,因此不再可能 shm_open
它,但只要某个进程对它有开放引用,取消链接的对象就会持续存在。 (OS 确实保留了一个引用计数;但是,只要名称存在,该名称就算作一个引用,对象也一样。)创建临时文件的应用程序也经常使用同样的策略。