一、system V消息队列(了解)
- 消息队列提供了一个从一个进程向另外一个进程发送一块数据的方法。
- 每个数据块都被认为是有一个类型,接收者进程接收的数据块可以有不同的类型值。
- 特性方面 :IPC(处理进程间通信)资源必须删除,否则不会自动清除,除非重启,所以
system V IPC资源的生命周期随内核
。
有兴趣的伙伴可以自行学习对应的接口
二、system V信号量(了解)
1.信号量是什么
信号量本质是一个计数器
,通常用来表示公共资源中,资源量多少的问题。
公共资源
:可以被多个进程同时访问的资源。
访问没有保护的公共资源,会产生数据不一致问题
。比如,一段数据必须要完整读取才有意义,但是在写端进程还没写完的情况下,读端进程就把数据读走了。
———— 我是一条知识分割线 ————
2.临界资源和临界区
那些被保护起来的公共资源,我们称之为 临界资源
。在我们的计算机中虽然有很多临界资源,但是大部分还是独立资源(非公共)。
资源(内存、文件、网络等)是要被进程使用的,它一定会有对应的代码来访问这部分的临界资源,这部分可以访问资源的代码,我们称之为 临界区
。当然,有临界区,就肯定有非临界区,即与资源访问无关联的代码。
———— 我是一条知识分割线 ————
3.互斥
某个共享资源在一段时间之内只允许一个进程访问,不允许其他进程访问,这种进程之间的关系我们称之为 互斥
。在编程中,我们通常需要 锁
来实现。
原子性
:要么不做,要做就做完。举一个例子,银行转账,要么成功,要么失败,不允许出现转账的钱不翼而飞的情况。
———— 我是一条知识分割线 ————
4.为什么要信号量
共享资源分两种:一种是整体使用的共享资源,另一种是将一个整体资源划分为一个个子资源给进程使用。
那么问题来了,我们如何知道这些资源的一个个子资源有没有被占用呢?
此时,信号量可以帮助我们解决这个问题。在我们想要某种资源时,信号量可以帮助我们做 “预定”
,我们可以用信号量的大小来帮助我们确认这个整体资源的使用情况。
举一个简单的例子,一个整体资源有 20个子资源,我们可以信号量 sem=20,当有一个进程需要访问其中一个子资源时,sem–(预定资源),进程访问,访问完成,sem++(释放资源)。这样,我们就通过 sem确定了整体资源的使用情况。
我们称预定资源的操作称为 P操作,释放资源的操作称为 V操作,它们加起来就是一个很重要的基础操作 PV操作
。
当一个整体资源的信号量初始值为 1,就证明这个资源只允许一个进程访问,这种信号量我们称之为 二元信号量
。二元信号量标识的资源,具有互斥功能
。
在上文中我们提及了原子性的知识,根据上图中的文字推导,我们可以知道信号量也是公共资源(因为它要让所有要申请资源的进程看到), PV操作具有原子性
。
有兴趣的伙伴可以自行学习对应的接口
三、IPC资源的组织方式
system V共享内存、system V消息队列 、 system V信号量,它们都是system V标准的额进程间通信。
因此,它们的接口相似度非常高,操作系统的设计者在此基础上,为了方便同一管理它们的资源,设计了一种IPC资源的组织方式,那就是指针数组。
接口查看指令如下:
[root@VM-12-11-centos ~]$ man shmctl #共享内存
[root@VM-12-11-centos ~]$ man msgctl #消息队列
[root@VM-12-11-centos ~]$ man semctl #信号量
将每个system V标准的通信方式的结构体的指针放到指针数组中,让用户可以通过 类型强转 + 下标 + (./->其它属性)
的方法具体访问某个特定通信方式的特定方法。
图解如下:
结语
🌹🌹 system V消息队列 + system V信号量 的知识大概就讲到这里啦,博主后续会继续更新更多C++ 和 Linux的相关知识,干货满满,如果觉得博主写的还不错的话,希望各位小伙伴不要吝啬手中的三连哦!你们的支持是博主坚持创作的动力!💪💪