Java面试零拷贝

1.什么是零拷贝
所谓的零拷贝,就是取消用户空间与内核空间之间的数据拷贝操作,应用进程每一次的读写操作,都可以通过一种方式,让应用进程向用户空间写入或者读取数据,就如同直接向内核空间写入或者读取数据一样,再通过 DMA 将内核中的数据拷贝到网卡,或将网卡中的数据 copy 到内核。

系统内核处理 IO 操作分为两个阶段:等待数据拷贝数据
等待数据,就是系统内核在等待网卡接收到数据后,把数据写到内核中。
拷贝数据,就是系统内核在获取到数据后,将数据拷贝到用户进程的空间中。

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

2.Netty中的零拷贝
Netty的零拷贝是基于JVM,站在用户空间上,Netty的零拷贝主要体现在三个点:

  • Netty的接收和发送ByteBuffer是采用DIRECT BUFFERS,使用堆外的直接内存(内存对象分配在JVM中堆以外的内存)进行Socket读写,不需要进行字节缓冲区的二次拷贝。如果采用传统堆内存(HEAP BUFFERS)进行Socket读写,JVM会将堆内存Buffer拷贝一份到直接内存中,然后写入Socket中。 JVM堆内存的数据是不能直接写入Socket中的。相比于堆外直接内存,消息在发送过程中多了一次缓冲区的内存拷贝。

在这里插入图片描述

  • Netty提供了组合Buffer对象,也就是CompositeByteBuf 类,可以将 ByteBuf 分解为多个共享同一个存储区域的 ByteBuf,避免了内存的拷贝。
    在这里插入图片描述

  • Netty的文件传输采用了FileRegion 中包装 NIO 的 FileChannel.transferTo() 方法,它可以直接将文件缓冲区的数据发送到目标Channel,避免了传统通过循环write方式导致的内存拷贝问题。

零拷贝带来的作用就是避免没必要的 CPU 拷贝,减少了 CPU 在用户空间与内核空间之间的上下文切换,从而提升了网络通信效率与应用程序的整体性能。而 Netty 的零拷贝与操作系统的零拷贝是有些区别的,Netty 的零拷贝实质上是对用户空间中数据操作的优化,这对处理 TCP 传输中的拆包粘包问题有着重要的意义,通过 CompositeByteBuf可以有效解决这些问题。

如果开发中采用Netty框架作为RPC通信,我们要合理使用 ByteBuf 子类,做到完全零拷贝,提升 RPC 框架的整体性能。
(RPC 并不会把请求参数作为一个整体数据包发送到对端机器上,中间可能会拆分,也可能会合并其他请求,所以消息都需要有边界。接收到消息之后,需要对数据包进行处理,根据边界对数据包进行分割和合并,最终获得完整的消息。黏包拆包就不赘述了)

Kafka 中的零拷贝

假设kafka不做零拷贝优化,过程如下:
1.先看看要读的数据在不在OS Chche 里,如果不在的话就从磁盘文件里读取数据后放入OS Cache
2.接着从操作系统的OS Cache 里拷贝数据到应用程序进程的缓存里,再从应用程序进程的缓存里拷贝数据到操作系统层面的Socket缓存里
3.最后从Socket缓存里提取数据后发送到网卡,最后发送出去给下游消费者
在这里插入图片描述
kafka零拷贝优化后:
直接把OS Cache 中的数据发送到网卡后传输给下游的消费者,中间跳过两次拷贝数据的步骤
对于Socket缓存仅仅就是拷贝数据的描述符而已
在这里插入图片描述
在这里插入图片描述

总: 其实Netty也好,Kafka也好,都是面试常问的知识点,Netty的黏包拆包对比Dubbo的黏包拆包,IO模型,等等很多点可以问,这里只是简单介绍了一下零拷贝,希望可以帮到大家!

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值