什么是消息缓冲?
远程过程调用 (RPC) 是一种通信技术,一个程序使用它向另一个程序发出请求,以便在网络上使用其服务,甚至不知道网络的详细信息。
分布式系统中的进程间通信是使用消息传递来执行的。它允许使用用于发送和接收消息的原语在进程之间交换消息。程序员必须理解消息以及源进程和目标进程的名称。进程使用 send() 原语发送消息,进程使用 receive() 原语接收消息。
RPC 消息:
在分布式系统中,通过将消息从一个进程传递到另一个进程来在进程之间进行通信。消息传递处于最低级别的抽象,而 RPC 代表更高的抽象。由于最低级别的抽象,它要求应用程序程序员能够识别可能来自所涉及进程的消息、源进程、目标进程和数据类型。
语法:消息传递中用于 send() 和 receive() 原语的语法如下:
send (receiver, message) // requires the name of the destination process
and the message data as arguments
receive(sender, message) // requires the name of the sender process
and the message data as arguments
语义:
- 阻塞/非阻塞:阻塞的 send() 会停止进程并等待消息发送完毕并且消息缓冲区已被清除,然后再继续。另一方面,阻塞接收会在接收()处阻塞,直到消息到达。非阻塞发送快速将控制权返回给调用者。然后消息传输过程与发送阶段并行运行。
- Buffered/Unbuffered messages: Unbuffered receive() 意味着发送进程不使用消息缓冲区,而是立即将消息发送给接收进程。 send() 中的地址接收者是进程的地址;但是,在缓冲的 send() 中,地址是缓冲区的地址。
- Reliable/Unreliable send: Unreliable send() 将消息发送给接收者而不期望它被确认,并且它不会自动重新发送消息以确保接收。可靠的 send() 可确保在 send() 完成时已收到消息。
- 直接/间接通信:端口的使用允许间接通信。发送器向端口发送消息,接收器从端口接收消息。不是将消息发送到中间端口,而是将消息直接发送到进程,在直接通信的情况下,该进程在发送、接收中具体标识。
- 固定/可变大小消息:固定大小消息的大小受系统限制。可变大小的消息构造起来更复杂,但它们使编程更容易;固定大小的消息则相反。
消息类型:
RPC 实现中使用了两种类型的消息:
- 来电留言
- 回复信息
1. 来电留言:
客户端发送 向服务器调用消息,以便可以执行远程过程。
格式:
- 远程过程标识符:该字段包含有关要执行的远程过程的信息。
- 参数:执行过程所需的参数。
- 消息标识:该字段用于通过序列号标识丢失和重复的消息。
- 消息类型:该字段用于标识消息类型,即消息属于呼叫消息类型还是回复消息类型。
- 客户端标识:此字段允许服务器识别客户端并验证客户端进程。
RPC 调用消息格式:
Remote Procedure Identifier | ||||||
---|---|---|---|---|---|---|
Message Identifier | Message Type | Client Identifier | Program Number | Version Number | Procedure Number | Arguments |
2.回复消息:
服务器使用回复消息将远程过程执行的结果返回给客户端。 回复消息有两种形式——成功消息和不成功消息。
A. 成功回复消息:如果特定远程过程成功执行。
格式:
Message Identifier Message Type Reply Status (0) - Successful Result
B.不成功的消息:如果出现以下任何一种情况,则消息属于不成功类型:
- 服务器通过扫描客户端的标识符字段来识别客户端未被授权使用该服务。
- 标识符丢失。
- 如果服务器在程序号、版本号或过程号字段中找不到任何详细信息。
- 在远程过程执行期间,发生异常情况。
- 如果服务器无法解码给定的参数。
- 服务器发现呼叫消息与其不一致。
格式:
Message Identifier Message Type Reply Status (1) - Unsuccessful Reason for failure
消息缓冲
缓冲意味着在从一个进程到另一个进程的传输过程中发送或接收消息的排队。缓冲区是用来保存消息的临时存储区域,直到接收进程还没有准备好接收消息 以便以后可以检索。以下是取决于同步和异步系统的缓冲机制:
1. 同步系统
这些系统可以没有缓冲区或单个消息缓冲区。
空缓冲区或无缓冲区:
在无缓冲策略中,不使用临时存储来保存消息。它用于异步通信模式。在这个策略中使用了两种方法——消息将保留在发送者的地址空间中,即发送被延迟,直到接收者在完成当前接收后执行接收()原语。另一种,一条消息将被丢弃,然后在设置的一定时间后重新发送。
单消息缓冲区:
在单消息缓冲区机制中,在接收端维护一个缓冲区以仅存储单个消息。仅在接收者尚未准备好接收消息的情况下,才会缓冲消息。缓冲区的位置可以在内核的地址空间中,也可以在接收方的进程地址空间中。它用于同步通信模式。
2.异步系统:
这些系统可以具有无限容量缓冲区或有限绑定消息(多消息缓冲区)。
无限容量缓冲区:
在此策略中,如果在接收方,接收方尚未准备好接收消息,则发送方无需等待发送消息。无限容量是指将保留从发送方收到的所有消息并确保将这些消息传递给接收方。它用于异步通信模式。
有限绑定缓冲区(多消息缓冲区):
在有限界缓冲区中,该机制用于处理缓冲区溢出问题。它用于异步通信模式。分配的缓冲区空间取决于实现。以下是可用于处理此溢出问题的两种方法:
- 通信不成功: send() 原语向发送进程返回一条错误消息,即通信不成功,因为消息没有传递到预期的目的地。它不太可靠。
- 流控制通信:这里使用流控制策略,其中发送方保持阻塞,直到接收方开始接受一些消息,以便在缓冲区中为新消息创建空间。此策略通过阻止发送方来排除异步通信模式,从而导致意外死锁。
缓冲区空间的分配取决于实现。在接收方,接收方将消息保存在邮箱中,该邮箱位于内核的地址空间或接收方的进程地址空间中。