什么是零拷贝, 从 Java 到 Netty

news2024/10/3 2:14:46

前言

零拷贝是老生常谈的话题了, 不管是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的子类MappedByteBuffer, 这个类采用direct buffer也就是内存映射的方式读写文件内容. 这种方式直接调用系统底层的缓存, 没有JVM和系统之间的复制操作, 主要用户操作大文件

sendfile

FileChanneltransferTo()方法或者transferFrom()方法,底层就是sendfile() 系统调用函数。 实现了数据直接从内核的读缓冲区传输到套接字缓冲区, 避免了用户态与内核态之间的数据拷贝

Kafka 就是使用到它

Netty 的零拷贝

Netty的哦零拷贝主要体现在以下几个方面

  • slice
  • duplicate
  • CompositeByteBuf
  • ....

我们主要讲一下slice, 其他的下次一定

log 工具类

import io.netty.buffer.ByteBuf;

import static io.netty.buffer.ByteBufUtil.appendPrettyHexDump;
import static io.netty.util.internal.StringUtil.NEWLINE;

public class ByteBufUtil {
    // 打印
    public static void log(ByteBuf buf){
        final int length = buf.readableBytes();
        int rows = length / 16 + (length % 15 == 0 ? 0 : 1) + 4;
        StringBuilder str = new StringBuilder(rows * 80 * 2)
                .append("read index:").append(buf.readerIndex())
                .append(" write index: ").append(buf.writerIndex())
                .append(" capacity:").append(buf.capacity())
                .append(NEWLINE);
        appendPrettyHexDump(str, buf);
        System.out.println(str.toString());
    }

}
复制代码

slice

对原始的ByteBuf进行切片成多个ByteBuf, 切片后的ByteBuf并没有发生内存复制, 还是使用原始的ByteBuf内存, 但是切片后的ByteBuf各自有独立的read, write指针

注意:

  • slice不允许更改切片的容量, 切片时设置的长度是多少就是多少, 不允许扩容
  • 当我们释放原始ByteBuf内存之后, 切片后的ByteBuf就不能再访问了

测试:

  • 首先创建一个ByteBuf, 然后对其进行切片
  • 更改某一个切片查看原始ByteBuf是否更改
  • 原始数据跟着更改了说明内存地址没有发生改变

测试类

