【Linux】进程间通信(IPC)之共享内存详解与测试用例

学习环境centos6.5 Linux内核2.6

什么是共享内存

共享内存允许两个或更多进程访问同一块内存。当一个进程改变了这块内存中的内容的的时候,其他进程都会察觉到这个更改。

效率

因为所有进程共享同一块内存,共享内存在各种进程间通信方式中具有最高的效率。就像访问进程独有的内存区域一样快,并不需要通过系统调用或其他需要切入内核的过程来完成。同时还能避免对数据的各种不必要的复制。

因为系统内核没有对访问共享内存的进程进行同步机制,如果有这方面的需求,比如需要不同进程进程对共享内存区进行读写操作,则必须要提供自己的同步措施,保护临界资源。通常我们使用信号量机制实现进程间同步与互斥。有关信号量的知识请阅读另一篇博客信号量

原理:

这里写图片描述

在Linux中,每个进程都有自己的P C B 和地址空间,并且都有一个对应的页表,负责将进程的虚拟内存和物理内存进行映射,通过MMU来管理。共享内存块,被映射到不同进程的地址空间内,从而实现了高效率的资源共享。

分配一个新的共享内存块会创建新的内存页面。因为所有进程都希望共享对同一块内存的访问,只应由一个进程创建一块新的共享内存。再次分配一块已经存在的内存块不会创建新的页面,会返回一个标识该内存块的标示符。一个进程如需使用这个共享内存块,则首先需要将它绑定到自己的地址空间中。会创建一个从进程本身虚拟地址到共享页面的映射关系。当不需要该共享内存块的时候,必须由一个且只能是一个进程负责释放这个被共享的内存页面。

如何使用

要使用一块共享内存,进程必须先分配它。其他需要访问这个共享内存块的每一个进程都必须将这个共享绑定(attach)到自己的地址空间中(系统维护一个对该内存的引用计数器,通过ipcs -s 命令可查看有几个进程在使用该共享内存块)
。当通信完毕后,所有进程从共享内存块脱离,由一个进程释放该共享内存块。要注意的是,所有用户申请的共享内存块最终大小都必须是向上取整为系统页面大小的整数倍。在Linux系统中,内存页面大小默认是4KB。

注意:当一个进程创建一块共享内存后,该进程在主动去释放该共享内存之前,被kill掉时,只会使该进程脱离(detach)该共享内存块,而不会释放该共享内存块,这时候可以使用命名ipcrm -m 去释放该资源。

相关函数

1、shmget

#include <sys/ipc.h>
#include <sys/shm.h>
int shmget(key_t key, size_t size, int shmflg);
  • 函数说明:得到一个共享内存标识符或创建一个共享内存对象并返回共享内存标识符。
  • 参数:
    • key ftok函数返回的I P C键值
    • size 大于0的整数,新
  • 7
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值