System V的共享内存shm的释放问题

144 篇文章 6 订阅

        这一段被共享内存搞的有点崩溃。有俩进程,一个负责写共享内存,一个负责读共享内存。但是这里面有个麻烦的地方是,写进程每几秒钟就会申请一个新的20M的共享内存(因为有些原因,不能使用同一个共享内存),为了防止共享内存消耗过大,它维护了一个长度20的vector,当超出时就删掉共享缓冲区,调用的shmDel操作。读进程也会从相应的新的共享内存中读取新的数据。但是随着时间的推移,出现了Bus error。

        原来以为是字节对齐的问题,但是我们使用的x86架构的服务器,并且申请的空间都是4096的整数倍。后面经过不断的查看进程资源,发现读进程的内存消耗量不断增加,但是写进程基本没有太大变化。后面经过排查代码,发现读进程没有显示地调用shmDel操作。因为当时给出来的反馈是,读进程会自动销毁。

        实际上,System V的共享内存与mmap不同,它是通过映射内核中特殊文件系统shm中的文件来实现的。这样,System V中的共享内存的对象如果没有被显示地删除的话,及时所有访问共享内存的进程都已经终止了,该共享内存区域的对象仍然会在内核中出现,也就是System V的共享内存对象的生命周期是和系统内核的生命周期一致的。而通过mmap获得的内存映射用于进程间通信时,一定要考虑进程终事件对通信的影响。

        另外,System V的共享内存中的数据从不会写入到实际磁盘中去。它只是为了实现进程间共享数据和传递数据。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值