什么是零拷贝, 从 Java 到 Netty

本文深入探讨了零拷贝的概念,通过mmap和sendfile两种方法阐述了其工作原理,并详细介绍了Java如何通过mmap和sendfile实现零拷贝,特别是Netty在log工具类和slice等方面的零拷贝优化。最后,文章通过示例验证了切片操作并未产生内存复制。
摘要由CSDN通过智能技术生成

前言

零拷贝是老生常谈的话题了, 不管是Kafka还是Netty都用到了零拷贝的知识, 本篇着重讲解了什么是零拷贝, 同时在JavaNetty中分别是怎么实现零拷贝的

什么是零拷贝

零拷贝是指计算机在执行IO操作的时候, CPU不需要将数据从一个存储区复制到另一个存储区, 进而减少上下文切换以及 CPU 拷贝的时间, 这是一种IO操作优化技术

零拷贝不是没有拷贝数据, 而是减少用户态, 内核态的切换次数 和 CPU拷贝次数, 目前实现零拷贝的主要三种方式分别是:

  • mmap + write
  • sendfile
  • 带有DMA收集拷贝功能的 sendfile

mmap

虚拟内存把内核空间和用户空间的虚拟地址映射到同一个物理地址, 从而减少数据拷贝次数, mmap技术就是利用了虚拟内存的这个特点, 它将内核中的读缓冲区与用户空间的缓冲区进行映射, 所有的IO操作都在内核中完成

sendfile

sendfileLinux 2.1 版本之后内核引入的一个系统调用函数

sendfile表示在两个文件描述符之间传输数据, 他是在操作系统内核中完成的, 避免了数据从内核缓冲区和用户缓冲区之间的拷贝操作, 因此可以用其来实现零拷贝

Linux 2.4版本之后, 对sendfile进行了升级, 引入了SG-DMA技术, 可以直接从缓冲区中将数据读取到网卡, 这样的话可以省去CPU拷贝

Java 实现的零拷贝

mmap

Java NIO有一个ByteBuffer的子

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码云笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值