零拷贝实现原理与使用

dea1cd09d87a5950f734e5db4f6d8880.png

若有收获,请记得分享和转发哦

零拷贝是中间件相关面试中必考题,本文就和大家一起来总结一下NIO拷贝的原理,并结合Netty代码,从代码实现层面近距离观摩如何使用java实现零拷贝。

1、零拷贝实现原理

**“零拷贝”**其实包括两个层面的含义:

  • 拷贝 一份相同的数据从一个地方移动到另外一个地方的过程,叫拷贝。

  • 零 希望在IO读写过程中,CPU控制的数据拷贝到次数为0。

在IO编程领域,当然是拷贝的次数越少越好,逐步优化,将其拷贝次数将为0,最大化的提高性能。

那接下来我们循序渐进来看一下如何减少数据复制。

接下来我们将以RocketMQ消息发送、消息读取场景来阐述IO读写过程中可能需要进行的数据复制与上下文切换。

1.1 传统的IO读流程

一次传统的IO读序列流程如下所示:a5096a9c7f086c60710d0ef3c45c60f8.pngjava应用中,如果要将从文件中读取数据,其基本的流程如下所示:

379058802ad24d0a0c3c9a26259f05dd.png

ee311f4f6cabaeb1627e3cfd332af3b4.png

27f3dc8a24d16c8bb2b3dafe08843948.png

39f0a3152e4622e8073f2c6a2c8f00ef.png

036c9cc536c0fe53cea7a41c34e8575d.png

2e73b6af5b7449848e4503748cb6796e.png

da11ecf4dc22f6aab908071d450100a3.png

11bf5758ac155f5b84bc0e0e45382309.png

05d7154564483d4f855c2ed14b7fc967.png

34bd9addf828db37f5830e64c4cc5851.png

是否调用了FileChannel的transferTo方法。

温馨提示:本文并没有打算详细分析Epoll机制以及编程实践。

2.2 NioSocketChannel 通道零拷贝实现

4102c368e1aa0a2e320ff67bde8db554.png

从Netty的实现中我们基本可以得出结论:是否是零拷贝,判断的依据是是否调用了FileChannel的transferTo方法,更准备的表述是底层是否调用了操作系统的sendfile函数,并且操作系统底层还需要支持gather机制,即linux的内核版本不低于2.4。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值