前言
!!!回归!!!
进程通信(IPC)
概念:进程间通信(Inter-Process Communication,IPC)是指两个进程之间产生数据交互
进程间通信需要依赖于操作系统内核的支持,为什么?
1、进程是分配资源的单位(包括内存地址空间),因此各进程拥有的内存地址空间相互独立
2、出于安全性考虑,一个进程不能直接访问另一个进程的地址空间
(你只能登你的QQ但是不能登我的QQ)
进程通信的方法
共享存储
概念:某个进程申请共享存储区,在该区中写入数据,其它进程就可以从中读取存放的数据
注意事项:
1、为避免出错,各个进程对共享空间的访问应该是互斥的,即一个进程在访问共享存储区时其它的进程不能访问
2、共享存储还可以细分为基于数据结构的共享和基于存储区的共享:
- 基于数据结构的共享:共享内存空间放什么数据、怎么放都是操作系统规定好的,比如共享空间里只能放一个长度为10的数组,这种共享方式速度慢,限制多,是一种低级通信方式
- 基于存储区共享:操作系统在内存中划出一片共享内存区,在这里放什么数据,怎么放都是由通信进程控制,拥有高度自治权,这种共享方式速度很快,是一种高级通信方式
消息传递
概念:进程间的数据交换以格式化的信息为单位,进程通过操作系统提供的“发送消息/接收消息”两个原语进行数据交换,格式化的消息由消息头和消息尾组成(消息头中包含发送进程ID【谁发】、接受进程ID【谁收】、消息长度等格式化信息,消息尾中包含要传递的具体数据)
直接通信方式
概念:消息发送进程要指明接受进程的ID
间接通信方式(信箱通信方式)
概念:通过“信箱”间接地通信
特点: 操作系统允许多个进程往同一个信箱send消息,也可以多个进程从一个信箱中receive消息
管道通信
概念:“管道”是一个特殊的共享文件(pipe文件)本质就是在内存中开辟一个大小固定的内存缓冲区
特点:
1、管道中数据的流动是单向的,且先进先出(FIFO,相当于一个队列,只能先读取队头元素,这也是它区别于共享存储的原因,在实际情况下管道其实是一个循环队列,即如果读数据速度小于写数据速度,当后面的空间被填满时,由于前面的数据已经被读取了,所以再写入数据时可以在前面的空出来的地方写数据,需要注意的是此时仍然遵循先进先出的性质,循环队列的队头是在不断变化的)
<夹带私货时间😋>设计循环队列:http://t.csdnimg.cn/9weVt
2、管道只能采用半双工通信(单向传递),某一段时间内只能实现单向的传输,如果要实现全双工通信,则需要设置两个管道
3、各进程要互斥的访问管道(由操作系统实现)
4、管道中的数据可以边读边写:
- 只要管道未空,读进程就可以从管道读取数据
- 只要管道未满,写进程就可以往管道写数据
5、 管道中的数据一旦被读出,就彻底消失,因此多个进程读同一个管道时,可能会错乱,对此通常有两种解决方案:
- 规定一个管道允许多个写进程,一个读进程(2014年408真题高教社官方答案)
- 规定一个管道可以有多个写进程,多个读进程,但系统会让各个读进程轮流从管道中读取数据(Linux操作系统的方案)
- 在实际应用过程中第二种方案更适用
本节思维导图
~over~