一、共享内存
1、共享内存的原理
共享内存为多个进程之间共享和传递数据提供了一种有效的方式。共享内存是先在物理内存上申请一块空间,多个进程可以将其映射到自己的虚拟地址空间中。所有进程都可以访问共享内存中的地址,就好像它们是由 malloc 分配的一样。如果某个进程向共享内存写入了数据,所做的改动将立刻被可以访问同一段共享内存的任何其他进程看到。由于它并未提供同步机制,所以我们通常需要用其他的机制来同步对共享内存的访问。
![在这里插入图片描述](https://img-blog.csdnimg.cn/84551f1e5788425cacce213aab3d49aa.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/8e6a8c4071b64f09814e57804909d380.png)
总结:多个进程在物理内存上,有一份内存空间是共享的,多个进程在各自的逻辑地址空间写入数据,或者获取数据,使用同一个空间,不需要数据的拷贝。
2、共享内存的实现
![在这里插入图片描述](https://img-blog.csdnimg.cn/dd5762ee5e4c40b598747429025969be.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/35ff53c6d257495e8b9a441bd68dd792.png)
共享内存基本操作函数
shmget 创建、获取
shmat 映射
shmdt 断开映射
shmctl 删除共享内存
1.a.c向共享内存中写入数据
![在这里插入图片描述](https://img-blog.csdnimg.cn/884f91fe885c4005aa3f90d017fb555b.png)
2.b.c向共享内存中读入数据
![在这里插入图片描述](https://img-blog.csdnimg.cn/8bdcb71190aa454ba23343acab454312.png)
3.sem.h 引入信号量
![在这里插入图片描述](https://img-blog.csdnimg.cn/71ff66f9b9ca4d22b5d0aa8f709c3924.png)
4.sem.c 文件
![在这里插入图片描述](https://img-blog.csdnimg.cn/8f2dfa8bb1b4406185b27f4f3d5b36c9.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/1b458ef630824e7bab0e7b45daf513be.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/d3bdf64c6bc24ecab4a7947b0a6d9e11.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/d53729bbde2746f7b5cb4d6320f85dee.png)
三、消息队列
1、消息队列原理
自身就带有同步机制的有:消息队列、管道
![在这里插入图片描述](https://img-blog.csdnimg.cn/65141291d8d247588992e2f0156ee713.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/b7c27c17e50a43a1953c225804d9fd73.png)
2、消息队列实现
a.c文件向消息队列发送数据
![在这里插入图片描述](https://img-blog.csdnimg.cn/72e5fa5a2dc24d27940828476f948f31.png)
b.c向消息队列读取数据
![在这里插入图片描述](https://img-blog.csdnimg.cn/6257613e59654635879bb334bdf43295.png)