目录
How——消息传递系统(Message Passing System)
How –客户机/服务器系统(Client-Server System)
类型
What?
- 独立进程:不与其他在系统内运行的进程共享数据。
- 协同进程:受系统中其他运行进程的影响,或者影响其他运行进程。
- 进程间的通信是指进程之间的信息交换。协同进程需要进程间通信机制,以便进行数据交换,即进程之间相互接受或者发送数据。
Why?
- 信息共享。为应用程序提供并发访问数据的环境与机制。
- 加速计算。将特定的计算任务划分为子任务,每个子任务可以并发进行。如果计算机系统又多核处理器,那么可以加快计算速度。
- 模块化。如果我们构建一个模块化系统,可以将系统功能分割为不同功能的进程或线程。
IPC vs. Semaphores
Semaphores
- 效率低。传输的共享数据少。
- 使用不方便。OS为进程之间的通信提供了共享存储器,而关于进程之间的通信所需要的共享数据结构的设置、数据的传输、进程的互斥与同步,都必须由程序员去实现。
高级通信工具
- 使用方便,OS隐藏了实现通信的具体细节,向用户提供了一组用于实现高级通信的命令(原语),用户可以直接利用它实现进程间通信。
- 高效传输大量数据。用户可以利用高级通信的命令(原语)传输大量数据。
How?
共享存储:shared memory
消息传递:message passing
How——共享存储器系统(Shared-Memory System)
- 通过系统中的共享数据结果或者共享存储区,实现信息通信。
(1)基于共享数据结构的通信方式。如Producer-Consum中的有缓冲界区。操作系统提供共享存储器,由程序员负责对公用数据结构的设置及对进程间同步的处理。
- 适用于数据较少的通信,效率低下。属于低级通信。
(2)基于共享存储区的通信方式。为了传输大量数据,在内存中划出了一块共享存储区域,各进程可通过对该共享区的读或写交换信息。数据的形式和位置,甚至访问控制都是由进程负责,而不是OS。
进程向OS申请获得共享存储区中的一个区域,并将其附加到自己的地址空间中。其他进程如果要访问该区域,也要附加到自己的地址空间。属于高级通信。
How——管道(Pipe)通信系统
管道:用于连接一个读进程和一个写进程,以实现他们之间通信的一个共享文件,又称为pipe文件。
发送进程/写进程向管道提供输入,以字符流的形式将大量的数据送入管道;接收进程/读进程从管道中读取数据。
首创与UNIX系统。能有效传输大量数据。
管道必须具备以下协调能力:
- 互斥。当一个进程正在对pipe进行读/写操作时,其他进程必须等待。
- 同步。当pipe中写入一定数量的数据时(如4KB),写进程应睡眠等待,直到读进程取走数据后再将其唤醒。反之亦然。
- 确定对方是否存在。只有确定了对方已存在时才能进行通信。
How——消息传递系统(Message Passing System)
以格式化的消息为单位,将通信的数据封装在消息中,并利用操作系统提供的一组通信命令(原语),在进程间进行消息传递,完成数据交换。
多应用于分布式环境,即通信的进程位于网络中不同的计算机上。
(1)直接通信。直接使用OS提供的原语发送消息。
(2)间接通信。通过共享的中间实体(称为邮箱)进行消息的发送和接收。
How –客户机/服务器系统(Client-Server System)
网络环境下的主流通信机制(1) 套接字 (socket)
- 同一个台主机上多个应用程序之间的通信。解决多对程序同时通信时端口和物理线路的多路复用问题。
- 通信标识类型的数据结构,包含了通信目的地址、通信端口号、通信网络的传输层协议、进程所在的网络地址,针对客户或服务器的不同系统调用(API)。
- a. 基于文件型:同一机器,一个套接字关联到一个特殊的文件,通信双方通过对这个特殊的文件读写实现通信。其原理类似管道。
- b. 基于网络型:非对称方式通信,即发送者需要提供接收者的命名(naming)。网络环境,一对套接字,一个是接收进程(服务端),一个是发送进程(客户端)。例如Web请求http。
(2)远程过程调用 RPC(remote procedure call)和远程方法调用
- 通信协议,用于通过网络连接的系统。允许运行于一台主机/本地系统上的进程,调用另一台主机/远程系统上的进程,而对程序员表现为常规的过程调用,无需额外编程。在面向对象编程中又称为远程方法调用。
- 本地客户进程和远程服务器进程,也称为网络守护进程(daemon)。通常这两个进程都是处于阻塞状态,等待消息。
(2) RPC的主要步骤
- RPC使用户调用远程过程时,像调用本地过程。
- 存根stub。在每个能独立运行的远程过程都一个独立的存根(客户端和服务端)。客户存根(client stubborn)
- 客户端调用远程过程时,RPC系统调用对应的stub,将它作为参数传递给远程过程。该stub定位服务器的端口并封装参数*。stub使用消息传递机制,把消息发送给服务器。服务端的stub接收消息并调用服务器上的过程。如果又返回值,过程类似。
- 在windows系统中,stub代码是由MIDL(Microsoft Interface Definition Language)编译的。
实现方式
How——消息传递通信的实现方式
1、直接消息传递系统
1、直接消息传递系统:利用OS提供的发送命令,直接把消息发送给目标进程。
(1) 直接通信原语
- send(receiver, message) // 向接收进程发送消息
- receive(sender, message) // 接收消息。sender为发送进程的名字
- send(P, message) // 向接收进程P发送消息
- receive(id, message) // 接收消息。id为发送进程的id或名字
(2)消息的格式
- 定长消息格式
- 变长消息格式
(3) 进程的同步方式
- 发送进程阻塞,接收进程阻塞(两个进程间无缓冲)
- 发送进程不阻塞,接收进程阻塞(常用)
- 发送进程和接收进程均不阻塞(常用)
(4) 通信链路
- 通信前用显式的“建立连接”原语请求OS建立一条通信链路,使用完后拆除。多用于计算机网络通信。
- 利用OS的发送原语自动建立链路。多用于单片机系统
- 单向通信链路。只允许发送,或者相反。
- 双向通信链路。进程间相互发送。
2、信箱通信-间接通信
- 进程间的通信通过某种中间实体(共享的数据结构等)来进行,中间实体建立在公用缓冲区上。该中间实体称为邮箱/信箱。
- 每个邮箱有唯一的标识符。只允许核准的目标用户随时读取。
(1)信箱的结构
(2)信箱通信原语
- a. 邮箱的创建和撤销。创建者进程应给出邮箱的名字、邮箱的属性(公用、私用、共享等);对于共享邮箱,还应给出共享者的名字。
- 进程不再需要使用邮箱时,可用撤消原语,释放资源。
- b. 消息的发送和接收原语
- send(mailbox, message)
- receive(mailbox, message)
(3)信箱的类型
- 操作系统创建,用户创建,创建者是信箱的拥有者。
- a. 私用信箱。用户进程创建,可以读取。其他用户可以将消息发送到该信箱。创建进程消失时,该信箱消失。
- b. 公用信箱。系统创建,提供给核准进程使用。进程可以发送/读取。系统运行期间始终存在。
- c. 共享信箱。创建时指明是可以共享的,指出共享进程/用户的名字。创建者和共享者可以发送/读取自己的消息。
- 四种关系:1对1;多对1;1对多;多对多。
实例
How –直接消息传递系统的实例
1、消息缓冲队列通信机制的数据结构