计算机操作系统(二)--进程通信

     进程通信,是指进程之间的信号交换,其所交换的信息量少者是一个状态或数值,多着则是成千上万个字节。进程之间的互斥和同步,由于其所交换的信息量少而被归结为低级通信。信号量机制作为同步工具是卓有成效的,但作为通信工具,则不够理想。主要原因是效率低、通信对用户不透明。

     高级进程通信,指用户可直接利用操作系统所提供的一组通信命令高效地传送大量数据的一种通信方式。操作系统隐藏了进程通信的实现细节,通信过程对用户是透明的,减少了通信程序编制上的复杂性。

     随着OS的发展,用于进程之间实现通信的机制也在发展,并已由早期的低级进程通信机制发展为能传送大量数据的高级通信工具机制。高级通信机制归结为三大类:共享存储器系统、消息传递系统、管道通信系统。

 

     共享存储器系统(Shared-Memory System),相互通信的进程共享某些数据结构或共享存储区,进程之间能够通过这些空间进行通信。分为以下两种:

     基于共享数据结构的通信方式,该方式要求诸进程公用某些数据结构,借以实现诸进程间的信息交换。如在生产者--消费者问题中,就是用有界缓冲区这种数据结构来实现通信的。公用数据结构的设置及对进程间同步的处理,都是程序员的职责。无疑增加了程序员的负担,而操作系统却只须提供共享存储器。这种通信方式是低效的,只适于传递相对少量的数据。

     基于共享存储区的通信方式,为了传输大量数据,在存储器中划出了一块共享存储区,诸进程可通过对共享存储区中数据的读或写来实现通信。这种通信方式属于高级通信。进程在通信前,先向系统申请获得共享存储区中的一个分区,并指定该分区的关键字。若系统已经给其他进程分配了这样的分区,则将该分区的描述符返回给申请者,继之,由申请者把获得的共享存储分区连接到本进程上。此后,便可将读、写普通存储器一样地读、写该公用存储分区。

 

     消息传递系统(Message passing system,当前应用最为广泛的一种进程间的通信机制。在该机制中,进程间的数据交换是以格式化的消息(message)为单位的。在计算机网络中,又把message称为报文。程序员直接利用操作系统提供的一组通信命令(原语),不仅能实现大量数据的传递,而且还隐藏了通信的实现细节,使通信过程对用户是透明的,从而大大减化通信程序编制的复杂性,因而获得广泛的应用。

     当今最为流行的微内核操作系统中,微内核与服务器之间的通信,无一例外地采用了消息传递机制。它能很好地支持多处理机系统、分布式系统和计算机网络,因此成为这些领域最主要的通信工具。

 

     管道通信,所谓“管道”指用于连接一个读进程和一个写进程以实现它们之间通信的一个共享文件,又名pipe文件。向管道(共享文件)提供输入的发送进程(即写进程),以字符流形式将大量的数据送入管道,而接受管道输出的接受进程(即读进程),则从管道中接收(读)数据。由于发送进程和接受进程是利用管道进行通信的,故又称为管道通信。

     为了协调双方的通信,管道机制必须提供三方面的协调能力:

     1)互斥,即当一个进程正在对pipe执行读/写操作时,其它进程必须等待。

     2)同步,指当写(输入)进程把一定数量的数据写入pipe,便去睡眠等待,直到读(输出)进程取走数据后,再把它唤醒。当读进程读一空pipe时,也应睡眠等待,直至写进程将数据写入管道后,才将之唤醒。

     3)确定对方是否存在,只有确定了对方已存在时,才能进行通信。

 

