操作系统基础9-进程通信IPC

操作系统基础9-进程通信IPC

2020-10-21 18:00·重学IT的老猫

什么是进程通信?

进程通信(Interprocess Communication)就是指进程之间的信息交换。

进程是分配系统资源的单位(包括内存地址空间) ,各个进程拥有的内存地址空间相互独立,为了保证安全, 操作系统中规定一个进程不能直接访问另一个进程的地址空间。如下图中的进程1就不能直接访问进程2的地址空间。

操作系统基础9-进程通信IPC

但是进程之间的信息交换又是必须要实现的。比如微信发送图片时,就是微信这个进程和手机管理图片的进程间的通信, 取出图片并且进行发送。

进程通信的方式

主要分为三种:管道通信消息传递共享存储

  • 管道通信:进程间基于内存文件的一种通信机制

操作系统基础9-进程通信IPC

管道通信

管道:指用于连接读写进程的一个共享文件,又名pipe文件。其实就是在内存中开辟的一个大小固定的缓冲区。管道又可以分为匿名管道命名管道。

在Linux下,管道是由pipe这个函数创建的,fd[0] 用于读,fd[1] 用于写。

操作系统基础9-进程通信IPC

匿名管道:只支持半双工通信(单向交替传输);只能用于父子进程或兄弟进程之间,必须用于具有亲缘关系的进程间的通信是特殊的文件,存在于内存。

命名管道(named pipeFIFO):可以在无关的进程之间交换数据。以一种特殊设备文件形式存在于文件系统中,可以通过文件路径名来指出。FIFO 常用于客户-服务器应用程序中,FIFO 用作汇聚点,在客户进程和服务器进程之间传递数据。

消息传递

消息队列,是消息的链接表,存放在内核中。一个消息队列由一个标识符来标识。

操作系统基础9-进程通信IPC

消息传递模型

进程间的数据交换以格式化的消息(Message)为单位。进程通过操作系统提供的“发送/接收消息”两个原语进行数据交换。是由操作系统维护的以字节序列为基本单位的通信机制。

操作系统基础9-进程通信IPC

相比于 FIFO,消息队列具有以下优点:

  1. 消息队列可以独立于读写进程存在,从而避免了 FIFO 中同步管道的打开和关闭时可能产生的困难;
  2. 避免了 FIFO 的同步阻塞问题,不需要进程自己提供同步方法;
  3. 读进程可以根据消息类型有选择地接收消息,而不像 FIFO 那样只能默认地接收。

消息传递方式也分为两种,分别是直接通信方式间接通信方式

直接通信方式

进程通信采用消息传递的直接通信方式时,消息会直接挂到接收进程的消息缓冲队列上。
举个例子:假如,进程1给进程2发送了两个消息。那进程2的消息缓冲队列如下。

操作系统基础9-进程通信IPC

间接通信方式

进程通信采用消息传递的间接通信方式时,发送进程会把消息发送到一个中间实体(信箱)中,而接收进程通过某些方法可以取得属于自己的消息,因此,这种方式也被称为”信箱通信方式“。

操作系统基础9-进程通信IPC

  • 共享存储

共享存储就是操作系统另外分配一个内存区域用于进程间的通信,这就是共享空间,两个进程都可以访问这个共享空间, 但是两个进程对共享空间的访问必须是互斥的,即同一时间段只能有一个进程访问这个空间。 操作系统只负责提供共享空间和同步互斥工具。(有关进程的同步、互斥后续专门来说)

操作系统基础9-进程通信IPC

共享存储模型

然后共享存储又分为基于数据结构的共享和基于存储区的共享。

1.基于数据结构的共享:比如它的共享空间只能放一个长度为10的数组,数据量比较小,存储的数据形式也有限制。 所以这种方式速度慢,限制多, 是一种低级通信

2.基于存储区的共享:此时操作系统只负责提供内存,然后由进程来控制数据的形式和存放位置。所以这种方式速度更快,是一种高级的共享方式

-------------本文结束 感谢阅读-------------