操作系统(九)进程管理——进程通信
- 低级通信:只能传递状态和整数值(控制信息),其交换的信息少。信号量机制属于低级通信
- 高级通信:用户可直接利用操作系统所提供的一组通信命令高效地传送大量数据的一种通信方式。操作系统隐藏了进程通信的实现细节,即对用户是透明的。
一、进程通信的类型
- 共享存储器系统
- 管道通信
- 消息传递系统
1、共享存储器系统
(1)共享数据结构的通信方式
要求诸进程公用某些数据结构,来实现进程间的信息交换。
(2)共享存储区的通信方式
为了传输大量的数据,在存储器中划出一块共享存储区,诸进程通过对共享存储区中数据的读或写来实现通信。
2、管道通信
管道:是指用于连接一个读进程和一个写进程以实现他们之间通信的一个共享文件,又名pipe文件。
- 发送进程(写进程)以字符流形式向管道提供输入大量的数据。
- 接收进程(读进程)则从管道中接收(读)数据。
3、消息传递系统
在消息传递系统中,进程间的数据交换,是以格式化的消息为单位的,将通信的数据封装在消息中,并利用OS提供的一组通信命令(原语),在进程间进行消息传递,完成进程间的数据交换。
不仅能实现大量数据的传递,而且还隐藏了通信的实现细节
二、消息传递通信的实现方式
多个进程在进行交换信息时,如何传递信息,即消息传递通信的实现方法。按照源进程向目标进程传递消息时是以直接的或间接的方式而分为直接通信方式、间接通信方式。
1、直接消息传递系统(直接通信方式)
利用OS提供的发送原语,直接把消息发送给目标进程
(1)直接通信原语
OS提供两条通信命令(原语):
- 对称寻址方式
Send(receiver,message); //发送一个消息给接收进程;
Receive(sender,message); //接收Sender发来的消息;
- 非对称寻址方式
Receive (id,message); //返回接收到该消息进程的标识符
(2)消息的格式
- 定长消息格式
在单机系统中,发送进程和接收进程处于同一台机器中,环境相同,传递的消息格式比较简单。
消息较短,存放消息的内存空间比较小,但对于发送消息的用户不方便。
- 变长消息格式
在计算机网络环境下,发送进程和接收进程所处环境不同,消息格式较复杂。
长度可变,对于发送消息的用户较方便,但存放消息的内存空间较大。
(3)进程的同步方式 (消息传递系统中进程的同步机制)
设置适当的同步机制使进程间能够协调的进行通信
- 发送和接收进程同时阻塞(无消息要传递时)
- 发送进程的状态不限制(有则发,没有也不阻塞),接收进程通常处于阻塞状态
- 发送和接收进程都不阻塞,在发送进程和接收进程之间设一个消息队列;这种机制是一种常见的进程同步形式,也即消息缓冲队列通信机制。
(4)通信链路
为了在发送进程和接收进程之间能进行通信,必须在两者之间建立一条通信链路。
- 第一种方式:显式“建立连接”,显式拆除链路。(计算机网络)
- 第二种方式:在发送进程执行发送命令后,系统会自动地建立一条链路。 (单机系统)
2、信箱通信(间接通信方式)
进程之间的通信需要通过设置一个共享数据结构的实体来完成
(1)信箱通信原语
- 信箱的创建和撤销
- 消息的发送和接收
Send(mailbox, message); //将一个消息发送到指定信箱;
Receive(mailbox, message); //从指定信箱中接收一个消息;
(2)信箱类型
- 私用信箱 (由用户进程创建的,私有的)
- 公用信箱 (由操作系统创建的,共享的)
- 共享信箱 (由某个进程创建的,共享的)
(3)发送进程和接收进程间的关系
- 一对一关系
- 多对一关系:提供服务进程和多个用户通信(客户/服务器)
- 一对多关系: 一个发送进程与多个接收进程交互(广播方式)
- 多对多关系
三、直接消息传递系统实例
1、消息缓冲队列通信机制中的数据结构
(1)消息缓冲区
type struct message_buffer { //记录型
int sender; //发送者进程标识符
int size; //消息长度
char *text; //消息正文
struct message_buffer *next; //指向下一个消息缓冲区的指针
}
(2)PCB中有关通信的数据项
type struct processcontrol_block {
…
mq; //消息队列队首指针
mutex; //消息队列互斥信号量用于实现进程互斥
sm; //消息队列资源信号量用于实现进程共同步
…
}
这就是PCB中应增加的三项数据,这些都是保存在接收进程的PCB中的。
(3)发送原语
void send(receiver,a) {
getbuf(a.size, i);
i.sender := a.sender;
i.size := a.size;
copy(i.text, a.text);
i.next := 0;
getid(PCB set, receiver.j);
wait(j.mutex);
insert(j.mq, i);
signal(j.mutex);
signal(j.sm);
}
(4)接收原语
void receive(b) {
j := internal name;
wait(j.sm);
wait(j.mutex);
remove(j.mq, i);
signal(j.mutex);
b.sender := i.sender;
b.size := i.size;
copy(b.text, i.text);
releasebuf(i);
}
(5)消息缓冲通信
四、进程通信知识结构图