📜  分布式系统中消息传递的IPC问题

📅  最后修改于: 2022-05-13 01:56:16.418000             🧑  作者: Mango

分布式系统中消息传递的IPC问题

发送者发送一条包含数据的消息,并且它是以接收者可以理解的方式制作的。分布式系统中的进程间通信是使用消息传递来执行的。它允许使用用于发送和接收消息的原语在进程之间交换消息。

典型的消息结构

1. 具有 3 个组件的固定长度标头:

  • 地址:地址组件由发送者和接收进程的唯一地址组成。它包含两部分:一部分包含发送进程的地址,另一部分包含接收进程的地址。
  • 序列号:序列号的作用类似于消息标识符 (ID),因为它用于由于系统故障而需要查找丢失或重复消息的情况。
  • 结构信息:它包含两个字段:类型(包括数据或指向数据的指针)和消息的长度是结构信息。

2. 不同大小的类型化数据对象的集合:

消息传递:消息传递系统提供了一组基于消息的 IPC(进程间通信)协议,同时使程序员免受复杂网络协议和许多异构平台的复杂性的影响。 send() 和 receive() 通信原语被进程用于相互交互。例如,进程 A 想要与进程 B 通信,然后进程 A 将使用 send() 原语发送消息,而进程 B 将使用 receive() 原语接收消息。

一个好的消息传递系统的特征:

  • 简单
  • 统一语义
  • 效率
  • 正确性
  • 可靠性
  • 灵活性
  • 安全
  • 可移植性

消息传递中的问题:

  • 邮件的发件人是谁?
  • 谁是预期的接收者?
  • 有单个接收器还是多个接收器?
  • 是否可以保证预期的收件人收到了邮件?是否需要等待发件人的回复?
  • 如果在通信过程中发生灾难性事件,例如通信链路故障或节点崩溃,是否有任何应对策略?
  • 如果接收者还没有准备好接收消息,应该如何处理?它是否会被销毁或保存在缓冲区中?如果在缓冲的情况下缓冲区也满了,要遵循哪些步骤?
  • 如果有多个未完成的消息,接收者能否对消息进行排序?

同步:

  • 每当进程需要通信时,就会调用 send() 和 receive() 原语。
  • 通信原语的通信过程同步是通信结构中的一个关键问题。

同步

同步语义:以下是进程间消息传递的两种方式:

  • 阻塞(同步)
  • 非阻塞(异步)

1. 阻塞:阻塞语义意味着当调用 send() 或 receive() 原语时会阻塞调用者的当前执行。

2.非阻塞:非阻塞语义意味着当调用send()或receive()原语不阻塞调用者的当前执行并且控制立即返回调用者。

  • 阻塞 send() 原语:阻塞 send() 原语是指阻塞发送过程。该进程保持阻塞状态,直到它从接收方接收到在执行此原语后已收到消息的确认。
  • 非阻塞 send() 原语:非阻塞 send() 原语是指发送进程的非阻塞状态,这意味着在 send() 语句执行后,当出现以下情况时,允许进程立即继续执行。消息已被传输到缓冲区。
  • 阻塞receive()原语:当receive语句被执行时,接收进程停止,直到收到消息。
  • 非阻塞receive()原语:非阻塞receive()原语意味着在执行receive()语句后接收进程没有被阻塞,在通知内核消息缓冲区的位置后立即返回控制。

非阻塞receive() 原语中的问题是,当消息到达消息缓冲区时,接收进程如何知道?为此目的,可以使用以下两个过程之一:

  1. 轮询:在轮询方法中,接收方可以在此方法中通过测试原语时检查缓冲区的状态。接收者定期轮询内核以检查消息是否已经在缓冲区中。
  2. 中断:在软件中断方法中使用软件中断来通知接收进程有关消息的状态,即消息何时已存储到缓冲区并准备好供接收器使用。因此,在此方法中,接收进程继续运行,而无需提交失败的测试请求。

在阻塞的 send() 和 receive() 原语中,存在一个问题:

  • 阻塞 send() 原语:这里可以提出的问题是,如果接收进程崩溃或发送的消息由于通信失败而丢失,则发送进程可能会永久停止。因此,阻塞 send() 原语设置了一个固定的时间值,当发送操作经过时会以错误状态停止以避免此问题。用户可以选择将超时值指定为发送原语的参数,也可以将其设置为默认值。
  • 阻塞接收()原语:为了避免接收过程无限期地停止,阻塞接收()原语可能与固定时间值连接。如果预期的发送过程失败或预期的消息由于通信故障而在网络上丢失,则可能会发生这种情况。