操作系统基础9-进程通信IPC
2020-10-21 18:00·重学IT的老猫
什么是进程通信?
进程通信(Interprocess Communication)就是指进程之间的信息交换。
进程是分配系统资源的单位(包括内存地址空间) ,各个进程拥有的内存地址空间相互独立,为了保证安全, 操作系统中规定一个进程不能直接访问另一个进程的地址空间。如下图中的进程1就不能直接访问进程2的地址空间。
但是进程之间的信息交换又是必须要实现的。比如微信发送图片时,就是微信这个进程和手机管理图片的进程间的通信, 取出图片并且进行发送。
进程通信的方式
主要分为三种:管道通信,消息传递,共享存储
- 管道通信:进程间基于内存文件的一种通信机制
管道通信
管道:指用于连接读写进程的一个共享文件,又名pipe文件。其实就是在内存中开辟的一个大小固定的缓冲区。管道又可以分为匿名管道、命名管道。
在Linux下,管道是由pipe这个函数创建的,fd[0] 用于读,fd[1] 用于写。
匿名管道:只支持半双工通信(单向交替传输);只能用于父子进程或兄弟进程之间,必须用于具有亲缘关系的进程间的通信**。**是特殊的文件,存在于内存。
命名管道(named pipe或FIFO):可以在无关的进程之间交换数据。以一种特殊设备文件形式存在于文件系统中,可以通过文件路径名来指出。FIFO 常用于客户-服务器应用程序中,FIFO 用作汇聚点,在客户进程和服务器进程之间传递数据。
消息传递
消息队列,是消息的链接表,存放在内核中。一个消息队列由一个标识符来标识。
消息传递模型
进程间的数据交换以格式化的消息(Message)为单位。进程通过操作系统提供的“发送/接收消息”两个原语进行数据交换。是由操作系统维护的以字节序列为基本单位的通信机制。
相比于 FIFO,消息队列具有以下优点:
- 消息队列可以独立于读写进程存在,从而避免了 FIFO 中同步管道的打开和关闭时可能产生的困难;
- 避免了 FIFO 的同步阻塞问题,不需要进程自己提供同步方法;
- 读进程可以根据消息类型有选择地接收消息,而不像 FIFO 那样只能默认地接收。
消息传递方式也分为两种,分别是直接通信方式和间接通信方式。
直接通信方式
进程通信采用消息传递的直接通信方式时,消息会直接挂到接收进程的消息缓冲队列上。 举个例子:假如,进程1给进程2发送了两个消息。那进程2的消息缓冲队列如下。
间接通信方式
进程通信采用消息传递的间接通信方式时,发送进程会把消息发送到一个中间实体(信箱)中,而接收进程通过某些方法可以取得属于自己的消息,因此,这种方式也被称为"信箱通信方式"。
- 共享存储
共享存储就是操作系统另外分配一个内存区域用于进程间的通信,这就是共享空间,两个进程都可以访问这个共享空间, 但是两个进程对共享空间的访问必须是互斥的,即同一时间段只能有一个进程访问这个空间。 操作系统只负责提供共享空间和同步互斥工具。(有关进程的同步、互斥后续专门来说)
共享存储模型
然后共享存储又分为基于数据结构的共享和基于存储区的共享。
1.基于数据结构的共享:比如它的共享空间只能放一个长度为10的数组,数据量比较小,存储的数据形式也有限制。 所以这种方式速度慢,限制多, 是一种低级通信
2.基于存储区的共享:此时操作系统只负责提供内存,然后由进程来控制数据的形式和存放位置。所以这种方式速度更快,是一种高级的共享方式