进程间通信(System V 标准下的多种通信方式)

上一篇文章讲了进程间通信的一个方式之一:管道,也提到管道存在的字节流问题。这篇文章将讲到基于System V 标准的多种通信方式,包括:共享内存,信号量,消息队列。

共享内存

共享内存是最快的 IPC 形式 ,它的本质是在内存空间中的共享区开辟一块空间供用户直接使用,这样在对数据写入与读取时可以绕开内核的系统调用,达到极致的速度。(但是当多个进程同时读取同一块空间时会出现竞态条件,此时要搭配信号量、互斥锁等做同步,这部分还是需要内核支持的)。

来认识一下共享内存相关的几个函数:

用于创建共享内存的:

用于将共享内存段连接道进程地址空间的:

用于将共享内存段与当前进程脱离的:

用于控制共享内存的:

对于每个函数的参数含义就不做说明了,可以使用 man 命令自行查看。

共享内存不会有管道那样的读取数据问题,因为共享内存是大小固定的区域,你往这个区域里面写什么,读取时读到的就是什么。

共享内存不会自带同步机制,就是前面说的多个进程同时访问时,这个时候我们需要将共享内存保护起来,不然会出现数据错乱。保护方法有信号量、互斥锁,互斥锁我们没有学过,但信号量是接下来的话题,不妨先学习了信号量再考虑它是如何实现保护共享内存的功能的。

信号量

信号量本质是一个计数器,这里又涉及到了引用计数的概念,用来表示临界资源中资源的数量多少。在进程要访问资源之前,需要先申请信号量,也就是对一块资源的 "预定"。

我们把共享内存空间想象成一个电影院,申请信号量的行为就是买票。你坐在电影院的哪一个座位,你的票是决定因素,如果没有票,就可能出现座位使用权的争执。

那么,信号量如何解决共享内存的问题呢?首先我们得知道,信号量本身就是一个共享的资源,可以理解为每个人都可以看到电影院的座位预定情况。对于一块共享内存,如果已经有进程在访问,那么其他进程便不能访问,当那个进程访问完共享内存并主动释放信号量,下一个进程才能访问。

申请信号量,P操作,释放信号量,V操作。

消息队列

消息队列就是将要共享的资源维护成一个队列。

消息队列的形式:A写入一个信息,内核存起来,B随时来取用,写端完全不影响读端。有点像弄了很多个大小不一的共享内存,然后串联起来。

它每一块数据都有边界,所以不会出现管道那样的问题。它自带同步机制,不会因为多个进程同时访问导致数据错乱。

System V

以上三种通信方式都是 System V 标准下的,那么什么是System V标准呢?为什么要用System V标准呢?

首先,System V标准其实就是一种 进程间通信的思路,它的特点是:内核对象全局可见,像上面的共享内存,信号量和消息队列,其实它们的创建都需要一个 Key,只要知道同一个 Key ,任何进程都能打开这些共享的资源。

正是这种特性,让 System V 下的 IPC 都可以被当作同一种资源来管理。

在内核中有一个 ipc_id_ary 结构体,里面有一个柔性数组( p0 ),用来存放这些资源,它们本质相同,所以可以存放在同一个数组中,所有 IPC 对象都共享一个通用头部struct kern_ipc_perm),包含 key、id、权限等信息。

内核通过 ipc_id_ary 统一管理,而具体的类型(共享内存 / 信号量 / 消息队列)通过后续的强转来区分,不属于该类型的强转则得不到正确的信息,这就是使用System V标准的意义,也是用C语言实现出多态的高级教科书!

相关推荐
wWYy.19 分钟前
Linux发送数据包的过程
linux·网络
小嵌同学23 分钟前
Linux 内核中的 Per-CPU 机制详解
linux·运维·arm开发·嵌入式
云飞云共享云桌面28 分钟前
自动化设备厂 10 人研发团队,如何共用一台服务器做 SolidWorks 建模?
运维·服务器·网络·3d·自动化·制造
筝筝ba1 小时前
Configure IP Address Via Different User Roles And Verify(1)
服务器
QH139292318801 小时前
NVIDIA H200 H300服务器
运维·服务器·开发语言·网络·信息与通信
xixiaoyunya1 小时前
中小微企业轻量组网方案的技术选型与实践:从传统专线到软定义隧道的成本与效能分析
服务器·php·apache
Hello-FPGA1 小时前
嵌入式LINUX 设备 ip配置后怎么保存才能掉电不消失?
linux·运维·服务器
奥莱维2 小时前
KNX酒店方案_KNX专用线与高端酒店技术逻辑
java·服务器·前端·数据库
工业一体机老司机2 小时前
Linux工业一体机自启动服务配置:systemd服务单元编写与开机优化实战
java·linux·服务器
zhixingheyi_tian2 小时前
Linux 之 ssh
linux·服务器·ssh