考研帮 > 数学 > 每日一练

2.1 进程与线程

2.1.5 进程通信

  进程间的信息交换称为进程通信,进程之间的互斥与同步就是两种进程通信方式。由于进程互斥与同步交换的信息量较少,每次通信传递的信息量固定且效率较低,因此称这两种通信方式为低级通信方式;相应地,也可将P、V操作称为两条低级通信原语。所谓高级通信方式是指进程之间以较高的效率传送大量数据的通信方式。
  高级通信方式可分为三大类:共享存储器系统、消息传递系统以及管道通信系统。
  1.共享存储器系统
  在这种方式中,相互通信的进程共享某些数据结构或共享存储区,具体可分为以下两种方式:
  一种是高级通信方式的共享存储区:是指进程之间通过对共享存储区的读/写,来交换数据;
  另一种方式是利用共享的数据结构来进行进程通信,进程之间通过某种类型的数据结构来交换信息,如生产者-消费者问题,便是利用有界缓冲区这种数据结构来进行通信的。但这种方式对共享数据结构的设置及对进程间的同步,都必须由程序员来处理,且只能进行少量的数据交换,因此,属于低级通信方式。
  2.消息传递系统
  在消息传递系统中,消息系统的功能是允许进程与其他的进程进行通信而不必借助共享数据,进程间的数据交换以格式化的消息(报文)为单位。根据实现方式的不同,它又可分为直接通信和间接通信两类。
  在直接通信方式中,源进程可直接将消息发送给目标进程,此类操作系统通常提供send(receiver, message)和receive(sender,message)两条通信命令(原语)供用户使用。
  在间接通信方式中,进程间需要通过某种中间实体(即信箱)来进行通信。发送进程将消息投入信箱,而接受进程则从信箱中取得消息。因此,它不仅能实现实时通信,还能实现非实时通信。此时,操作系统应提供若干条原语,分别用于信箱的创建、撤销和消息的发送、接收等。
  如果进程P 和Q 要进行通信,那么它们必须能够互相发送和接收消息;两者之间必须要建立一条通信链路。有多种方法可以实现这条链路。在这里,我们并不关心链路的物理实现,而是要考虑它的逻辑实现。有如下几种用于逻辑实现和send/receive 操作的方法:
  直接或间接通信;
  对称或不对称通信;
  自动或手动缓冲;
  发送复制或引用;
  定长消息或变长消息。
  (1)直接通信
  直接通信中,需要通信的每个进程都必须直接指明通信的接收方或发送方。在这种方式下,发送和接收原语定义如下:
  send(P,message)——发送一个消息给进程P;
  receive(Q,message)——从进程Q中接收一个消息。
  这种通信链路具有如下特点:
  每对需要通信的进程之间自动地建立一条链路。进程只需要知道彼此的标识符;
  一个连接就只连接到这两个进程;
  每对进程间只能建立一条链路。
  这种机制在寻址上对称。发送者和接收者进程都必须要指明通信的另一方。这种机制的一个变种在寻址上采用了不对称的方式。只需发送者指明接收者;而接收者不需要指明发送者。在这种方式下,发送和接收原语定义如下:
  send(P,message)——发送一个消息给进程P;
  receive(id,message)——从任意进程中接收一个消息;变量id 被联系到与之通信的进程的名称。
  对称和不对称机制的缺点在于它限制了进程定义的模块化程度。更改一个进程的名称可能必须要检查其他所有进程的定义。必须要发现所有对原名称的引用,以便于更换为新名称。从独立编译角度来看,这种情形可不是希望看到的。
  (2)间接通信
  间接通信中,消息的发送和接收通过信箱(或端口)进行。可以抽象地把信箱看成一个对象,进程可以把消息放置其中也能从中取走。每个信箱都有一个唯一的标识符。在这种方式下,进程可以通过不同的信箱与其他进程通信。两个进程只有共享一个信箱才可以进行通信。发送和接收原语定义如下:
  send(A,message)——向信箱A中发送一个消息;
  receive(A,message)——从信箱A中接收一个消息。
  这种通信链路具有如下特点:
  只有在两个进程间有一个共享信箱的情况下才能在两者之间建立一个链接;
  一条链路可以连接两个或更多进程;
  在每对通信进程之间可以同时存在多个不同的链路,每条链路对应一个信箱。
  假设进程P1、P2和P3 共享信箱A,而且P2 和P3 正从A 中接收。那么谁将接收到P1 发送的消息呢?答案与我们选择的方案有关:
  允许一条链路最多连接两个进程;
  同时最多允许一个进程执行接收操作;
  允许系统任意选择进程来接收消息[就是说,P2 或者P3(但不能都是)将接收消息]。系统可能会确定接收者。
  一个信箱可能为一个进程或操作系统所有。如果信箱的所有者是一个进程(也就是说,此信箱占据了该进程的部分地址空间),那么就要区分所有者(唯一可以从这个信箱中接收消息)和用户(只能够向这个信箱中发送消息)。因为每个信箱有一个唯一的所有者,所以谁可以从此信箱中接收消息就很明确了。当一个拥有一个信箱的进程终止时,信箱也要消失。随后,向这个信箱发送消息的进程都会被告知该信箱已经不存在了。
  另外,操作系统拥有的一个信箱是独立的且不会依附于任何进程。那么操作系统必须要提供一种机制以允许一个进程做如下的工作:
  创建一个新信箱;
  通过这个信箱发送和接收消息;
  删除一个信箱。
  创建了一个新信箱的进程默认为该信箱的所有者。最初,所有者是唯一能够从此信箱中接收消息的进程。然而,可以通过系统调用将(信箱的)所有权和接收权交给其他进程。当然,这会造成每个信箱有多个接收者的情况。
  3.管道通信
  所谓管道通信,是指连接两个进程的一个打开的共享文件。发送进程以字符流的形式将大量的信息写入管道,接收进程则在需要时从管道中读出数据。为了协调双方的通信,管道通信机制必须对发送进程和接收进程在利用管道进行通信时实施同步和互斥,并且只有在确定双方存在时才能进行通信。

关于"最后阶段,真题的正确打开方式_备考经验_考研帮"15名研友在考研帮APP发表了观点

扫我下载考研帮

考研帮地方站更多

你可能会关心:

来考研帮提升效率

× 关闭