0 00:00:00,000 --> 00:00:07,040 1 00:00:07,120 --> 00:00:11,280 下面我们来讨论进程通讯 2 00:00:11,320 --> 00:00:15,520 进程通讯也称之为进程间通讯 3 00:00:15,560 --> 00:00:17,640 它是进程之间 4 00:00:17,680 --> 00:00:22,320 进行信息交流和同步的机制 5 00:00:22,360 --> 00:00:24,520 那我们在这里头呢 6 00:00:24,560 --> 00:00:26,920 任何一个进程之间通讯机制 7 00:00:26,960 --> 00:00:29,560 它都会提供两个基本的操作 8 00:00:29,600 --> 00:00:32,160 一个是发送 一个是接收 9 00:00:32,200 --> 00:00:35,320 不同的进程通讯机制后边的参数 10 00:00:35,360 --> 00:00:39,440 和内容会有一些不一样 11 00:00:39,480 --> 00:00:42,160 进程通讯的流程是这样的 12 00:00:42,200 --> 00:00:44,520 如果里头有第三方参与的话 13 00:00:44,560 --> 00:00:48,840 通讯的三方之间建立相应的通讯链路 14 00:00:48,880 --> 00:00:53,040 然后通讯收发操作 交换信息 15 00:00:53,080 --> 00:00:54,920 这是它的基本流程 16 00:00:54,960 --> 00:00:57,680 不同通讯机制 17 00:00:57,720 --> 00:01:00,600 进程间的链路的特征是不一样的 18 00:01:00,640 --> 00:01:02,200 比如说我们考虑到的 19 00:01:02,240 --> 00:01:04,760 有物理的链路 有逻辑的链路 20 00:01:04,800 --> 00:01:06,040 那物理的链路呢 21 00:01:06,080 --> 00:01:08,800 是你到底通过共享内存进行的 22 00:01:08,840 --> 00:01:12,640 还是说是通过其他的方式 23 00:01:12,680 --> 00:01:14,560 而逻辑的就是相当于 24 00:01:14,600 --> 00:01:19,200 我这条链路的一些属性设置会不一样 25 00:01:19,240 --> 00:01:23,680 首先我们来看进程间通讯的方式 26 00:01:23,720 --> 00:01:25,160 这里头呢 分成两种 27 00:01:25,200 --> 00:01:28,040 一种是间接通讯 另一种是直接通讯 28 00:01:28,080 --> 00:01:31,600 我们首先来看间接通讯它是在怎么做 29 00:01:31,640 --> 00:01:33,520 建成通讯呢 实际上是依赖于 30 00:01:33,560 --> 00:01:37,400 操作系统内核完成的进程间的通讯 31 00:01:37,440 --> 00:01:40,800 首先它在通讯进程和内核之间 32 00:01:40,840 --> 00:01:45,360 建立相应的机构 能够支持这种通讯 33 00:01:45,400 --> 00:01:47,880 比如说建立消息队列 34 00:01:47,920 --> 00:01:51,840 然后一个进程可以把信息 35 00:01:51,880 --> 00:01:55,080 发送到内核的消息队列上 36 00:01:55,120 --> 00:01:57,960 然后另一个进程从这里读出来 37 00:01:58,000 --> 00:02:01,120 从而实现进程A和B之间的通讯 38 00:02:01,160 --> 00:02:02,680 这个通讯过程 39 00:02:02,720 --> 00:02:04,680 它的生命周期甚至可以不一样 40 00:02:04,720 --> 00:02:08,960 比如说A发信息的时候B还没有创建 41 00:02:09,000 --> 00:02:13,680 而B接收数据的时候A可能已经关闭了 42 00:02:13,720 --> 00:02:16,280 这种方式是间接通讯 43 00:02:16,320 --> 00:02:19,600 而另一种方式呢 是直接通讯 44 00:02:19,640 --> 00:02:22,600 直接通讯是在两个进程之间 45 00:02:22,640 --> 00:02:24,320 建立一个通讯信道 46 00:02:24,360 --> 00:02:27,080 这就是我们这里的共享信道 47 00:02:27,120 --> 00:02:29,160 然后这个时候呢 48 00:02:29,200 --> 00:02:31,360 因为它俩直接进行交流 49 00:02:31,400 --> 00:02:37,120 两个进程必须同时存在才能够进行通讯 50 00:02:37,160 --> 00:02:41,000 发方向共享信道里发送数据 51 00:02:41,040 --> 00:02:44,520 收方从共享信道里读取数据 52 00:02:44,560 --> 00:02:48,400 这是两种基本的通讯方式 53 00:02:48,440 --> 00:02:50,680 下边我们具体来讨论这两种方式 54 00:02:50,720 --> 00:02:53,800 第一个直接通讯 55 00:02:53,840 --> 00:02:56,720 要进行直接通讯首先我们需要解决的 56 00:02:56,760 --> 00:02:58,400 一个问题是命名问题 57 00:02:58,440 --> 00:03:00,320 你到底和谁在进行通讯 58 00:03:00,360 --> 00:03:02,880 所以在它的收发基本操作里头 59 00:03:02,920 --> 00:03:04,560 都会有相应的一个参数 60 00:03:04,600 --> 00:03:07,480 描述发送出去的数据给谁 61 00:03:07,520 --> 00:03:09,080 也就是接收方 62 00:03:09,120 --> 00:03:13,000 接收的时候我要描述从哪接收数据 63 00:03:13,040 --> 00:03:15,360 那这时候是发送方的信息 64 00:03:15,400 --> 00:03:18,320 这是直接通讯里头我需要做的事情 65 00:03:18,360 --> 00:03:21,160 然后再有一个就是直接通讯的时候 66 00:03:21,200 --> 00:03:23,160 通讯链路的一些属性 67 00:03:23,200 --> 00:03:24,320 这条通信链路呢 68 00:03:24,360 --> 00:03:27,240 通常情况下是自动建立起来的 69 00:03:27,280 --> 00:03:28,440 然后在这里呢 70 00:03:28,480 --> 00:03:34,400 两个通讯进程之间恰好能对应一条链路 71 00:03:34,440 --> 00:03:37,000 每一对进程之间呢 72 00:03:37,040 --> 00:03:39,800 也只有一条相应的链路存在 73 00:03:39,840 --> 00:03:44,120 这是指同一类通讯介质 74 00:03:44,160 --> 00:03:45,200 这个通讯链路呢 75 00:03:45,240 --> 00:03:51,760 可能是单向的 也可以是双向的 76 00:03:51,800 --> 00:03:54,280 间接通讯是通过操作系统 77 00:03:54,320 --> 00:03:58,280 维护的消息队列来实现的进程间通讯 78 00:03:58,320 --> 00:03:59,880 在这时候通讯的时候 79 00:03:59,920 --> 00:04:04,360 我们首先需要描述的一个是消息队列 80 00:04:04,400 --> 00:04:07,640 在内核里可能维护了多个消息队列 81 00:04:07,680 --> 00:04:09,520 你要通讯的到底是哪一个 82 00:04:09,560 --> 00:04:10,840 这跟我们直接通讯里 83 00:04:10,880 --> 00:04:14,200 描述通讯对方的ID是一样的 84 00:04:14,240 --> 00:04:15,280 这个地方每一个消息队列 85 00:04:15,320 --> 00:04:17,360 有一个唯一的标识 86 00:04:17,400 --> 00:04:20,480 那你关心的就直接是和内核之间通讯 87 00:04:20,520 --> 00:04:21,480 某种角度上讲 88 00:04:21,520 --> 00:04:23,200 你可以理解为间接通讯 89 00:04:23,240 --> 00:04:26,960 是进程和内核之间的一种通讯机制 90 00:04:27,000 --> 00:04:31,280 然后只有共享了相同消息队列的进程 91 00:04:31,320 --> 00:04:33,560 它们之间才能够实现通讯 92 00:04:33,600 --> 00:04:34,880 也正是由于这一条 93 00:04:34,920 --> 00:04:38,240 我们可以通过操作系统内核的安全机制 94 00:04:38,280 --> 00:04:43,200 实现两个进程之间通讯的保密性 95 00:04:43,240 --> 00:04:45,720 这时候的通讯链路有些什么样的特征呢 96 00:04:45,760 --> 00:04:50,160 它是这样的 只有共享了消息队列的进程 97 00:04:50,200 --> 00:04:52,360 它才可以建立这条链路 98 00:04:52,400 --> 00:04:53,000 建立不了链路 99 00:04:53,040 --> 00:04:54,640 它们俩也就通讯不起来了 100 00:04:54,680 --> 00:04:57,280 这是第一个 然后这条链路呢 101 00:04:57,320 --> 00:04:59,800 可以是单向的 也可以是双向的 102 00:04:59,840 --> 00:05:00,920 这时候消息队列 103 00:05:00,960 --> 00:05:03,080 和进程之间的对应关系 104 00:05:03,120 --> 00:05:04,480 就变成是多对多了 105 00:05:04,520 --> 00:05:08,520 一个消息队列可以与多个进程相关联 106 00:05:08,560 --> 00:05:10,800 每一个进程也可以和 107 00:05:10,840 --> 00:05:15,960 多个消息队列进行共享 108 00:05:16,000 --> 00:05:18,920 间接通讯的通讯流程是这样的 109 00:05:18,960 --> 00:05:20,640 创建消息队列肯定是 110 00:05:20,680 --> 00:05:23,480 先运行的进程去创建 111 00:05:23,520 --> 00:05:28,880 然后是与消息队列之间的消息的收发 112 00:05:28,920 --> 00:05:31,680 最后我这个消息队列还需要撤销 113 00:05:31,720 --> 00:05:32,480 要不然的话 114 00:05:32,520 --> 00:05:34,920 在内核当中可能会有多个 115 00:05:34,960 --> 00:05:38,120 没有人再去用的消息队列 116 00:05:38,160 --> 00:05:40,880 它的收发跟我们前边的直接通讯 117 00:05:40,920 --> 00:05:42,760 不一样的地方是 118 00:05:42,800 --> 00:05:46,480 这时候描述的是消息队列 119 00:05:46,520 --> 00:05:49,440 发方并不关心收方到底是谁 120 00:05:49,480 --> 00:05:52,680 它关心的是消息队列是谁 121 00:05:52,720 --> 00:05:54,320 接收也是一样的 122 00:05:54,360 --> 00:05:55,800 通讯的过程当中 123 00:05:55,840 --> 00:05:57,840 还有一个属性是我们关心的 124 00:05:57,880 --> 00:06:00,000 那就是阻塞与非阻塞 125 00:06:00,040 --> 00:06:03,480 有的时候也称之为同步和异步通讯 126 00:06:03,520 --> 00:06:04,880 127 00:06:04,920 --> 00:06:07,240 在阻塞通讯里头呢 128 00:06:07,280 --> 00:06:09,720 我每一次通讯都必须保证它成功 129 00:06:09,760 --> 00:06:12,360 这是它阻塞通讯的基本特征 130 00:06:12,400 --> 00:06:15,120 分成发送和接收我们来讨论 131 00:06:15,160 --> 00:06:16,520 阻塞发送呢是指 132 00:06:16,560 --> 00:06:19,840 发送者在发出消息之后进入等待 133 00:06:19,880 --> 00:06:22,360 直到接收者成功接收 134 00:06:22,400 --> 00:06:25,000 也就是说我发消息这一方一定要等到 135 00:06:25,040 --> 00:06:28,400 接收方成功接收到了我这边才结束 136 00:06:28,440 --> 00:06:30,880 而阻塞接收呢 137 00:06:30,920 --> 00:06:34,880 是指接收方在请求接收消息之后 138 00:06:34,920 --> 00:06:36,000 它就进入等待 139 00:06:36,040 --> 00:06:38,360 直到成功收到一条消息 140 00:06:38,400 --> 00:06:40,520 如果说我收不到消息的话 141 00:06:40,560 --> 00:06:43,800 那么这时候呢 我会一直在这等着 142 00:06:43,840 --> 00:06:48,200 这是阻塞通讯 还有相对应的呢 143 00:06:48,240 --> 00:06:50,280 是非阻塞通讯 144 00:06:50,320 --> 00:06:52,280 发送的时候是发出消息之后 145 00:06:52,320 --> 00:06:54,000 我立即就可以进行其他的做了 146 00:06:54,040 --> 00:06:56,960 我不管收方是否收到 147 00:06:57,000 --> 00:07:02,160 而非阻塞接收呢 是指我去接收 148 00:07:02,200 --> 00:07:05,080 如果说这时候没有消息发送 149 00:07:05,120 --> 00:07:07,120 在这个请求之后我收不到任何消息 150 00:07:07,160 --> 00:07:09,080 它和阻塞通讯相反 151 00:07:09,120 --> 00:07:11,240 它不会等着一定要收到一条消息 152 00:07:11,280 --> 00:07:13,040 它才返回 153 00:07:13,080 --> 00:07:14,920 这两种通讯方式呢 154 00:07:14,960 --> 00:07:17,160 阻塞通讯和非阻塞通讯 155 00:07:17,200 --> 00:07:19,880 它们各有各的适用场合 156 00:07:19,920 --> 00:07:22,040 应用进程在进行通讯的时候呢 157 00:07:22,080 --> 00:07:24,920 需要选择哪种是你适合的 158 00:07:24,960 --> 00:07:26,160 那接下来我们还有一个 159 00:07:26,200 --> 00:07:30,080 需要讨论的是通讯链路的缓冲特征 160 00:07:30,120 --> 00:07:33,480 也就是说我们在收发消息的时候 161 00:07:33,520 --> 00:07:34,680 在这个链路上 162 00:07:34,720 --> 00:07:38,320 是否有可能对信息进行缓存 163 00:07:38,360 --> 00:07:40,320 这里就分成三种情况 164 00:07:40,360 --> 00:07:42,000 一种是零容量 165 00:07:42,040 --> 00:07:44,080 也就是说发出去的数据 166 00:07:44,120 --> 00:07:45,920 必须有接收方接收 167 00:07:45,960 --> 00:07:49,240 否则的话这个中间就进行不下去了 168 00:07:49,280 --> 00:07:49,880 这时候呢 169 00:07:49,920 --> 00:07:53,000 没有接收方的时候它就会等待 170 00:07:53,040 --> 00:07:54,960 而有限容量是指 171 00:07:55,000 --> 00:07:57,960 通讯链路上有缓冲队列 172 00:07:58,000 --> 00:08:00,600 在它满了之后 发送方必须等待 173 00:08:00,640 --> 00:08:02,280 174 00:08:02,320 --> 00:08:04,280 而无限容量呢 175 00:08:04,320 --> 00:08:06,440 发送方任何时候都可以发 176 00:08:06,480 --> 00:08:09,480 发出去的数据在链路上缓存 177 00:08:09,520 --> 00:08:12,680 收方呢 在任何时候再来进行接收 178 00:08:12,760 --> 00:08:17,040 这是我们关于进程通讯的一个简要介绍 179 00:08:17,080 --> 00:08:20,400 下边我们会来具体说明几种通讯机制 180 00:08:20,440 --> 00:08:20,480