2.6 进程通信
2.6.1进程通信的类型
1.共享存储器系统
(1)基于共享数据结构的通信方式。
诸进程公用某些数据结构,以实现信息交换。如P—C问题利用有界缓冲区这种数据结构来实现通信。实质是低级通信。
(2) 基于共享存储区的通信方式。
存储器中划出一块共享存储区,诸进程可通过对共享存储区中数据的读或写来实现通信。
2.消息传递系统
当前应用最为广泛的一种通信机制。
进程间通信单位:格式化的消息(报文) 。
实现过程:利用OS提供的一组通信原语。
优点:能实现大量数据的传递,隐藏通信细节,使通信过程对用户是透明的。
微内核操作系统中,微内核与服务器之间的通信都采用消息传递机制。
消息传递分为直接通信、间接通信方式两种。
3.管道通信(最早出现于UNIX系统)
为了协调双方的通信,管道机制必须提供以下三方面的协调能力:
(1)互斥:两进程互斥访问pipe。
(2)同步:
写进程写入一定数据后等待读进程读数据;
读进程读完数据后等待写进程向pipe写数据;
(3)pipe两端都有进程才能进行通信。
2.6.2消息传递通信的实现方法
1.直接通信方式
源进程利用OS所提供的发送命令,直接把消息发送给目标进程。
发送进程和接收进程都以显式方式提供对方的标识符。
发送原语:Send(Receiver,message);
接收原语:Receive(Sender,message);
例如,原语Send(P2,m1) ;
原语Receive(P1,m1) 。
在某些情况下,接收进程可与多个发送进程通信,因此,它不可能事先指定发送进程。对于这样的应用,接收原语可表示为:
Receive(id,message);
可以利用直接通信原语来解决P—C问题。
P进程生产消息后,用Send原语发送给C进程;而C进程则利用Receive原语来得到一个消息。通信过程可分别描述如下:
P: repeat
produce an item in nextp;
send(consumer,nextp);
until false;
C: repeat
receive(producer,nextc);
consume the item in nextc;
until false;
2.间接通信方式
利用第三方来传递消息,以实现实时、非实时的信息传递。第三方称为信箱。
OS提供的信箱原语:
(1)信箱的创建和撤消。
信箱创建原语建立一个新信箱。
需创建的信箱信息:信箱名字、信箱属性(公用、私用或共享);对于共享信箱,还应给出共享者的名字。
信箱撤消原语撤消信箱。
(2)消息的发送和接收。
发送原语:Send(mailbox,message);
接收原语Receive(mailbox,message);
信箱可由操作系统创建,也可由用户进程创建,据此,可把信箱分为以下三类。
1) 私用信箱
由进程自身创建,多进程可向其发信息,但只能由创建者读取信息,有生命周期。
私用信箱采用单向通信链路实现。
2)共享信箱
由进程创建,需指明共享者名字。指定的共享者可从信箱中取属于自己的信息。
3) 公用信箱
由操作系统创建,提供给系统中的所有核准进程使用。核准进程既可发送消息也可读取自己的消息。
采用双向通信链路的信箱来实现。
通常,公用信箱在系统运行期间始终存在。
用信箱通信时发送、接收进程间的关系:
(1)1对1:1发送1接收,二者通过单向通信链路通信,整个过程不受干扰。
(2)1对多:1发送多接收,发送进程采用广播方式向多个接收者发送消息。
(3)多对1:多发送1接收,如私有信箱。
(4)多对多关系:如公用信箱。
2.5.3消息传递系统实现中的
若干问题
1.通信链路
2.消息的格式
单机消息格式比较简单;网络环境下消息格式比较复杂。
3.进程同步方式
进程通信时,发送进程、接收进程,都存在两种可能性状态,即发送(接收),或者阻塞。二者间可能有以下三种情况:
(1) 二者均阻塞。
两进程平时都处于阻塞状态,直到有消息传递时才被唤醒。
此时进程之间紧密同步,即二者是无容连接。这种同步方式称为汇合。
(2)发送进程不阻塞,接收进程阻塞。
应用最广的同步方式。
发送进程可以尽快地把一个或多个消息发送给多个目标;而接收进程平时则处于阻塞状态,直到发送进程发来消息时才被唤醒。如打印服务。
(3)发送进程和接收进程均不阻塞。
也较常见。一般二者间为有容连接。
例如,在发送进程和接收进程之间联系着一个消息队列。
发送进程可以连续地向消息队列中发送消息;接收进程也可以连续地从消息队列中取得消息。
只有当消息队列满时,发送进程才会阻塞;只有当消息队列中的消息空时,接收进程才会阻塞。
2.6.4消息缓冲队列通信机制
1) 消息缓冲区
消息缓冲区描述如下:
typemessage buffer=record
sender ;发送者进程标识符
size;消息长度
text;消息正文
next;指向下一个消息缓冲区的指针
end
2) PCB中有关通信的数据项
在PCB中应增加的数据项可描述如下:
typeprocesscontrol block=record
mq;消息队列队首
mutex;消息队列互斥信号量
sm;消息队列资源信号量
end
2.发送原语
1)先在自己的内存空间设置一发送区a
2)把待发送的消息正文、发送进程标识符、
消息长度等信息填入其中
3)然后调用发送原语,把消息发送给目标
(接收)进程。
①根据发送区a中所设置的消息长度a.size来申请一缓冲区i;
②把发送区a中的信息复制到缓冲区i中;
③获得接收进程的内部标识符j;
④将i挂在j.mq上。
发送原语可描述如下:
3.接收原语
1)调用接收原语receive(b)
2)从自己的消息缓冲队列mq中摘下第一个消息缓冲区i,
3)将其中的数据复制到以b为首址的指定消息接收区内。