进程间通信------共享内存

1.原理:
系统在物理地址空间上开辟一块用于存放共享数据的数据区,然后进程在其虚拟地址空间上开辟一块共享内存数据区,通过页表映射到物理地址的共享内存数据区,当不同的进程都映射到物理地址空间上的共享内存数据区时,这两个进程就可以直接从该共享内存拿取数据,不再通过内核的系统调用传递数据,实现进程间通信的目的。

注:由于共享内存不再通过系统调用传递数据,也就 节约了数据从用户到内核,再由内核到用户时的时间成本,所以,共享内存被称为最快的IPC方式

2.创建共享内存*
int shmget(key_t key, size_t size, int shmflg);
key:该共享内存的标识符(名字)
size:该共享内存的大小(单位:byte)
shmflg:标志位 (IPC_CREAT|0644)
成功返回该共享内存的标识码(操作句柄),失败返回-1

3.将共享内存映射到虚拟地址空间上
void shmat(int shmid, const void shmaddr, int shmflg);
shmid:共享内存的操作句柄
shmaddr:映射到虚拟地址空间上的共享内存片段的起始地址,一般设置为NULL,表示由操作系统随机分配
shmflg:标志位,SHM_RONLY:表示只对共享内存进行读操作
SHM_RND:表示 round attach address to SHMLBA boundary
成功返回虚拟地址空间上指向共享内存段的指针
失败返回-1

注:shmaddr若不为空,再看shmflg是否为SHM_RND
是:则表示将shmaddr作为虚拟地址中映射共享内存段的起始位置
否:表示会自动将起始地址附加到SHMLBA边界

共享内存图析:
在这里插入图片描述

关于虚拟地址空间的内容,大家可以参考:https://blog.csdn.net/Code_ZX/article/details/84637257

4.将共享内存从虚拟地址空间上脱离
int shmdt(const void shmaddr);*
shmaddr:虚拟空间中映射共享内存段的起始位置
成功返回0,失败返回-1

5.删除共享内存
*int shmctl(int shmid, int cmd, struct shmid_ds buf);
shmid:该共享内存的操作句柄
cmd:该共享内存将要执行的动作(IPC_RMID用于删除
buf:用于获取该共享内存的信息的数据结构
成功返回0,失败返回-1

删除共享内存资源实质,图析:
首先运行两个进程:
在这里插入图片描述
在这里插入图片描述
图析:
在这里插入图片描述

关于该博客中的代码,大家可以在码云查看:https://gitee.com/free_xin/codes/sm7d82lt3oqgyhezbincf38

6.共享内存的命令操作
ipcs -m: 查看该系统中的共享内存
ipcrm -m +shmid:删除shmid共享内存资源
ipcrm -M +key:删除key共享内存资源
注:共享内存的操作没有进行同步与互斥

关于其他进程间通信方式,大家可以查看我的其他文章:
管道:https://blog.csdn.net/Code_ZX/article/details/84986104
消息队列:https://blog.csdn.net/Code_ZX/article/details/84996626

谢谢大家的支持!!!
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值