【问题标题】:sysv shared memory, will it be destroyed automatically?sysv共享内存,会自动销毁吗?
【发布时间】:2012-07-15 13:19:09
【问题描述】:

如果不这样做,在 Unix 中分配的共享内存会自动销毁吗?

例如,一个进程创建了该段,另一个进程使用它。现在它们都因某种原因崩溃了,那段是否导致内存泄漏?

【问题讨论】:

  • 如果两个进程都关闭,内存可能会被操作系统回收。
  • 假设是许多错误的根源。分配一个大块共享内存,使用vmstat 验证您可以看到它已分配,然后导致您的程序崩溃。确保它消失了。
  • 虽然看起来,根据内存的分配方式,这可能不是真的。
  • 你是如何分配共享内存块的?

标签: c system shared-memory sysv


【解决方案1】:

这取决于您给予细分的持久性。根据经验,如果您通过shm_open(或密钥)为其命名,它将是持久的。这表明它会在您关闭创建它的进程后持续存在,除非您以某种方式“删除”它,即执行shm_unlink。这是您可以在完全不同的进程之间共享段的唯一方法。

因此,如果您这样做,您真的必须小心清理。这种持久段的最佳策略是让所有进程最初打开一个文件描述符,然后在每个人连接后立即取消链接。该段将一直存在,直到它的最后一个文件描述符被关闭。

非持久性段可以直接使用mmap 匿名映射。随着您的流程不复存在,它们将消失。

【讨论】:

    【解决方案2】:

    没有。应明确丢弃分配的共享内存段。

    用于列出粉碎内存段和删除的有用命令行工具: ipcsipcrm。 最后一个可以用于ex。用于在所有使用它的程序崩溃时删除一个段。

    【讨论】:

      【解决方案3】:

      一般不会。

      如果您使用的是 SysV 共享内存(例如,shm_open),则不需要。 SysV IPC 原语都不会自行清理;您总是必须明确地清理它们,或者使用ipcrm 手动清理它们。这是我强烈建议不要使用它们的几个原因之一。

      如果您mmapping 一个文件以获取共享内存,那么该文件显然不会自行消失。像任何其他文件一样,您必须明确地unlink 它才能让它消失。如果你已经这样做了,那么你就准备好了。

      【讨论】:

      • 澄清一下:未能取消链接映射文件并不会一直锁定分配的内存。映射的区域可以随时被分页(或交换)出来,如果该区域未被实时进程使用,显然会如此。
      猜你喜欢
      • 2021-12-19
      • 2013-11-25
      • 2012-12-06
      • 2012-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-15
      • 2015-03-20
      相关资源
      最近更新 更多