表-进程通信 |
进程通信定义 | 指进程之间交换信息。 |
进程通信类型 | 类型关系 | |
低级进程通信 | 进程同步 |
进程互斥 |
高级进程通信 | 共享存储器系统 | 基于共享数据结构(适用于传递少量数据) | 公用数据结构的设置及对进程间同步的处理,由程序员完成。 |
基于共享存储区(适用于传输大量数据) | 进程通信前,先向系统申请共享存储区的一个分区,并指定该分区的关键字,若系统分配了这样的分区,则将该分区的描述符返回给申请者,申请者把获得的共享存储分区连接到本进程上。 |
消息传递系统 | 进程间的数据交换以格式化的消息(即计算机网络中的报文)为单位 | 直接通信方式 | 发送进程利用OS所提供的发送命令,直接把消息发送给目标进程;接收(目标)进程利用OS所提供的接收命令接收消息。发送进程和接收进程都以显式方式提供对方的标识符。 Send(Receiver,message) Receive(Sender,message) |
间接通信方式 | 通信通过中间实体(信箱)暂存消息。 |
信箱可由OS或用户进程创建,创建者为信箱的拥有者。消息在信箱中可以安全保存,任何用户都可发送消息至信箱,但只有核准的用户可随时读取。 |
信箱分类(分类依据为从信箱中读取消息的权力,发送消息至信箱不受约束) | 私用信箱 | 用户进程为自己创建信箱,信箱拥有者有权从信箱中读取消息,其他用户只能发送消息至该信箱 |
共享信箱 | 由某进程创建,并指明有权从信箱读取消息的共享者进程,其他进程只能发送消息至该信箱。 |
公用信箱 | 由OS创建,提供给所有核准进程使用,核准进程可以从该信箱中读取消息或发送消息至该信箱。 |
管道通信系统 | 管道,是指用于连接通信进程(一个读进程和一个写进程)以实现它们之间通信的一个共享文件,称为pipe文件。 |
进程通信链路 | 链路建立方式 | 主动请求方式 | 发送进程在通信之前需用显式的“建立连接”命令(原语)请求系统为之建立一条通信链路,链路使用完后也需用显式方式拆除链路。该方式主要用于计算机网络中。 |
自动建立方式 | 发送进程在通信之前无需显式提出建立链路的请求,只需利用系统提供的发送命令(原语),系统会自动为之建立一条链路。该方式主要用于单机系统中。 |
链路类型 | 依据连接方法 | 点对点连接通信链路 | 一条链路连接两个进程 |
多点连接通信链路 | 一条链路连接多个进程 |
依据通信方式 | 单向通信链路 | 同一时刻只能一方单独发送 |
双向通信链路 | 同一时刻可以双方同时发送 |
依据链路容量 | 无容量通信链路 | 链路中无缓冲区,不能缓存消息 |
有容量通信链路 | 链路中有缓冲区,可以缓存消息 |
进程通信同步 | 进程通信同步方式 | 发送进程和接收进程在完成消息的发送或接收后,都存在两种可能性,即进程继续发送(接收),或阻塞 | 发送进程和接收进程均阻塞 | 该同步方式主要用于进程之间紧密同步,发送进程和接收进程之间无缓冲时。两个进程平时都处于阻塞状态,直到有消息传递时。该同步方式称为汇合。 |
发送进程不阻塞,接收进程阻塞 | 该同步方式应用最广。发送进程平时不阻塞,因而它可以尽快把一个或多个消息发送给多个目标;接收进程平时处于阻塞状态,直到发送进程发来消息时才被唤醒,如服务器上的服务进程平时处于阻塞状态。 |
发送进程和接收进程均不阻塞 | 该同步方式也较常见。发送进程和接收进程平时均忙于自己的事情,仅当发生某事件使它无法继续运行时,才把自己阻塞起来等待。 |
进程通信机制 | 消息缓冲队列 | 实现方式 | 该通信机制属于直接通信方式。发送进程利用Send原语将消息直接发送给接收进程,接收进程利用Receive原语接收消息。 |
数据结构 | 消息缓冲区 | 每个消息缓冲区存储一条消息,多个消息缓冲区形成消息缓冲队列。 type msgBuffer = record sender; /* 发送者进程标识符 */ size;/* 消息长度 */ text;/* 消息正文 */ next;/* 指向下一个消息缓冲区的指针 */ end |
PCB中通信相关数据项 | PCB中应增加消息队列队首指针,和用于实现同步的互斥信号量(用于互斥)和资源信号量(用于同步)。 type PCB = record …… mq;/* 消息队列队首指针 */ mutex; /* 消息队列互斥信号量 */ sm;/* 消息队列同步信号量 */ …… end |
发送原语 | 发送进程在利用发送原语发送消息之前,应先在自己的内存空间中设置一消息发送区a,将待发送消息的相关信息填入其中,然后调用发送原语将消息发送给目标(接收)进程。 procedure send(receiver, a) begin getbuf(a.size, i);/* 申请消息缓冲区 */ /* 将消息发送区a中的信息复制到消息缓冲区i */ i.sender:= a.sender; i.size:= a.size; i.text:= a.text; i.next:=0; getid(PCBSet, receiver.j); /* 获取接收进程内部标识符 */ wait(j.mutex);/* 进程间互斥 */ insert(j.mq, i);/* 将消息缓冲区插入接收进程的消息队列 */ signal(j.mutex); signal(j.sm);/* 进程间同步 */ end |
接收原语 | 接收进程利用接收原语,从自己的消息缓冲队列中摘下第一个消息缓冲区,将其中的数据复制到消息接收区。 procedure receive(b) begin j:=internal name;/* 接收进程内部标识符 */ wait(j.sm);/* 进程间同步 */ wait(j.mutex);/* 进程间互斥 */ remove(j.mq, i);/* 将消息队列中第一个消息移出 */ signal(j.mutex); /* 将消息缓冲区i中的消息复制到消息接收区b */ b.sender:= i.sender; b.size:= i.size; b.text:= i.text; end |