public static void main(String[] args) {
    // 创建 ByteBuf
    ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(10);

    // 向 byteBuf 缓冲区写入数据
    StringBuilder str = new StringBuilder();
    for (int i = 0; i < 5; i++) {
        str.append("nx");
    }
    byteBuf.writeBytes(str.toString().getBytes());

    // 打印当前 byteBug
    ByteBufUtil.log(byteBuf);

    // 切片的过程中并没有发生数据复制
    final ByteBuf slice = byteBuf.slice(0, 5);
    final ByteBuf slice1 = byteBuf.slice(5, 5);

    // 打印第一个切片
    ByteBufUtil.log(slice);
    // 打印第二个切片
    ByteBufUtil.log(byteBuf);

    slice.setByte(0, 'a');

    System.out.println("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
    // 打印第一个切片
    ByteBufUtil.log(slice);
    // 打印原始数组
    ByteBufUtil.log(byteBuf);
}
复制代码

打印结果如下

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/95192.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SDN网络中的转发数据和数据传输

数据驱动的网络 从数据驱动的角度来看网络&#xff0c;会发现一张现实中的网络存在着各种数据。设计和管理一张网络&#xff0c;主要是设计数据&#xff0c;存储数据&#xff0c;管理数据和分析数据。网络数据的规模、复杂度和变化速度&#xff0c;这3方面决定了数据处理的难度…

uni-app+uView实现多图上传功能。

最近使用uni-app开发一个多平台的小项目&#xff0c;项目需要多图上传&#xff0c;uni-app前端UI框架使用了uView UI。结合uView的Upload组件&#xff0c;实现了多图上传功能&#xff0c;多图上传可以限制上传的个数&#xff0c;以及选择设为封面功能。 目录效果图uView Upload…

html简洁漂亮的个人简历,个人主页,个人简介网页版(源码)

文章目录1.设计来源1.1 主界面1.2 基本资料1.3 专业技能1.4 教育经历1.5 工作经验2.效果和源码2.1 动态效果2.2 源代码源码下载作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/128349160 html简洁漂亮的个人简历,个人主页…

[深度学习基础]2.pycharm联合annaconda生成虚拟环境测试yoloV7

“戏过曼巴晃过神”1. 环境说明2. yoloV7的准备和说明2.1 yoloV7源码2.2 权重文件3. anaconda生成配套虚拟环境4. Pycharm联合conda虚拟环境1. 环境说明 承接上一篇&#xff0c;我们的软件如下&#xff08;我拿笔记本跑&#xff09;&#xff1a; python:3.9pycharm: 22.3GPU:…

【C语言进阶】参加面试怎能不会结构体?进来学,手把手教会你结构体的原理与使用

目录 &#x1f929;前言&#x1f929;&#xff1a; &#x1f92f;正文&#xff1a;结构体&#x1f92f;&#xff1a; 1.结构概述&#x1f357;&#xff1a; 2.结构的声明&#x1f354;&#xff1a; 3.特殊声明&#x1f35f;&#xff1a; 4.结构的自引用&#x1f363;&#xf…

32位处理器中,通过汇编指令实现64位数据的加减运算

32位处理器一次可以处理的数据是32bit&#xff0c;但如果是64bit的数据&#xff0c;依然可以运算&#xff0c;只是不能一步到位。下面以加法为例。 目录 1、基本思路 2、具体实现 (1) 将数据保存到寄存器 (2) 低32位相加 (3) 高32位相加 3、完整汇编代码 1、基本思路 一…

ODN 2006丨艾美捷CpG ODN系列说明书

艾美捷CpG ODN系列——ODN 2006&#xff1a;具有硫代磷酸酯骨架的CpG寡脱氧核苷酸&#xff08;B型&#xff09;。人和小鼠TLR9&#xff08;Toll样受体9&#xff09;的特异性配体。 艾美捷CpG ODN 丨ODN 2006化学性质&#xff1a; 序列&#xff1a;5-tcgtcttttgtcgttttgtgtcgtt…

非零基础自学Golang 第8章 包管理 8.8 Go语言命名规范 8.9 小结 8.10 知识拓展

非零基础自学Golang 文章目录非零基础自学Golang第8章 包管理8.8 Go语言命名规范8.8.1 驼峰式命名法8.8.2 导出标识符8.9 小结8.10 知识拓展8.10.1 标准包简介第8章 包管理 8.8 Go语言命名规范 对于Go语言命名规范&#xff0c;每一家公司根据自己的实际情况可能都有不同。 一…

仅仅上线一小时,下载量就破10W!阿里内部Java性能优化实战手册

当时看完这&#xff08;Java程序性能优化实战&#xff09;的时候&#xff0c;感到首先就Java的方方面面讲得比较全&#xff0c;但是不乱。而且每个点都讲得比较清楚&#xff0c;读下来也没有什么盲点。干货非常多。国内少有的能写得这么好的。我看了收获很多。所以这会推荐给朋…

HCIP-Cloud+Service+DevOps+Engineer+V2.0第一章华为端到端 DevOps 概览

HCIP-CloudServiceDevOpsEngineerV2.0第一章华为端到端 DevOps 概览 学习总结&#xff0c;思维导图整理&#xff0c;免费分享。侵权删除 本博文为HCIP-Cloud Service DevOps Engineer V2.0培训系列内容&#xff0c;[完整学习路径](https://education.huaweicloud.com/programs…

M.2、PCIe 和 NVMe 的定义和区别

资料来源&#xff1a;维基百科&#xff0c;电商平台等 文章目录结论M.2PCIeNVMe结论 基于阅读的资料&#xff0c;对三者之间的关系&#xff0c;总结为如下层次结构&#xff1a; M.2 M.2定义了计算机内部扩展卡的外观尺寸和电气接口规范。 外观尺寸&#xff1a; M.2模块的外…

艾美捷西妥昔单抗Cetuximab方案及相关研究

西妥昔单抗Cetuximab属于嵌合型IgG1单克隆抗体&#xff0c;分子靶点为表皮生长因子受体&#xff08;EGFR&#xff09;。EGFR信号途径参与控制细胞的存活&#xff0c;增殖、血管生成、细胞运动、细胞的入侵及转移等。 本品可以以高出内源配体约5到10倍的亲和力与EGFR特异结合&am…

BellmanFord算法与SPFA算法

​​​​​​ BellmanFord算法与SPFA算法 展开 Bellman-Ford Bellman-Ford 算法是一种用于计算带权有向图中单源最短路径&#xff08;SSSP&#xff1a;Single-Source Shortest Path&#xff09;的算法。该算法由 Richard Bellman 和 Lester Ford 分别发表于 1958 年和 1956 年…

nodejs+vue校园用车辆校车管理系统

本项目的应用场景描述如下&#xff1a;为减少学生等待校车的时间&#xff0c;合理安排校车调度&#xff0c;设计并开发一个校车预约系统&#xff0c;系统由手机端、服务器端、车载刷卡端三部分组成。学生通过手机应用&#xff08;或微信应用&#xff09;查看校车运行时段&#…

webpack系列之webpack打包图片多生成空白图片且图片不能正常加载的解决方式

文章の目录参考写在最后我用的是webpack的V5.75.0版本&#xff0c;下面是正确的配置方法 module.exports {...// 所有第三方文件模块的匹配规则module: {rules: [{test: /\.jpg|png|gif|bmp|ttf|eot|svg|woff|woff2$/,use: {loader: "url-loader",options: {limit:…

【火热报名中】2022“博客之星”年度总评选重磅启动!

技术人看过来~~2022 这一年&#xff0c;我们遇见了太多的曲折和磨砺&#xff0c;但大家依然保持初心、砥砺向前&#xff0c;用技术人的拳拳之心&#xff0c;抵挡来自时代浪潮的冲击与挑战。为嘉奖勤勉了一年的技术人&#xff0c;也为这一年的种种努力画上圆满的句号&#xff0c…

线性代数之行列式

矩阵的行列式&#xff0c;determinate&#xff08;简称det&#xff09;&#xff0c;是基于矩阵所包含的行列数据计算得到的一个标量。是为求解线性方程组而引入的。 1 行列式的定义 1.1 二阶行列式 对于二阶线性方程组 若b1b2都为0&#xff0c;则称齐次线性方程组&#xff0c;否…

Flutter - PageView(1) 基本用法

如果要实现页面切换和 Tab 布局&#xff0c;我们可以使用 PageView 组件。需要注意&#xff0c;PageView 是一个非常重要的组件&#xff0c;因为在移动端开发中很常用&#xff0c;比如大多数 App 都包含 Tab 换页效果、图片轮动以及抖音上下滑页切换视频功能等等&#xff0c;这…

【10秒在圣诞节做出温馨的圣诞树】

&#x1f935;‍♂️ 个人主页老虎也淘气 个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f44d;&#x1f3fb; 收藏…

1年就晋升了3级,全靠这份阿里大牛赠送的这份堪称神级架构师手册

又逢“金九银十”&#xff0c;年轻的毕业生们满怀希望与忐忑&#xff0c;去寻找、竞争一个工作机会。已经在职的开发同学&#xff0c;也想通过社会招聘或者内推的时机争取到更好的待遇、更大的平台。 然而&#xff0c;面试人群众多&#xff0c;技术市场却相对冷淡&#xff0c;…