操作系统-进程通信

在进程间要传输大量数据时,应当利用OS提供的高级通信工具,该工具的主要特点是

  • 使用方便。OS隐藏了实现进程通信的具体细节,向用户提供了一组用于实现高级通信的命令(原语),用户可以方便地直接利用它实现进程之间的通信。
  • 高效地传送数据。用户可以直接利用高级通信命令(原语)高效地传送大量的数据。

进程通信的类型

目前,高级通信机制可归为四大类:共享存储器系统、管道通信系统、消息传递系统以及客户机-服务器系统

共享存储器系统(Shared-Memory System)

相互通信的进程共享某些数据结构和共享存储区,进程之间能够通过这些空间进行通信。因此,可以分成以下两种类型:

  1. 基于共享数据结构的通信方式。
    操作系统提供共享存储器,由程序员负责对公用数据结构的设置以及对进程间同步的处理。这种通信方式仅适于传递相对少量的数据,通信效率低下,属于低级通信。
  2. 基于共享存储区的通信方式。
    为了传输大量数据,在内存中划出了一块共享存储区域,诸进程可通过对该共享区的读或写交换信息,实现通信,数据的形式和位置甚至访问控制都是由进程负责,而不是OS。

管道(pipe)通信系统

管道,指用于连接一个读进程和一个写进程以实现它们之间通信的一个共享文件,又叫pipe文件。
为了协调双方的通信,管道机制必须提供以下三方面的协调能力。

  1. 互斥,当一个进程正在对pipe执行读/写操作时,其它进程必须等待
  2. 同步,指当写(输入)进程把一定数量(如4KB)的数据写入pipe,便睡眠等待,直到读(输出)进程取走数据后再把它唤醒。
  3. 确定对方是否存在,只有确定了对方已存在才能进行通信

怎么感觉有点像go的channel呢

消息传递系统(Message passing system)

该机制中,进程不必借助任何共享存储区或数据结构,而是以格式化的消息(message)为单位,将通信的数据封装在消息中,并利用操作系统提供的一组通信命令(原语),在进程间进行消息传递,完成进程间的数据交换。

该机制又可以分为两类:

  1. 直接通信方式,指发送进程利用OS所提供的发送原语,直接把消息发送给目标进程
  2. 间接通信方式,指发送和接收进程,都通过共享中间实体(成为邮箱)的方式进行消息的发送和接收,完成进程间的通信。

客户机-服务器系统(Client-Server-system)

在客户机-服务器系统的通信机制下,在网络环境的各种应用领域已成为当前主流的通信实现机制,主要的实现方法分为三类:套接字、远程过程调用、和远程方法调用

  1. 套接字(Socket)

套接字可以分为两类

  • 基于文件型。通信原理类似于前面提到的管道
  • 基于网络型。
  1. 远程过程调用和远程方法调用

RPC引入一个存根(stub)的概念:在本地客户端,每个能够独立运行的远程过程都拥有一个客户存根(client stubborn),本地进程调用远程过程实际是调用该过程关联的存根;与此类似,在每个远程进程所在的服务器端,其所对应的实际可执行进程也存在一个服务器存根(stub)与其关联。本地客户存根与对应的远程服务器存根一般也是处于阻塞状态,等待消息。

实际上,远程过程调用的主要步骤是:

  1. 本地过程调用者以一般方式调用远程在本地关联的客户存根,传递相应的参数,然后将控制权转移给客户存根;
  2. 客户存根执行,完成包括过程名和调用参数等信息的建立,将控制权转移给本地客户进程;
  3. 本地客户进程完成与服务器的消息传递,将消息发送到远程服务器进程;
  4. 远程服务器进程接收到消息后转入执行,并根据其中的远程过程名找到对应的服务器存根,将消息转给存根;
  5. 该服务器存根接到消息后,由阻塞状态转入执行状态,拆开消息从中取出过程调用的参数,然后以一般方式调用服务器上关联的过程
  6. 在服务器的远程过程运行完毕后,将结果返回给与之关联的服务器存根;
  7. 该服务器存根获得控制权运行,将结果打包为消息,并将控制权转移给远程服务器进程
  8. 远程服务器进程将消息发送回客户端
  9. 本地客户进程接收到消息后,根据其中的过程名将消息存入关联的客户存根,再将控制权转移给客户存根
  10. 客户存根从消息中取出结果,返回给本地调用者进程,并完成控制权的转移