下面我们来讨论进程通讯
进程通讯也称之为进程间通讯
它是进程之间
进行信息交流和同步的机制
那我们在这里头呢
任何一个进程之间通讯机制
它都会提供两个基本的操作
一个是发送 一个是接收
不同的进程通讯机制后边的参数
和内容会有一些不一样
进程通讯的流程是这样的
如果里头有第三方参与的话
通讯的三方之间建立相应的通讯链路
然后通讯收发操作 交换信息
这是它的基本流程
不同通讯机制
进程间的链路的特征是不一样的
比如说我们考虑到的
有物理的链路 有逻辑的链路
那物理的链路呢
是你到底通过共享内存进行的
还是说是通过其他的方式
而逻辑的就是相当于
我这条链路的一些属性设置会不一样
首先我们来看进程间通讯的方式
这里头呢 分成两种
一种是间接通讯 另一种是直接通讯
我们首先来看间接通讯它是在怎么做
建成通讯呢 实际上是依赖于
操作系统内核完成的进程间的通讯
首先它在通讯进程和内核之间
建立相应的机构 能够支持这种通讯
比如说建立消息队列
然后一个进程可以把信息
发送到内核的消息队列上
然后另一个进程从这里读出来
从而实现进程A和B之间的通讯
这个通讯过程
它的生命周期甚至可以不一样
比如说A发信息的时候B还没有创建
而B接收数据的时候A可能已经关闭了
这种方式是间接通讯
而另一种方式呢 是直接通讯
直接通讯是在两个进程之间
建立一个通讯信道
这就是我们这里的共享信道
然后这个时候呢
因为它俩直接进行交流
两个进程必须同时存在才能够进行通讯
发方向共享信道里发送数据
收方从共享信道里读取数据
这是两种基本的通讯方式
下边我们具体来讨论这两种方式
第一个直接通讯
要进行直接通讯首先我们需要解决的
一个问题是命名问题
你到底和谁在进行通讯
所以在它的收发基本操作里头
都会有相应的一个参数
描述发送出去的数据给谁
也就是接收方
接收的时候我要描述从哪接收数据
那这时候是发送方的信息
这是直接通讯里头我需要做的事情
然后再有一个就是直接通讯的时候
通讯链路的一些属性
这条通信链路呢
通常情况下是自动建立起来的
然后在这里呢
两个通讯进程之间恰好能对应一条链路
每一对进程之间呢
也只有一条相应的链路存在
这是指同一类通讯介质
这个通讯链路呢
可能是单向的 也可以是双向的
间接通讯是通过操作系统
维护的消息队列来实现的进程间通讯
在这时候通讯的时候
我们首先需要描述的一个是消息队列
在内核里可能维护了多个消息队列
你要通讯的到底是哪一个
这跟我们直接通讯里
描述通讯对方的ID是一样的
这个地方每一个消息队列
有一个唯一的标识
那你关心的就直接是和内核之间通讯
某种角度上讲
你可以理解为间接通讯
是进程和内核之间的一种通讯机制
然后只有共享了相同消息队列的进程
它们之间才能够实现通讯
也正是由于这一条
我们可以通过操作系统内核的安全机制
实现两个进程之间通讯的保密性
这时候的通讯链路有些什么样的特征呢
它是这样的 只有共享了消息队列的进程
它才可以建立这条链路
建立不了链路
它们俩也就通讯不起来了
这是第一个 然后这条链路呢
可以是单向的 也可以是双向的
这时候消息队列
和进程之间的对应关系
就变成是多对多了
一个消息队列可以与多个进程相关联
每一个进程也可以和
多个消息队列进行共享
间接通讯的通讯流程是这样的
创建消息队列肯定是
先运行的进程去创建
然后是与消息队列之间的消息的收发
最后我这个消息队列还需要撤销
要不然的话
在内核当中可能会有多个
没有人再去用的消息队列
它的收发跟我们前边的直接通讯
不一样的地方是
这时候描述的是消息队列
发方并不关心收方到底是谁
它关心的是消息队列是谁
接收也是一样的
通讯的过程当中
还有一个属性是我们关心的
那就是阻塞与非阻塞
有的时候也称之为同步和异步通讯
在阻塞通讯里头呢
我每一次通讯都必须保证它成功
这是它阻塞通讯的基本特征
分成发送和接收我们来讨论
阻塞发送呢是指
发送者在发出消息之后进入等待
直到接收者成功接收
也就是说我发消息这一方一定要等到
接收方成功接收到了我这边才结束
而阻塞接收呢
是指接收方在请求接收消息之后
它就进入等待
直到成功收到一条消息
如果说我收不到消息的话
那么这时候呢 我会一直在这等着
这是阻塞通讯 还有相对应的呢
是非阻塞通讯
发送的时候是发出消息之后
我立即就可以进行其他的做了
我不管收方是否收到
而非阻塞接收呢 是指我去接收
如果说这时候没有消息发送
在这个请求之后我收不到任何消息
它和阻塞通讯相反
它不会等着一定要收到一条消息
它才返回
这两种通讯方式呢
阻塞通讯和非阻塞通讯
它们各有各的适用场合
应用进程在进行通讯的时候呢
需要选择哪种是你适合的
那接下来我们还有一个
需要讨论的是通讯链路的缓冲特征
也就是说我们在收发消息的时候
在这个链路上
是否有可能对信息进行缓存
这里就分成三种情况
一种是零容量
也就是说发出去的数据
必须有接收方接收
否则的话这个中间就进行不下去了
这时候呢
没有接收方的时候它就会等待
而有限容量是指
通讯链路上有缓冲队列
在它满了之后 发送方必须等待
而无限容量呢
发送方任何时候都可以发
发出去的数据在链路上缓存
收方呢 在任何时候再来进行接收
这是我们关于进程通讯的一个简要介绍
下边我们会来具体说明几种通讯机制