资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,1,第一章 操作系统引论,2.6,进 程 通 信,进程通信是指进程之间的信息交换。由于进程的互斥与同步,需要在进程间交换一定的信息,故不少学者将它们也归为进程通信,但只能把它们称为低级进程通信。我们以信号量机制为例来说明,它们之所以低级的原因在于:效率低,生产者每次只能向缓冲池投放一个产品,(,消息,),,消费者每次只能从缓冲区中取得一个消息;通信对用户不透明,,OS,只为进程之间的通信提供了共享存储器。,2.6 进 程 通 信进程通信是指进程之,在进程之间要传送大量数据时,应当利用,OS,提供的高级通信工具,该工具最主要的特点是:,(1),使用方便。,OS,隐藏了实现进程通信的具体细节,向用户提供了一组用于实现高级通信的命令,(,原语,),,用户可方便地直接利用它实现进程之间的通信。或者说,通信过程对用户是透明的。这样就大大减少了通信程序编制上的复杂性。,(2),高效地传送大量数据。用户可直接利用高级通信命令,(,原语,),高效地传送大量的数据。,在进程之间要传送大量数据时,应当利用OS提供的高级通信工,2.6.1,进程通信的类型,1.,共享存储器系统,(Shared-Memory System),在共享存储器系统中,相互通信的进程共享某些数据结构或共享存储区,进程之间能够通过这些空间进行通信。据此,又可把它们分成以下两种类型:,(1),基于共享数据结构的通信方式。,(2),基于共享存储区的通信方式。,2.6.1进程通信的类型1.共享存储器系统(Sha,2.,管道,(pipe),通信系统,所谓“管道”,是指用于连接一个读进程和一个写进程以实现它们之间通信的一个共享文件,又名,pipe,文件。向管道,(,共享文件,),提供输入的发送进程,(,即写进程,),以字符流形式将大量的数据送入管道;而接受管道输出的接收进程,(,即读进程,),则从管道中接收,(,读,),数据。由于发送进程和接收进程是利用管道进行通信的,故又称为管道通信。这种方式首创于,UNIX,系统,由于它能有效地传送大量数据,因而又被引入到许多其它操作系统中。,2.管道(pipe)通信系统所谓“管道”,是指用,为了协调双方的通信,管道机制必须提供以下三方面的协调能力:互斥,即当一个进程正在对,pipe,执行读,/,写操作时,其它,(,另一,),进程必须等待。同步,指当写,(,输入,),进程把一定数量,(,如,4KB),的数据写入,pipe,,便去睡眠等待,直到读,(,输出,),进程取走数据后再把它唤醒。当读进程读一空,pipe,时,也应睡眠等待,直至写进程将数据写入管道后才将之唤醒。确定对方是否存在,只有确定了对方已存在时才能进行通信。,为了协调双方的通信,管道机制必须提供以下三方面的协调能力,3.,消息传递系统,(Message passing system),在该机制中,进程不必借助任何共享存储区或数据结构,而是以格式化的消息,(message),为单位,将通信的数据封装在消息中,并利用操作系统提供的一组通信命令,(,原语,),,在进程间进行消息传递,完成进程间的数据交换。基于消息传递系统的通信方式属于高级通信方式,因其实现方式的不同,可进一步分成两类:,(1),直接通信方式,(2),间接通信方式,3.消息传递系统(Message passing sy,4.,客户机,-,服务器系统,(Client-Server system),1),套接字,(Socket),套接字起源于,20,世纪,70,年代加州大学伯克利分校版本的,UNIX(,即,BSD Unix),,是,UNIX,操作系统下的网络通信接口。一开始,套接字被设计用在同一台主机上多个应用程序之间的通信,(,即进程间的通信,),,主要是为了解决多对进程同时通信时端口和物理线路的多路复用问题。随着计算机网络技术的发展以及,UNIX,操作系统的广泛使用,套接字已逐渐成为最流行的网络通信程序接口之一。,4.客户机-服务器系统(Client-Server s,2),远程过程调用和远程方法调用远程过程,(,函数,),调用,RPC(Remote Procedure Call),,是一个通信,协议,,用于通过网络连接的系统。该协议允许运行于一台主机,(,本地,),系统上的进程调用另一台主机,(,远程,),系统上的进程,而对程序员表现为常规的过程调用,无需额外地为此编程。如果涉及的软件采用,面向对象编程,,那么远程过程调用亦可称做远程方法调用。,2)远程过程调用和远程方法调用远程过程(函数)调,实际上,远程过程调用的主要步骤是:,(1),本地过程调用者以一般方式调用远程过程在本地关联的客户存根,传递相应的参数,然后将控制权转移给客户存根;,(2),客户存根执行,完成包括过程名和调用参数等信息的消息建立,将控制权转移给本地客户进程;,(3),本地客户进程完成与服务器的消息传递,将消息发送到远程服务器进程;,(4),远程服务器进程接收消息后转入执行,并根据其中的远程过程名找到对应的服务器存根,将消息转给该存根;,实际上,远程过程调用的主要步骤是:(1)本地过程,(5),该服务器存根接到消息后,由阻塞状态转入执行状态,拆开消息从中取出过程调用的参数,然后以一般方式调用服务器上关联的过程;,(6),在服务器端的远程过程运行完毕后,将结果返回给与之关联的服务器存根;,(7),该服务器存根获得控制权运行,将结果打包为消息,并将控制权转移给远程服务器进程;,(8),远程服务器进程将消息发送回客户端;,(9),本地客户进程接收到消息后,根据其中的过程名将消息存入关联的客户存根,再将控制权转移给客户存根;,(10),客户存根从消息中取出结果,返回给本地调用者进程,并完成控制权的转移。,(5)该服务器存根接到消息后,由阻塞状态转入执行状态,,2.6.2,消息传递通信的实现方式,1.,直接消息传递系统,在直接消息传递系统中采用直接通信方式,即发送进程利用,OS,所提供的发送命令,(,原语,),,直接把消息发送给目标进程。,2.6.2消息传递通信的实现方式1.直接消息传递系,1),直接通信原语,(1),对称寻址方式。,(2),非对称寻址方式。,1)直接通信原语(1)对称寻址方式。(2,2),消息的格式在消息传递系统中所传递的消息,必须具有一定的消息格式。在单机系统环境中,由于发送进程和接收进程处于同一台机器中,有着相同的环境,所以消息的格式比较简单,可采用比较短的定长消息格式,以减少对消息的处理和存储开销。该方式可用于办公自动化系统中,为用户提供快速的便笺式通信。但这种方式对于需要发送较长消息的用户是不方便的。为此,可采用变长的消息格式,即进程所发送消息的长度是可变的。对于变长消息,系统无论在处理方面还是存储方面,都可能会付出更多的开销,但其优点在于方便了用户。,2)消息的格式在消息传递系统中所传递的消息,必须,3),进程的同步方式在进程之间进行通信时,同样需要有进程同步机制,以使诸进程间能协调通信。不论是发送进程还是接收进程,在完成消息的发送或接收后,都存在两种可能性,即进程或者继续发送,(,或接收,),或者阻塞。,3)进程的同步方式在进程之间进行通信时,同样需要,4),通信链路为使在发送进程和接收进程之间能进行通信,必须在两者之间建立一条通信链路。有两种方式建立通信链路。第一种方式是:由发送进程在通信之前用显式的“建立连接”命令,(,原语,),请求系统为之建立一条通信链路,在链路使用完后拆除链路。,4)通信链路为使在发送进程和接收进程之间能进行通,2.,信箱通信,1),信箱的结构信箱定义为一种数据结构。在逻辑上,可以将其分为两个部分:,(1),信箱头,(2),信箱体,2.信箱通信1)信箱的结构信箱定义为一种,图,2-16,双向信箱示意图,图2-16 双向信箱示意图,2),信箱通信原语系统为邮箱通信提供了若干条原语,分别用于:,(1),邮箱的创建和撤消。,(2),消息的发送和接收。,2)信箱通信原语系统为邮箱通信提供了若干条原语,,3),信箱的类型邮箱可由操作系统创建,也可由用户进程创建,创建者是邮箱的拥有者。据此,可把邮箱分为以下三类:,(1),私用邮箱。,(2),公用邮箱。,(3),共享邮箱。,3)信箱的类型邮箱可由操作系统创建,也可由用户进,2.6.3,直接消息传递系统实例,消息缓冲队列通信机制首先由美国的,Hansan,提出,并在,RC 4000,系统上实现,后来被广泛应用于本地进程之间的通信中。在这种通信机制中,发送进程利用,Send,原语将消息直接发送给接收进程;接收进程则利用,Receive,原语接收消息。,2.6.3直接消息传递系统实例消息缓冲队列通信机制首,1.,消息缓冲队列通信机制中的数据结构,(1),消息缓冲区。,(2)PCB,中有关通信的数据项。,1.消息缓冲队列通信机制中的数据结构(1)消息,2.,发送原语,发送进程在利用发送原语发送消息之前,应先在自己的内存空间设置一发送区,a,,如图,2-17,所示,把待发送的消息正文、发送进程标识符、消息长度等信息填入其中,然后调用发送原语,把消息发送给目标,(,接收,),进程。发送原语首先根据发送区,a,中所设置的消息长度,a.size,来申请一缓冲区,i,,接着,把发送区,a,中的信息复制到缓冲区,i,中。为了能将,i,挂在接收进程的消息队列,mq,上,应先获得接收进程的内部标识符,j,,然后将,i,挂在,j.mq,上。由于该队列属于临界资源,故在执行,insert,操作的前后都要执行,wait,和,signal,操作。,2.发送原语发送进程在利用发送原语发送消息之前,,图,2-17,消息缓冲通信,图2-17消息缓冲通信,3.,接收原语,接收进程调用接收原语,receive(b),,从自己的消息缓冲队列,mq,中摘下第一个消息缓冲区,i,,并将其中的数据复制到以,b,为首址的指定消息接收区内。,3.接收原语接收进程调用接收原语receive(,
展开阅读全文