两分钟了解RPC和LPC

先直接上定义
RPC(Remote Procedure Call):远程过程调用,它是一种进程间通信(IPC)的方式,还有另一种 IPC 方式是本地过程调用(Local Procedure Call,LPC)。

1、LPC本地过程调用
了解RPC之前,先来说说本地过程调用(啥?你都知道?我不管,我就要说 =_=):

本地过程调用通常也被称为轻量过程调用或者本地进程间通信,通过这一方式,同一计算机上的进程可以进行通信。在多任务操作系统中,它使同时运行的任务能互相会话,这些任务共享内存空间。

(你:说的什么鬼玩意,看不懂)

别着急啊大哥,消消气、好事多磨啊,下面举个栗子理解下本地过程调用:

假设我们要调用函数 add 来计算 x + y 的结果(如下):

int add(int l, int r) {
        int v = l + r;
        return v;
  }

int x = 10;
int y = 20;
int z = add(x, y);

执行代码第8行时,实际执行的操作为:

1、将 x 和 y 的值压栈
2、进入 add 函数,取出栈中的值10 和 20,将其赋值给 l 和 r
3、然后执行代码第2行,计算 l + r 并将结果存到 v
4、将 v 的值压栈,然后从 add 函数返回
5、在第8行代码中,从栈中取出返回的结果 30 ,并赋值给 z

上述 5 步是执行本地调用的过程。(ps:上述步骤是为了简单说明原理,实际上编译器在运算时可能会做出优化)

2、RPC远程过程调用
本地过程调用理解完了,再来看看啥是远程过程调用

远程么,意思就是要调用的函数不在本地,就上述例子而言,可以理解为 add 函数是在远程机器的某个进程中执行的。那问题来了,这咋调,还能像LPC那样了么?

哎,你还别说,那自然是不能了啊,实际上确实会带来一些新的问题

首先,如何告诉远程机器具体要调用哪个函数,比如上述我们要调用 add,而不是别的什么函数?我们知道,在本地调用时使用函数指针来定位函数。但这种方式在远程调用中是行不通的,因为进程的地址空间是完全不同的。所以,要解决这个问题,远程调用中所有函数都必须要有自己唯一的ID作为标识。客户端在做 RPC 时,必须带上这个函数的ID。这就需要在客户端和服务端分别维护一个(函数 <=> Call ID)的映射表。表可以不同,但是同一个函数对应的 Call ID 必须相同。这样,当客户端进行RPC时,查一下自己的表,找到要调用函数对应的Call ID,接着把 Call ID 传给服务端,然后服务端查自己的表,通过 Call ID 确定客户端要调的函数,最后执行对应函数代码。

其次,客户端在 RPC 时如何把对应的参数值传到远端?我们知道,在本地调用时只需将参数压栈,之后让函数去栈里读出来即可。但在远程调用中,客户端跟服务端进程是不同的,即无法利用内存传参。甚至另一种情况是,客户端和服务端用的不是同一种语言。因此,要解决该问题,就需要序列化和反序列化。意思就是 客户端先把参数转换成一个字节流传给服务端,服务端收到字节流后再把其转换成自己能读的格式进行读取。当然,从服务端返回给客户端的值也需要此过程。

最后,RPC 通常用在网络上,我们知道 客户端和服务端是通过网络连接的,数据的交互需要经由网络进行传输,所以 RPC 需要一个网络传输层。其作用就是将客户端的 Call ID 和序列化后的字节流传给服务端,再把序列化的运算结果返回给客户端。(相关协议是没有具体限制的,只要能完成这个传输过程的都可以)。

所以总结一下子,要实现RPC呢,就需要有三个必要的机制,大声喊出来它们是什么,对喽、它们是:
1、Call ID
2、序列化和反序列化
3、网络传输层


RPC时,客户端和服务端都做了啥?

好了,大家既然已经知道RPC是个啥了,接下来就来看看在RPC时,客户端和服务端都做了哪些事?

Client:

int z = Call(ServerAddr, add, x, y)
根据上面的调用从映射表中取出对应的 Call ID;
将 Call ID,x ,y 进行序列化处理;
将第2步得到的序列化数据包发送给ServerAddr(需要网络传输);
等待 Server 将结果返回;
若 Server 端调用成功,Client 将结果反序列化,再赋值给 z。

Server:

本地维护一个Call ID到函数指针的映射表;
等待 Client 的请求;
收到请求后,将收到的数据包进行反序列化,获得Call ID;
通过查映射表得到 Call ID 对应的函数指针;
本地调用 add 函数,得到结果;
把得到的结果进行序列化,然后通过网络传输再返回给 Client。

行了,就说这些吧,大伙儿明没明白?明白了吧。

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
LWIP(轻量级IP协议栈)和UIP(嵌入式IP协议栈)都是广泛使用的嵌入式操作系统网络协议栈。在LPC1788处理器上进行LWIP和UIP的移植可以实现网络功能。LPC1788是一款由恩智浦半导体公司生产的ARM Cortex-M3内核的微控制器。 LWIP和UIP的移植过程相似,下面是一个简单的移植指南: 1. 首先,需要在LPC1788处理器上设置合适的硬件和软件环境。确保处理器的外围设备(例如以太网控制器)和网络接口正确配置并连接。 2. 接下来,从LWIP或UIP的官方网站上下载相应的源代码。确保下载的版本与LPC1788处理器兼容。 3. 将源代码解压缩到LPC1788处理器的开发环境中。确保源代码的文件结构正确。 4. 打开源代码文件中的配置文件,通常是一个.h文件,根据LPC1788处理器的硬件配置进行相应的设置。这些配置包括网络接口和IP地址的设置,以太网控制器和中断的配置等。 5. 根据LPC1788处理器的中断控制器的配置,修改源代码中的中断处理函数。这些函数负责接收和处理网络数据包。 6. 根据LPC1788处理器的时钟配置,调整源代码中的时钟设置,以确保网络功能与处理器的时钟频率同步。 7. 最后,对源代码进行编译和链接,生成可执行文件。将可执行文件下载到LPC1788处理器并运行,即可进行网络通信。 通过以上步骤,就可以在LPC1788处理器上成功移植LWIP和UIP的网络协议栈,实现网络功能。可以使用网络协议栈提供的API来进行数据的发送和接收,实现远程数据通信等功能。同时,还可以根据具体应用的需求进行定制和优化,以提高系统的性能和效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值