【概述】
进程通信是指进程间的信息交换,由于进程是系统分配资源的单位,因此各进程内存地址空间是独立的,一个进程不能直接访问另一个进程的地址空间
而进程的互斥与同步往往需要在进程间交换信息,信号量机制虽是有效的同步工具,但作为通信工具来说效率低、通信对用户不透明,因此常常归类为低级进程通信
为了使通信时用户使用方便、能高效地传递大量数据,OS 隐藏了实现进程通信的具体细节,向用户提供了一组用于实现高级通信命令(原语),利用这些原语,可以高效地传送大量数据,也即高级进程通信
高级进程通信方法主要有共享存储器系统、消息传递系统、管道通信系统、远程过程调用等
【共享存储器系统】
共享存储器系统是指,在通信的进程间存在一块可以被直接访问的共享空间,通过对这片共享空间的读写操作,来实现进程间的信息交换
需要注意的是,在对共享空间进行读写操作时,需要使用 $P$、$V$ 操作,来对共享空间进行互斥访问
对于共享存储器系统来说,其又分为以下两种类型:
- 基于共享数据结构的通信(低级通信):OS 仅提供共享存储器,程序员负责对公用数据结构设置与对进程间同步进行处理,通信效率低下,适合于传递少量数据
- 基于共享存储区的通信(高级通信):在存储器中划出了一块共享存储区,诸进程可通过共享存储区中数据的读写来实现通信,适合于传输大量数据
【消息传递系统】
概述
消息传递系统是进程通信方法中应用最广泛的一种,其以格式化的消息为单位,屏蔽底层复杂的操作
根据实现方式的不同,可分为以下两类:
- 直接通信方式:发送进程利用 OS 发送消息原语,直接将消息发送给目标进程,接收进程通过接收消息原语来接收信息,发送进程和接收进程都以显式方式,提供对方的标识符
- 间接通信方式:发送、接收进程均通过共享中间实体(信箱)进行消息的发送与接收,因此该种方法又被称为信箱通信
直接通信方式
直接通信原语
系统通信命令分为两类,一类是对称寻址方式,一类是非对称寻址方式。
对于对称寻址方式来说,有以下两种通信命令:
Send(receiver, message)
:将一个消息给接收进程receiver
Receive(sender, message)
:接收sender
发送的消息
对于非对称寻址方法来说,有以下两种通信命令:
send(P, message)
:发送一个消息给进程 $P$receive(id, message)
:接收任何来自进程的消息,id
为进行通信的发送方id
同步方式
在进程间进行通信时,同样要有进程同步机制,从而使各进程间能协调通信
无论是发送进程还是接收进程,在完成消息发送、接收后,都存在两种可能:进程继续发送/接收、进程阻塞
由此,可得到三种情况:
- 发送进程阻塞,接收进程阻塞:该情况主要用于进程间紧密同步,即两进程间无缓冲时
- 发送进程不阻塞,接收进程阻塞:该情况是应用最广的进程同步方式,常用于服务器程序,接收进程平时处于阻塞状态,只有当消息发送过来才被唤醒
- 发送进程不阻塞,接收进程不阻塞:该情况利用缓冲队列的数据结构,仅当某事件发生无法运行时,才阻塞起来进行等待
通信链路
为在发送进程与接收进程间通信,必须在两者间建立一条通信链路,根据通信方式的不同,通信链路分为单向通信链路、双向通信链路
在计算机网络中,发送进程在通信前用显式的及建立连接原语请求系统为其建立一条通信链路,在通信完成后拆除链路
在单机系统中,发送进程无须明确提出建立链路的请求,只须利用系统提供的发送原语,系统会自动为其建立一条链路
间接通信方式
信箱
间接通信方式需要通过某种中间实体来完成,该实体被称为信箱,其建立在随机存储器的公用缓冲区上,用来暂存发送进程给目标的消息,接收进程可以从该实体中取出发送进程给自己的消息
每个信箱都有一个唯一的标识符,消息在信箱中可以安全的保存,只允许目标用户随时读取,因此,信箱通信方式即可以实时通信,又可以非实时通信
信箱由 OS 创建,也可由用户进程创建,创建者是信箱的拥有者,据此可将信箱分为:私用信箱、公用信箱、共享信箱
信箱结构
信箱定义为一种数据结构,在逻辑上,其可以分为以下两部分:
- 信箱头:存放有关信息的描述信息,如信箱标识符、信箱拥有者、信箱口令等
- 信箱体:由若干可存放消息的信箱格组成,信箱格的数目及每格大小在创建信箱时确定
信箱通信原语
系统为信箱通信提供了若干条原语:
- 信箱创建:进程利用信箱创建原语来建立一个新信箱
- 信箱撤销:进程利用信箱撤销原语来撤销一个不再需要的信箱
- 消息发送:
send(mailbox, message)
,将一个消息发送到指定信箱 - 消息接收:
receive(mailbox, message)
,从指定信箱中接收一个消息
【管道通信系统】
管道通信系统,是借助管道来完成的,所谓管道,即 pipe 文件,其是一种用于连接读、写进程以实现通信的一个共享文件
向管道提供输入的发送进程(写进程) 以字符流形式将数据送入管道,接收管道输出的接收进程(读进程) 同样以字符流的形式接收数据
管道通信系统,就是利用管道来进行通信的,为协调双方通信,管道机制必须具备互斥、同步、确认对方是否存在的能力
【远程过程调用】
远程过程调用(Remote Procedure Call,RPC),是基于客户/服务器模型进行相互通信模型的一种同步通信形式,其借助网络套接字来进行进程通信,常用于通过网络的连接的系统间的进程通信
该协议允许运行于一台主机系统(本机) 上的进程调用另一台主机系统(远程) 上的进程,为客户提供了远程服务的过程抽象,同时,底层消息传递操作对客户是透明的
负责远程过程调用的进程有两个,一个是本地客户进程,一个是远程服务器进程,这两个进程通常被称为网络守护进程,主要负责在网络间的消息传递,一般情况下,这两个进程均处于阻塞状态,等待消息