聊聊零拷贝?

news2024/12/23 20:49:45

什么是零拷贝

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

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

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

mmap

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

sendfile

sendfile是Linux2.1 版本之后内核引入的一个系统调用函数

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

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

Java实现的零拷贝

mmap

在Java NIO 有一个ByteBuffer的子类MappedByteBuffer,这个类采用direct buffer 也就是内存映射的方式读写文件内容。这种方式直接调用系统底层的缓存,没有JVM和系统之间的复制操作,主要用户操作大文件

sendfile

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

Netty的零拷贝

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

  • slice
  • duplicate
  • CompositeByteBuf

slice

log 工具类

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);
    }
}

slice

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

注意:

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

测试:

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

测试类

public static void main(String[] args) {
        System.out.println(32 / 16);
        System.out.println(32 >> 4);
        System.out.println("------------------------");
        // 创建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());


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

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

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

        slice.setByte(0, 'a');
        System.out.println("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
        // 打印第一个切片
        ByteBufUtil.log(slice);
        // 打印原始数组
        ByteBufUtil.log(byteBuf);
    }

在这里插入图片描述

额外知识补充

  • / 等于 >>
  • × 等于 <<

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

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

相关文章

【Python】sklearn中的K-Means聚类

文章目录初步认识初值选取小批初步认识 k-means翻译过来就是K均值聚类算法&#xff0c;其目的是将样本分割为k个簇&#xff0c;而这个k则是KMeans中最重要的参数&#xff1a;n_clusters&#xff0c;默认为8。 下面做一个最简单的聚类 import numpy as np import matplotlib.…

Python基础语法之学习print()函数

在AI时代&#xff0c;编程已不是程序猿、攻城狮的专属属性&#xff0c;而是一个工具&#xff0c;或是一种技巧&#xff0c;本质上跟Word、PPT没啥区别。如果大家现在想掌握一门编程技能的话&#xff0c;那一定是 Python, 因为它既简洁高效&#xff0c;又能快速入门上手。本文将…

JavaWeb语法三:线程不安全问题的原因和解决方案

目录 1.线程的状态 2.线程不安全的原因 2.1&#xff1a;原子性 2.2&#xff1a; 可见性 2.3&#xff1a;有序性 3.解决线程不安全问题 3.1&#xff1a;synchronized 3.1.1&#xff1a;互斥 3.1.2&#xff1a;可重入 3.2&#xff1a;volatile关键字 3.3&#xff1a;w…

傻白入门芯片设计,盘点GPU业界的大佬(十五)

在PC个人电脑时代&#xff0c;英特尔&#xff08;Inter&#xff09;是无可争议的芯片巨头&#xff0c;凭借着X86架构在数据中心CPU中的压倒性地位&#xff0c;一度垄断全球90%的市场份额。然而在人工智能时代&#xff0c;以英伟达&#xff08;NVIDIA&#xff09;为首的GPU、AI芯…

大学生心里健康

开发工具(eclipse/idea/vscode等)&#xff1a; 数据库(sqlite/mysql/sqlserver等)&#xff1a; 功能模块(请用文字描述&#xff0c;至少200字)&#xff1a; 网站前台&#xff1a;关于我们、联系信息文章信息、咨间师信息、服务信息、测试信息 管理员功能&#xff1a; 1、管理关…

[激光原理与应用-60]:激光器 - 光学 - 光的四大理论框架与其层次:几何光学、波动光学、电磁光学、电子光学

目录 第1章 光的四大理论框架与层次 第2章 光的四大理论各自的特点 2.1 几何光学&#xff08;粒子性&#xff09;》光学特征 2.2 波动光学&#xff08;波动性&#xff09; 2.3 电磁光学&#xff08;电学性&#xff09; 2.4 量子光学&#xff08;能量&#xff09; 第1章 光…

【信管4.2】定义范围与WBS

定义范围与WBS上次课程已经说过&#xff0c;今天的内容是非常重要的&#xff0c;可以说是整个范围管理的核心内容。因此&#xff0c;也请各位打醒十二分精神&#xff0c;一起来学习这两个非常重要的过程吧。定义范围定义范围&#xff0c; 是指定项目和产品详细描述的过程&#…

Canvas库 KonvaJS入门 2坐标体系总结

Canvas库 KonvaJS入门 2坐标体系总结一、 准备环境二、konvasJS坐标基本使用演示1. 按坐标放置控件2. 移动group3. 父元素 scale 变化4. 子元素scale变化5. 旋转一、 准备环境 KonvaJS的几个属性值与坐标都有关系&#xff0c;有时候不容易分清坐标如何计算&#xff0c;本文作个…

前端基础_传统Web页面

传统Web页面 传统Web页面就是打开浏览器&#xff0c;整个页面都会打开的应用。例如&#xff0c;笔者的个人网站http://siwei.me就是一个典型的“传统Web应用”&#xff0c;每次单击其中任意一个链接&#xff0c;都会引起页面的整个刷新 传统的页面每次打开&#xff0c;都要把…

π120E60 双通道数字隔离器 完美代替ISO7820FDW

π120E60 双通道数字隔离器 完美代替ISO7820FDW 。具有出色的性能特征和可靠性&#xff0c;整体性能优于光耦和基于其他原理的数字隔离器产品。产品传输通道间彼此独立&#xff0c;可实现多种传输方向的配置&#xff0c;可实现5.0kV rms 隔离耐压等级和 DC 到 200Mbps信号传输。…

Seata实现分布式事务控制

目录 1. 启动Seata 1.1 下载seata 1.2 修改配置文件及初始化 2. 使用Seata实现事务控制 2.1 初始化数据表 2.2 添加配置 1. 启动Seata 1.1 下载seata 下载地址&#xff1a;https://github.com/seata/seata/releases/v1.3.0/ 1.2 修改配置文件及初始化 将下载得到的…

安全智能分析 思路方案

数据共享 定义内涵 数据共享 是指在多个用户或多个程序之间遵循一定规则共同享用数据&#xff0c;并进行各种操作、运算和分析的一种技术。数据共享包括数据发布、接口、交换等内容。 技术背景 随着数字经济成为拉动全球经济增长的新引擎&#xff0c;大数据成为经济中重要的…

[附源码]Node.js计算机毕业设计个人资金账户管理Express

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

【OpenCV-Python】教程:6-3 Epipolar Geometry 对极几何

OpenCV Python Epipolar Geometry 对极几何 【目标】 学习多视图几何学习极点、对极线、对极约束等等&#xff1b; 【理论】 当我们使用针孔相机拍摄图像时&#xff0c;我们会丢失一个重要的信息&#xff0c;即图像的深度。或者图像中的每个点距离摄像机有多远&#xff0c;…

下一个AI舞台,名叫煤矿

如果大海给贝壳下的定义是珍珠&#xff0c;那么时间给煤的定义就是钻石。2020年初&#xff0c;我们曾经探访过山西一家大型矿山。矿山中的工程师对我们说&#xff0c;现在矿上特别需要新技术&#xff0c;需要数字化、智能化。但现在年轻人&#xff0c;尤其是懂AI、懂云计算的人…

Stm32旧版库函数16——stm32 超声波测距

/******************** (C) COPYRIGHT 2012 ELC ******************** * File Name : main.c * Author : ELCWHUT * Version : V1.0 * Date : 2012-12-05 * Description : 超声波测距的STM32代码&#xff0c;采用HC-HR04…

Git全栈体系(一)

第一章 Git 概述 Git 是一个免费的、开源的分布式版本控制系统&#xff0c;可以快速高效地处理从小型到大型的各种项目。Git 易于学习&#xff0c;占地面积小&#xff0c;性能极快。 它具有廉价的本地库&#xff0c;方便的暂存区域和多个工作流分支等特性。其性能优于 Subvers…

ArcGIS创建地理处理包!让你制作的工具自由分享

喜欢就关注我们吧&#xff01; 0 前言 当用模型做好工具 分享到其他电脑 出现的模型不可用的情况 就如我们上期制作分享 的提取四至点的工具 有这个红叉的情况 因为他用到了子模型 所以发生路径不一致的情况 只要编辑配置就好了 那如何从根本上解决这个问题呢 答案是…

大数据Kudu(八):Kudu与Impala整合

文章目录 Kudu与Impala整合 一、​​​​​​​Kudu与Impala整合配置

乌班图(ubantu)部署.NET Core 6web项目(保姆教程)

1、新建文件夹&#xff0c;给读写权限 $ cd / #移动根目录&#xff08;方便好找&#xff09; 文件夹授权方式1&#xff1a;命令 $ sudo mkdir www #新建文件夹 $ cd /www $ sudo chmod 777 * -R #给读写权限 2、上传打包的项目文件&#xff0c;并解压 安装解压工具 $ sudo …