消息队列
SystemV除了共享内存之外,还有一个进程间通信的方式,是消息队列
我们说一切进程间通信的方式本质其实就是让不同进程看到同一份资源
这个消息队列的本质其实就是让两个进程可以同时看到这个队列,但是管理者其实还是操作系统
进程将数据块使用接口发送给操作系统,操作系统处理好之后插入到队列中,另一个进程也可以这样进行操作,对队列进行插入操作
当操作取出的接口时,给第一个进程另一个进程的数据块,给第二个进程第一个进程的数据块
那么其实这个消息队列并非一个严谨的先进先出,他是有标志的先进先出,本质上相当于两个队列,而且也不规定单向通信
这里与之前不同的其实就是标志,就是数据块的类型
操作系统对消息队列也需要进行管理,因此也有一个描述的结构体
并且由于都是SystemV标准下的结构,接口也都差不多,这里我们不过多介绍,等之后我们会对这里进行模拟实现
信号量
同步
这里是操作系统相关的内容,只做简单介绍,具体还是需要去读课本
我们说进程之间是具有异步性的,说白了就是我们无法确定哪个进程先执行,哪个进程后执行
这样就会造成一些问题
例如内存共享,两个进程通信时
写进程在还没写完的时候,读进程就读
甚至一个进程写、很多个进程读,这样就会造成数据不完整的问题
因此我们有必要让读进程等待,等到写进程写完之后,读进程再读
例如共享内存传递大块数据,管道传递单个标志,当标志标记写完成,读才能进行读取
这个东西叫做同步,也就是为了解决异步问题的一个东西
互斥
互斥在我们生活中也有遇到过,例如手机摄像头,当你打微信视频的时候,就没办法用相机拍照,当一个人用打印机的时候,另一个人就没办法控制
这本质上是对有限资源的保护问题,确保在一个时间段内,只能有一个人访问资源
这种资源称之为临界资源,那么共享内存其实就不算临界资源,除非我们也做保护,访问临界资源的代码也称为临界区
原语、原子性
这两个本质上是一个东西,用来描述一段代码无法被中断,就像原子一样不可再分
信号量
既然临界资源是有限的,我们怎么去描述呢
就是用信号量,信号量的本质其实就是计数器,用于描述临界资源数量的多少
进程可以用信号量对资源进行预定
但是信号量本身加减是不允许被中断的,因此操作系统专门封装了原语
也就是PV操作,申请资源就是P操作、释放资源就是V操作
多线程并发访问
因为临界资源是有限的,操作系统就不会一次性给你全部的资源
而是依次给进程一部分
有一个下载器工具就是利用了这个原理
百度网盘每次可能只用一个线程去申请网速资源,用于下载
但是这个下载器可以截获下载的链接,自己开很多线程并发访问下载,于是下载速度就快了
锁
信号量的本质其实就是一个计数器,用来表示资源的数量
但是当资源本身只有一个时,计数器也就只有01两种状态,是一个二元信号量
那么这个东西就称之为锁
利用这个锁我们就可以做到同步和互斥
因为资源是有限的,当进程无法获取资源时就会处于阻塞队列中
当我们想让A进程先运行到某个节点之后,B进程才能运行
我们就可以让A进程先使用P操作将资源占据,B进程再使用P操作的时候,发现资源没有了,只能阻塞,直到A进程执行了V操作释放资源,B进程才得以继续运行
这里只是一个最最基础且不一定对的描述
对于进程的同步与互斥问题,经典的同步互斥模型之后会介绍或实现