📜  分布式系统——RPC中的参数传递语义

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

分布式系统——RPC中的参数传递语义

分布式系统是可以通过消息传递相互交换信息的机器网络。它非常有用,因为它有助于资源共享。在本文中,我们将详细介绍分布式系统中 RPC 中的各种参数传递语义。

RPC 中的参数传递语义:

参数传递是远程过程调用 (RPC) 中客户端和服务器之间共享信息的唯一方式。以下是 RPC 中用于在分布式应用程序中传递参数的各种语义:

1. Call-by-Value:客户端存根将来自客户端的值复制并打包成消息,以便可以通过网络将其发送到服务器。

  • 参数封送处理是将参数包装到消息中的过程。考虑远程过程 add(x, y),它返回两个整数参数的相加。
  • 客户端存根将其两个参数连同被调用方法的名称或编号一起存储在消息中。
  • 当消息到达服务器时,存根评估消息以确定需要哪种方法,然后执行必要的调用。
  • 在服务器完成执行后,客户端将服务器的结果放入消息中。然后这个消息被客户端存根接收,并在将值返回给客户端过程之前执行它的解包。
  • 只要客户端和服务器计算机相似并且所有参数和结果都是标量类型,如布尔值、字符和整数,这种参数解析语义就可以很好地工作。

2. Call-by-Reference: Call-by-Reference 仅仅意味着指向参数的指针从客户端传输到服务器。在某些 RPC 技术中,参数可以通过引用传递。用于多个进程共享一个地址的封闭系统。

  • 例如,参数可以在分布式系统中通过引用传递,使用分布式共享内存技术。
  • 如果在客户端,第二个参数是缓冲区的地址,假设为 100,那么不能简单地向服务器提供 100 并期望它函数,因为地址 100 可能位于服务器程序文本的中间。在某些系统中,它是通过将指针发送到服务器存根并在服务器函数中实现特殊的指针特定逻辑来管理的。
  • 可以通过将指针保存在寄存器中来跟随指针,然后通过寄存器间接跟随它(取消引用)。当使用这种技术时,通过向客户端存根发送一条消息来取消引用指针,告诉它获取并传递指向的项目(读取)或保存指向的地址的值(写入)。虽然这种方法很有效,但大多数时候效率很低。
  • 只有在使用它的进程的地址空间内,指针才有意义。如果第二个参数是客户端缓冲区的地址,即 1000,则不能简单地将 1000 提供给服务器并期望它函数。在服务器上,地址 1000 可以位于程序文本的中间。
  • 例如,在 C 中,在传递数组时,会提供变量的地址。处理基于指针的数据结构,例如指针、列表、树、堆栈、图形等。
    • Call-by-object-reference:这里 RPC 机制使用对象调用。保存变量的值用于引用对象。
    • Call-by-move:一个参数是通过引用传递的,很像call-by-object引用方法,只是参数对象在调用过程中被重定位到目标节点(被调用者)。如果它保留在调用者的节点上,则称为逐次调用。它允许将参数对象与调用消息打包在同一网络数据包中,从而减少网络流量和消息计数。

问题:

  • 但是,在大型分布式系统中,通常具有多种机器类型。每台机器通常以不同的方式显示数字、字母和其他数据对象。
  • 例如,IBM 大型机和 IBM 个人计算机使用不同的编码技术,例如 IBM 大型机使用 EBCDIC,但 IBM PC 使用 ASCII。由于这种差异,这两者之间无法传输字符参数。
  • 整数和浮点数都可能在表示方面遇到挑战。
  • 另一个问题是一些机器从右到左计算字节数,而另一些机器从左到右计算它们。例如 Intel/AMD x86,Digital VAX 以 Little-Endian 形式处理数据,而 Sun SPARC,Power PC 以另一种方式(即 Big-Endian 形式)表示数字。