想要通信的进程必须有一种相互引用的方式。他们可以直接或间接的通信。

直接通信(direct communication)中:想要通信的进程必须显式地指定通信的接收方或发送方。在这种方式中,send()和receive()原语被定义为:

  • send(P, message)------向进程P发送message
  • receive(Q, message)-------从进程Q接收message

该方案中的通信线路(communication link)具有以下特性:

  • 每一对想要通信的进程之间都会自动建立一个链接线路。进程只需要知道相互通信的进程的标识符

  • 一个连接线路与两个进程相关

  • 在每一对进程之间,只存在一个链接线路

这个方案表现出对称(symmetry)寻址。也就是说发送者进程和接收者进程都必须命名对方进程以便通信。

与之相对的就是非对称(asymmetry)寻址,即只要发送者命名接收者,而接收者是不需要命名发送者的。采用非对称寻址的方式下,send()和receive()的原语定义如下:

  • send(P, message)------向进程P发送message
  • receive(id,message)----可以从任何进程接收message。其中的变量id被设置为与其通信的进程的名字

这两种方案的缺点(对称寻址和非对称寻址)是限制了进程定义的模块化。改变进程的标识符,可能需要检查所有其他进程的定义。找出所有引用就进程标识符的,并改为对新的标识符的引用。

一般来说,这种标识符必须明确指出的硬编码技术用的很少。

通过间接通信( indirect communication),消息被被发送到邮箱(mailbox)/端口(port),并从该邮箱(mailbox)/端口(port)接收消息。邮箱可以抽象成一个对象,进程可以向其中存放消息,也可以从中删除消息,每个邮箱都有一个唯一的标识符。比如:POSIX的消息队列使用一个int值来标识一个邮箱。进程可以通过一些不同的邮箱来与不同的进程通信,但是两个进程只有当他们有一个共享的邮箱时候才可以通信。其send()和receive()原语的定义如下:

  • send(A, message)------像邮箱A发送消息
  • receive(A, message)------从邮箱A接收消息

在此方案中,通信线路具有以下特性:

  • 只有当通信的一对进程拥有一个共享的邮箱,才可以建立通信线路。
  • 一个通信线路可能与两个以上的进程相关联。

  • 在每一对通信的进程之间,可能存在大量的不同的通信线路,每个线路对应一个邮箱。

现在假设进程P1,P2和P3都共享邮箱A。进程P1发送消息到邮箱,而进程P2和P3都执行receive()从邮箱A接收消息,哪一个进程会接收到进程P1发送的消息??答案取决于我们选择下列哪一种方法:

  • 允许通信线路最多与两个进程关联。

  • 每次最多只允许一个进程执行receive()操作。

  • 允许系统随意选择一个进程来接收消息(也就是说,P2或者P3来接收这个消息,也可能都不是)。系统会定义一个算法。来选择哪个进程来接收消息(比如,轮询(round robin),进程会轮流的接收消息),系统可以识别出这是关于哪个发送者的接受者。

一个邮箱可以由进程或操作系统拥有:

1.如果邮箱由进程拥有(也就是说,邮箱是进程的地址空间的一部分),那么需要区分拥有者(即只通过此邮箱接收消息)和使用者(只能向该邮箱发送消息)。因为每一个邮箱有一个唯一的拥有者,所以关于谁能接收到发送到邮箱的消息是没有任何疑问的。当拥有邮箱的进程终止时,邮箱也会消失。随后将消息发送到此邮箱的任何进程,都会得知邮箱不再存在。

2.与此相反,如果邮箱由操作系统拥有,那么这个邮箱是独立的,不属于任何特定的进程,因此操作系统必须提供机制来允许如下操作:

  • 创建新邮箱
  • 通过邮箱发送和接收信息
  • 删除邮箱

创建邮箱的进程默认是该邮箱的拥有者,最初,该邮箱拥有者是唯一可以通过此邮箱接收消息的进程。

不过,通过系统调用,拥有权和接收特权可以传递给其他进程,这会导致一个邮箱有多个接收者。

results matching ""

    No results matching ""