操作系统 远程过程调用RPC是什么
远程过程调用或RPC是一种构建分布式、基于客户端-服务器的应用程序的强大技术。它也被称为函数调用或子程序调用。远程过程调用是指计算机程序引起一个程序在不同的地址空间中执行的过程,编码为本地过程调用,而程序员不需要明确指定远程交互的细节。程序员写的代码基本上是相同的,无论子程序是在执行程序本地还是远程。这是一种通过请求-响应消息传递系统实现的客户端-服务器交互形式。
RPC模型意味着 位置透明性 ,即调用过程在本地或远程调用时基本相同。通常情况下,它们并不完全相同,以便区分本地调用和远程调用。远程调用通常比本地调用慢得多且不可靠,因此区分它们非常重要。
RPC是一种进程间通信(IPC)的形式,不同的进程具有不同的地址空间。即使在同一主机上,它们也有不同的虚拟地址空间,尽管物理地址空间是相同的。而如果它们位于不同的主机上,则物理地址空间是不同的。
如何进行远程过程调用
调用环境被暂停,过程参数被传输到执行过程的环境中,然后在那里执行该过程。
当过程完成并产生结果时,它被传送回调用环境,在那里执行继续进行,就像从常规过程调用返回一样。
注意:RPC特别适用于客户端-服务器(例如,查询-响应)交互,其中控制流在调用方和被调用方之间交替。在概念上,客户端和服务器不同时执行;而是执行的线程从调用者跳转到被调用者,然后再返回。
程序的类型
在操作系统中,有三种远程过程调用(RPC)的类型,例如:
1. 回调RPC
这种类型的RPC实现了参与进程之间的P2P范式。它可以让一个进程成为客户端和服务器服务的双重角色。回调RPC具有以下功能,例如:
- 远程处理互动应用程序问题。
- 为服务器提供客户端句柄。
- 通过回调使客户端进程等待。
- 管理回调死锁。
- 在参与进程之间实现对等范式。
2. 广播RPC
广播RPC是客户端的请求在网络上广播,并由所有服务器使用相应的方法进行处理。广播RPC具有以下功能,例如:
- 允许指定客户端的请求消息需要广播。
- 可以声明广播端口。
- 有助于减轻物理网络的负载。
3. 批处理模式RPC
批处理模式RPC有助于在客户端上将RPC请求排队,分开,并将它们一次性发送到网络上的服务器。批处理模式RPC具有以下功能,例如:
- 通过一次性将请求发送到服务器来最小化发送请求所涉及的开销。
- 这种类型的RPC协议仅适用于需要较低调用速率的应用程序。
- 需要可靠的传输协议。
RPC是做什么的
当使用RPC框架编译成可执行程序的程序语句时,编译代码中包含一个代表远程过程代码的存根。
当程序运行并发出过程调用时,存根接收请求并将其转发到本地计算机中的客户端运行时程序。当第一次调用客户端存根时,它会联系一个名称服务器以确定服务器所在的传输地址。
客户端运行时程序知道如何寻址远程计算机和服务器应用程序,并通过网络发送请求远程过程的消息。类似地,服务器包含一个运行时程序和与远程过程本身进行接口的存根,并以相同方式返回响应请求协议。
RPC的特点
在操作系统中,远程过程调用(RPC)具有以下特点,例如:
- RPC将消息传递过程的复杂性对用户进行了隐藏。
- RPC只使用OSI模型的特定层,如传输层。
- 客户端可以使用高级语言与服务器进行通信。
- RPC适用于本地环境和远程环境。
- RPC的程序代码简单易懂,程序员容易理解。
- 操作系统可以轻松处理与RPC相关的进程和线程。
- 操作系统将RPC的抽象隐藏对用户。
RPC工作原理
当调用远程过程调用时,调用环境被暂停,过程参数经过网络传输到执行过程的环境中,然后在该环境中执行该过程。
当过程完成时,结果被传送回调用环境,执行会继续,就像从普通的过程调用返回一样。
在操作系统中,远程过程调用(RPC)按照以下步骤工作:
第一步: 客户端、客户端存根和RPC运行时在客户端机器上执行。
第二步: 客户端通过常规方式传递参数来启动客户端存根进程。过程参数的打包称为 编组(marshalling) 。客户端存根存储在客户端的地址空间中,还询问本地RPC运行时返回给服务器存根。
第三步: 在这个阶段,用户可以通过进行常规的本地过程调用来访问RPC。RPC运行时管理客户机和服务器之间的消息传输,并执行重新传输、确认、路由和加密。
第四步: 完成服务器过程后,它返回给服务器存根,后者将返回值打包(编组)到一个消息中。然后,服务器存根将消息发送回传输层。
第五步: 在这一步中,传输层将结果消息发送回客户端传输层,后者再将一条消息返回给客户端存根。
第六步: 在这个阶段,客户端存根解组(解压)返回报文中的返回参数,并将执行过程返回给调用者。
远程过程调用RPC的问题
在操作系统中,远程过程调用(RPC)面临一些必须解决的问题:
1. RPC运行时
RPC运行时系统是处理RPC机制底层的网络通信的一组例程和服务的库。在RPC调用过程中,客户端和服务器端的运行时系统代码处理绑定、建立适当协议的通信、在客户端和服务器之间传递调用数据,并处理通信错误。
2. 存根(Stub)
存根的功能是为程序员编写的应用程序代码提供透明性。
- 在客户端上: 存根处理客户端本地过程调用和运行时系统之间的接口,进行数据封装和解封装,调用RPC运行时协议,并在请求时执行一些绑定步骤。
- 在服务器端: 存根为运行时系统和服务器执行的本地管理程序之间提供类似的接口。
3. 绑定(Binding)
客户端如何知道要调用谁以及服务所在的位置?
最灵活的解决方案是在RPC第一次发起时使用动态绑定并在运行时找到服务器。当客户端存根第一次被调用时,它会联系一个名称服务器来确定服务器所在的传输地址。绑定包括两个部分:
- 命名(Naming): 一个拥有提供服务的服务器为其导出一个接口。导出接口将其注册到系统中,以便客户端可以使用它。
- 定位(Locating): 客户端在通信开始之前必须导入一个(导出的)接口。
4. 与RPC关联的调用语义
它主要分为以下选择:
- 重试请求消息(Retry request message): 当服务器失败或接收者没有接收到消息时,是否重试发送请求消息。
- 重复过滤(Duplicate filtering): 删除重复的服务器请求。
- 结果重传(Retransmission of results): 重新发送丢失的消息,而不需要在服务器端重新执行操作。
RPC的特点
这是远程过程调用的基本特点:
- 被调用的过程位于另一个进程中,很可能位于另一台机器上。
- 进程之间不共享地址空间。
- 参数只通过值传递。
- RPC在服务器进程的环境中执行。
- 它不提供对调用过程环境的访问。
RPC的优势
这里是远程过程调用的一些优点或好处,例如:
- RPC方法通过在高级语言中常用的过程调用来帮助客户端与服务器进行通信。
- RPC方法是基于本地过程调用进行建模的,但是该过程很可能在不同的进程中执行,通常是在不同的计算机上执行。
- RPC支持进程和线程导向的模型。
- RPC将内部消息传递机制对用户隐藏。
- 重新编写和重新开发代码所需要的工作量最小。
- 远程过程调用可以用于分布式和本地环境。
- 它致力于优化许多协议层以提高性能。
- RPC提供了抽象。例如,网络通信的消息传递特性对用户来说是隐藏的。
- RPC允许在分布式环境中使用应用程序,而不仅限于本地环境。
- 使用RPC代码可以将重新编写和重新开发的工作量最小化。
- RPC支持进程导向和线程导向的模型。
RPC的缺点
这里列举了使用RPC的一些缺点,例如:
- 远程过程调用仅通过值和指针值传递参数,不允许传递引用。
- 远程过程调用(以及返回)的时间(即开销)可以显著低于本地过程。
- 由于涉及通信系统、另一台机器和另一个进程,因此该机制非常容易出现故障。
- RPC的概念可以以不同的方式实现,这是无法标准化的。
- RPC在硬件架构方面不提供任何灵活性,因为它主要是基于交互的。
- 远程过程调用会增加进程的成本。