消息传递的实现方式:直接通信方式、间接通信方式。

     直接通信方式,指发送进程利用OS所提供的发送命令,直接把消息发送给目标进程。此时,发送进程和接受进程都以显式方式提供对方的标识符。通常系统提供下述两条通信命令(原语):Send(Receiver,message)、Receive(Sender,message)。

     在某些情况下,接收进程可与多个发送进程通信,因此不可能事先指定发送进程。如提供打印服务的进程,对于这样的应用,在接收进程接收消息的原语中,表示源进程的参数,也是完成通信后的返回值,接受原语表示为Receive(id,message).

     间接通信方式,指进程之间的通信需要通过作为共享数据结构的实体。该实体用于暂存发送进程发送给目标进程的消息,接收进程则从该实体中取出对方发送给自己的消息。这种实体被称为信箱。

     利用信箱即可实现实时通信,又可实现非实时通信。系统为信箱通信提供了若干条原语,用于信箱的创建、撤消和消息的发送、接收等。

     1)信箱的创建和撤消,进程可利用信箱创建原语来建立一个新信箱。创建者进程应给出信箱名字、信箱属性(公用、私用或共享)。对于共享信箱还应给出共享者的名字。当进程不需要读信箱时,可用信箱撤消原语将之撤消。

     2)消息的发送和接收,当进程之间要利用信箱进行通信时,必须使用共享信箱,并利用通信原语通信。

     Send(mailbox,message)将一个消息发送到指定信箱。Receive(mailbox,message)从指定信箱中接收一个消息。

     信箱可由操作系统创建,也可由用户进程创建,创建者是信箱的拥有者。由此可分为三类:

     1)私用信箱,用户进程可为自己建立一个新信箱,并作为该进程的一部分,信箱的拥有者有权从信箱中读取消息,其他用户则只能将自己构成的消息发送到该信箱中。这种私用信箱可采用单向通信链路的信箱来实现。当拥有该信箱的进程结束时,信箱也随之消失。

     2)公用信箱,由操作系统创建,并提供给系统中的所有核准进程使用。核准进程即可把消息发送到该信箱中,也可从信箱中读取发送给自己的消息。显然公用信箱应采用双向通信链路的信箱来实现。通常公用信箱在系统运行期间始终存在。

     3)共享信箱,由某进程创建,在创建时或创建后指明它是可共享的,同时须指出共享进程(用户)的名字。信箱的拥有者和共享者都有权从信箱中取走发送给自己的消息。

     利用信箱通信,发送进程和接收进程之间存在以下四种关系:

     1)一对一关系,可为发送进程和接收进程建立一条两者专用的通信链路,使两者之间的交互不受其他进程的干扰。

     2)多对一关系,允许提供服务的进程与多个用户进程之间进行交互,也称为客户/服务器交互(clien/server interaction)。

     3)一对多关系,允许一个发送进程与多个接收进程进行交互,使发送进程可用广播方式向接收者(多个)发送消息。

     4)多对多关系,允许建立一个公用信箱,让多个进程都能向信箱中投递消息,也可从信箱中取走属于自己的消息。

 

     消息传递系统实现中的若干问题:通信链路、消息的格式、进程同步方式。

     在单机和计算机网络环境下,高级进程通信广泛采用消息传递系统。将对这种通信中的几个主要问题做扼要的阐述。

     为使在发送进程和接收进程之间能进行通信,必须在两者之间建立一条通信链路(communication link)。有两种方式建立通信链路。第一种方式是由发送进程在通信之前用显式的“建立连接”命令(原语)请求系统为之建立一条通信链接。在链路使用完后,也用显式方式拆除链路。这种方式主要用于计算机网络中。第二种方式是发送进程无须明确提出建立链路的请求,只须利用系统提供的发送命令(原语),系统会自动为之建立一条链路。这种方式主要用于单机系统中。

     根据通信链路的连接方式,又可把通信链路分为两类:

     1)点对点连接通信链路,这时的一条链路只连接两个结点(进程)。

     2)多点连接链路,指用一条链路连接多个(n>2)结点(进程)。

     根据通信方式的不同,又可把链路分成两种:

     1)单向通信链路,只允许发送进程向接收进程发送消息,或者相反。

     2)双向链路,既允许由进程A向进程B发送消息,也允许进程B同时向进程A发送消息。

     还可根据通信链路容量的不同而把链路分成两类:一是无容量通信链路,在这种通信链路上没有缓冲区,因而不能暂存任何消息。再者就是有容量通信链路,指在通信链路中设置缓冲区,因而能暂存消息。缓冲区数目愈多,通信链路的容量愈大。

 

     在消息传递系统中所传递的消息,必须具有一定的消息格式。在单机系统环境中,由于发送进程和接收进程处于同一台机器中,有着相同的环境,故其消息格式比较简单。但在计算机网络环境下,不仅源和目标进程所处的环境不同,而且信息的传输距离很远,可能要跨越若干个完全不同的网络,致使所用的消息格式比较复杂。通常可把一个消息分成消息头和消息正文两部分。消息头包括消息在传输时所需的控制信息,如源进程名、目标进程名、消息长度、消息类型、消息编号及发送的日期和时间。而消息正文则是发送进程实际上所发送的数据。

     在某些OS中,消息采用比较短的定长消息格式,这便减少了对消息的处理和存储开销。这种方式可用于办公自动化系统中,为用户提供快速的便笺式通信。但这对要发送较长消息的用户是不方便的。在有的OS中,采用变长的消息格式,即进程所发送消息的长度是可变的。系统无论在处理还是存储变长消息时,都可能会付出更多的开销,但这方便了用户。这两种消息格式各有其优缺点,故在很多系统(包括计算机网络)中,是同时都用的。

 

     在进程之间进行通信时,同样需要有进程同步机制,以使诸进程间能协调通信。不论是发送进程,还是接收进程,在完成消息的发送或接收后,都存在两种可能性,即进程或者继续发送(接收),或者阻塞。由此,我们可得出以下三种情况:

     1)发送进程阻塞,接收进程阻塞。主要是用于进程之间紧密同步(tight synchronization),发送进程和接收进程之间无缓冲时。这两个进程平时都处于阻塞状态,直到有消息传递时。这种同步方式称为汇合(rendezrous)。

     2)发送进程不阻塞,接收进程阻塞。这是一种应用最广的进程同步方式。平时发送进程不阻塞,因而它可以尽快地把一个或多个消息发送给多个目标。而接收进程平时则处于阻塞状态,直到发送进程发来消息时才被唤醒。例如,在服务器上通常都设置多个服务进程,分别用于提供不同的服务,这些服务进程都处于阻塞状态,一旦有请求服务的消息到达时,系统便唤醒相应的服务进程,去完成用户所要求的服务。处理完后,若无新的服务请求,服务进程又阻塞。

     3)发送进程和接收进程均不阻塞。这也是一种常见的进程同步形式。平时发送进程和接收进程都在忙于自己的事情,仅当发生某事件使它无法继续运行时,才把自己阻塞起来等待。例如,在发送进程和接收进程之间联系着一个消息队列时,该消息队列最多能接纳n个消息,发送进程便可以连续地向消息队列中发送消息而不必等待。接收进程也可以连续地从消息队列中取得消息,也不必等待。只有当消息队列中的消息数已达到n或0时阻塞对应的进程。

 

     消息缓冲队列通信机制首先由Hansan提出,后被广泛应用于本地进程之间的通信中。在这种通信机制中,发送进程利用Send原语将消息直接发送给接收进程,接收进程则利用Receive原语接收消息。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值