欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

RPC实战与核心原理——网络通信(笔记)

程序员文章站 2022-07-09 19:39:01
RPC 是解决进程间通信的一种方式。一次 RPC 调用,本质就是服务消费者与服务提供者间的一次网络信息交换的过程。服务调用者通过网络 IO发送一条请求消息,服务提供者接收并解析,处理完相关的业务逻辑之后,再发送一条响应消息给服务调用者,服务调用者接收并解析响应消息,处理完相关的响应逻辑,一次RPC 调用便结束了。可以说,网络通信是整个 RPC 调用流程的基础。常见的网络IO模型同步IO同步阻塞 IO(BIO)同步非阻塞 IO(NIO)IO 多路复异步IO用和异步非阻塞 IO(AIO)....

RPC 是解决进程间通信的一种方式。一次 RPC 调用,本质就是服务消费者与服务提供者间的一次网络信息交换的过程。服务调用者通过网络 IO发送一条请求消息,服务提供者接收并解析,处理完相关的业务逻辑之后,再发送一条响应消息给服务调用者,服务调用者接收并解析响应消息,处理完相关的响应逻辑,一次RPC 调用便结束了。可以说,网络通信是整个 RPC 调用流程的基础。

常见的网络IO模型

同步IO

  • 同步阻塞 IO(BIO)
  • 同步非阻塞 IO(NIO)
  • IO 多路复

异步IO

  • 用和异步非阻塞 IO(AIO)

阻塞IO(blocking IO)

同步阻塞 IO 是最简单、最常见的 IO 模型,在 Linux 中,默认情况下所有的 socket 都是blocking 的

(1)应用进程发起 IO 系统调用后,应用进程被阻塞,转到内核空间处理;
(2)内核开始等待数据,等待到数据;
(3)将内核中的数据拷贝用户内存中;
(4)整个 IO 处理完毕后返回进程;
(5)应用的进程解除阻塞状态,运行业务逻辑。
特点:系统内核处理 IO 操作分为两个阶段——等待数据拷贝数据。而在这两个阶段中,应用进程中 IO 操作的线程会一直都处于阻塞状态

IO 多路复用(IO multiplexing)

多路复用 IO 是在高并发场景中使用最为广泛的一种 IO 模型,如 Java 的 NIO、Redis、Nginx 的底层实现就是此类 IO模型的应用,经典的 Reactor 模式也是基于此类 IO 模型。

什么是多路复用

多路就是指多个通道,也就是多个网络连接的 IO,而复用就是指多个通道复用在一个复用器上。多个网络连接的 IO 可以注册到一个复用器(select)上,当用户进程调用了 select,那么整个进程被阻塞。同时,内核会“监视”所有 select 负责的 socket,当任何一个socket 中的数据准备好了,select 就会返回。这个时候用户进程再调用 read 操作,将数据从内核中拷贝到用户进程。

相对于同步堵塞模型的优势

用户可以在一个线程内同时处理多个socket 的 IO 请求。用户可以注册多个 socket,然后不断地调用 select 读取被激活的socket,即可达到在同一个线程内同时处理多个 IO 请求的目的。而在同步阻塞模型中,必须通过多线程的方式才能达到这个目的。

为什么阻塞IO和IO多路复用最为常用

系统内核的支持上,现在大多数系统内核都会支持阻塞 IO、非阻塞 IOIO 多路复用,但像信号驱动 IO、异步 IO,只有高版本的 Linux 系统内核才会支持;在编程语言上,在高性能的网络编程框架的编写上,大多数都是基
Reactor 模式,而 Reactor 模式是基于 IO多路复用的。

RPC框架在网络通信上倾向选择哪种网络 IO 模型

IO 多路复用更适合高并发的场景,可以用较少的进程(线程)处理较多的 socket 的 IO 请求,但使用难度比较高阻塞 IO 每处理一个 socket 的 IO 请求都会阻塞进程(线程),但使用难度较低。在并发量较低业务逻辑只需要同步进行 IO 操作的场景下,阻塞IO 已经满足了需求,并且不需要发起 select 调用,开销上还要比 IO 多路复用低。
在 RPC 框架的实现中,在网络通信的处理上,选择 IO 多路复用的方式较多。开发语言的网络通信框架的选型上,我们最优的选择是基于Reactor 模式实现的框架,在 Linux 环境下,也要开启 epoll 来提升系统性能(Windows 环境下是无法开启 epoll 的,因为系统内核不支持)。

零拷贝

背景

应用进程的每一次写操作,都会把数据写到用户空间的缓冲区中,再由 CPU 将数据拷贝到系统内核的缓冲区中,之后再由 DMA 将这份数据拷贝到网卡中,最后由网卡发送出去。这里我们可以看到,一次写操作数据要拷贝两次才能通过网卡发送出去,而用户进程的读操作则是将整个流程反过来,数据同样会拷贝两次才能让应用程序读取到数据。

应用进程的一次完整的读写操作,都需要在用户空间与内核空间来回拷贝,并且每一次拷贝,都需要 CPU 进行一次上下文切换(由用户进程切换到系统内核,或由系统内核切换到用户进程),很浪费CPU

概念

零拷贝:取消用户空间与内核空间之间的数据拷贝操作,应用进程每一次的读写操作,可以通过一种方式,直接将数据写入内核或从内核中读取数据,再通过 DMA 将内核中的数据拷贝到网卡,或将网卡中的数据 copy 到内核。

实现方式

零拷贝有两种解决方式,分别是 mmap+write 方式sendfile 方式,其核心原理都是通过虚拟内存来解决的。

本文地址:https://blog.csdn.net/weixin_42094659/article/details/107589684

相关标签: 笔记 rpc