进程通信

概述

进程间通信(IPC)是指两个进程之间产生数据交互。

为什么进程需要操作系统支持

进程是分配系统资源的单位(包括内存地址空间),因此各进程拥有的内存地址空间相互独立。

为了保证安全,一个进程不能直接访问另一个进程的地址空间。

alt text

共享存储

为了避免出错。各个进程对共享空间的访问应该是互斥的。各个进程可使用的操作系统内核提供的同步互斥工具。(如P,V操作)

alt text

共享存储分为基于数据结构的共享:

  • 基于数据结构的共享:比如共享空间里只能放一个长度为10的数组。这种共享方式速度慢、限制多,是一种低级通信方式。
  • 基于存储区的共享:操作系统在内存中划出一块共享存储区,数据的形式,存放的位置都由通信进程控制,而不是操作系统。这种共享方式的速度很快,是一种高级通信方式。

消息传递

进程间的数据交换以格式化的信息为单位。进程通过操作系统提供的发送消息/接收消息两个原语进行数据交换。

alt text

直接通信方式

alt text

进程P向进程Q直接发送消息:

  1. 进程P先将向进程Q发送的数据封装为一个Message
  2. 进程P执行发送原语:Send(Q, msg),向Q进程发送数据。
  3. 进程Q发送的消息被挂到进程Q的PCB的消息队列中。
  4. 进程Q执行接收原语:Receive(P, &msg),将消息队列中的数据拿进来。

间接通信方式

alt text

进程P向进程Q间接发送消息:

  1. 进程P先将向进程Q发送的数据封装为一个Message
  2. 进程P执行发送原语:Send(A, msg),往邮箱A发送消息msg
  3. 进程Q执行接收原语:Receive(A, &msg),从邮箱A接收信息。

可以多个进程往同一个信箱send消息,也可以多个进程从同一个邮箱中receive信息。

管道通信

alt text

  1. 管道只能采用半双工通信,某一段时间内只能实现单向传输。要向实现全双共通信,则需要设置两个管道。
  2. 各进程要互斥地访问管道(由操作系统实现)
  3. 写进程往管道写数据,即便管道没被写满,只要管道没空,读进程就可以往管道读数据。
  4. 读进程从管道读数据,即便管道没被读空,只要管道没满,写进程就可以往管道写数据。
  5. 管道中的数据一旦被读出,就彻底消失,因此当多个进程同时访问管道时,可能会发生错乱。对此,通常有两个解决方案:
    • 一个管道允许多个写进程,一个读进程。
    • 允许有多个写进程,多个读进程,但是系统会让各个进程轮流从管道中读取数据。(Linux方案)