📜  操作系统中的远程过程调用 (RPC)

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

操作系统中的远程过程调用 (RPC)

远程过程调用 (RPC)是一种强大的技术,用于构建基于客户端-服务器的分布式应用程序。它基于对传统本地过程调用的扩展,因此被调用过程不必调用过程存在于相同的地址空间中。这两个进程可能在同一个系统上,也可能在不同的系统上,通过网络连接它们。

进行远程过程调用时:

1.调用环境暂停,过程参数通过网络传递到过程执行的环境,在那里执行过程。



2.当过程完成并产生结果时,其结果被传送回调用环境,在那里继续执行,就像从常规过程调用返回一样。

注意:RPC特别适用于客户端-服务器(例如查询-响应)交互,其中控制流在调用者和被调用者之间交替。从概念上讲,客户端和服务器不会同时执行。相反,执行线程从调用者跳转到被调用者,然后再返回。

RPC的工作

在 RPC 期间发生以下步骤:

  1. 客户端调用客户端存根过程,以通常的方式传递参数。客户端存根驻留在客户端自己的地址空间中。
  2. 客户端存根将参数编组(打包)到消息中。编组包括将参数的表示转换为标准格式,并将每个参数复制到消息中。
  3. 客户端存根将消息传递到传输层,传输层将其发送到远程服务器机器。
  4. 在服务器上,传输层将消息传递到服务器存根,该存根对参数进行解组(解包)并使用常规过程调用机制调用所需的服务器例程。
  5. 当服务器过程完成时,它返回到服务器存根(例如,通过正常过程调用返回) ,它将返回值编组为消息。然后服务器存根将消息传递给传输层。
  6. 传输层将结果消息发送回客户端传输层,后者将消息传递回客户端存根。
  7. 客户端存根解组返回参数并将执行返回给调用者。

RPC 问题

必须解决的问题:



1. RPC 运行时:
RPC 运行时系统是一个例程库和一组处理作为 RPC 机制基础的网络通信的服务。在 RPC 调用过程中,客户端和服务器端运行时系统的代码处理绑定、通过适当的协议建立通信、在客户端和服务器之间传递调用数据并处理通信错误。

2. 存根:
存根的函数是为程序员编写的应用程序代码提供透明度

  • 在客户端,存根处理客户端本地过程调用和运行时系统之间的接口,编组和解组数据,调用 RPC 运行时协议,并在需要时执行一些绑定步骤。
  • 在服务器端,存根在运行时系统和由服务器执行的本地管理器过程之间提供了一个类似的接口。

3. 绑定:客户端如何知道调用谁,服务驻留在何处?
最灵活的解决方案是使用动态绑定并在第一次进行 RPC 时在运行时查找服务器。第一次调用客户端存根时,它会联系名称服务器以确定服务器所在的传输地址。

绑定由两部分组成:

  • 命名:
  • 定位:
  1. 具有提供服务的服务器为其导出接口。导出接口会将其注册到系统,以便客户端可以使用它。
  2. 客户端必须先导入(导出的)接口,然后才能开始通信。

4. 与 RPC 相关的调用语义:
主要分为以下几种选择——

  • 重试请求消息 –
    是否在服务器失败或接收方未收到消息时重试发送请求消息。
  • 重复过滤——
    删除重复的服务器请求。
  • 结果的重传——
    重新发送丢失的消息,而无需重新执行服务器端的操作。

好处 :

  1. RPC 提供抽象,即网络通信的消息传递性质对用户是隐藏的。
  2. RPC 通常会省略许多协议层以提高性能。即使是很小的性能改进也很重要,因为程序可能会经常调用 RPC。
  3. RPC 使应用程序能够在分布式环境中使用,而不仅仅是在本地环境中使用。
  4. 使用 RPC 代码重写/重新开发的工作量被最小化。
  5. RPC 支持面向进程和面向线程的模型。

参考:

  • https://web.cs.wpi.edu/~cs4514/b98/week8-rpc/week8-rpc.html
  • https://users.cs.cf.ac.uk/Dave.Marshall/C/node33.html
  • 计算机网络:FOROUZAN 自上而下的方法