学习笔记-数据传输之零拷贝

从理论到实践:零拷贝技术的全面解读 零拷贝技术的出现和发展,是为了适应高速网络和大规模数据处理的需要,解决传统数据传输机制的效率低下问题,优化系统资源利用,提高数据传输和处理的速度与性能。随着技术的进步,零拷贝技术在现代操作系统和高性能网络编程框架中得到了广泛应用,成为提高系统效率和响应速度的关键技术之一。深入理解I/O模型-优快云博客Sentinel与Nacos强强联合,构建微服务稳定性基石的重要实践_nacos sentinel-优快云博客。 阅读详情

零拷贝的性能差异

先来有个直观的数据展示下,零拷贝相比传统的数据拷贝能有多大的差别,这一组数据,是我在我的笔记本电脑上测试后对比。

 

 

 

 

测试的源码地址:

zero测试的代码:

https://github.com/kkzfl22/demojava8/tree/master/src/main/java/com/liujun/network/zerocopy/

 

 

零拷贝数据的操作过程

通过数据与图表的观察发现,性能测试的差异有至少3倍之多,为什么零拷贝技术可以提升这么多呢?

 

 

这个问题得从数据拷贝的操作讲起:

先写两行伪代码

File.read(fileDesc, buf, len);

Socket.send(socket, buf, len);

 

这是一个读取本地文件然后发送到远程服务器的伪代码,这一过程一共发生了4次数据拷贝,那为什么是4次呢?

 

 

第一次传输,是从硬盘读取到操作系统的内核缓冲区中,这一过程由专用的DMA芯片负责搬运。

第二次传输,是从内核的缓冲区,将数据从内核的缓冲区拷贝到应用程序的内存中,这一过程由CPU负责搬运。

第三次传输,是应用程序将数据拷贝socket的缓冲区中,这一过程由CPU完成数据搬运。

第四次传输,是将socket的缓冲区中的数据写入到网卡的缓冲区,这一过程又是通过DMA芯片来完成的。

 

 

就这样完成一次数据的传输,同一份数据一共被拷贝了4次,这是导致效率低下的主要原因。

 

重点来了,零拷贝

那什么是零拷贝呢?

零拷贝就是不再需要将数据在操作系统内核与应用程序之间进行拷贝。

那不拷贝数据了,如何进行数据的传输?

 

第一次,数据从硬盘拷贝到操作系统的内核缓冲区中。由DMA芯片来完成。

第二次,根据socket描述符信息,直接将内核缓冲区中的信息,写入到网卡的缓冲区。还是由DMA芯片来完成。

 

在这个操作的过程中,没有内存层面的数据复制,所以又叫零拷贝。

 

关于零拷贝更多的内容,可以参看此文

零拷贝技术

 

DMA技术(Direct Memory Access)与DMAC(协处理器芯片)

理解了零拷贝的过程,再来认识下DMA芯片

本质上,DMA技术就是在主板上放一块独立的芯片,在进行内存与I/O设备的数据传输的时候,不再通过CPU来控制数据传输,而直接通过DMA控制器(DMA Controller简称DMAC),这块芯片就是协处理器。

DMAC最有价值的地方在于,当传输的数据量特别大时,速度特别快时,又或者数据量特别小,又特别慢时。

来举两个常用的场景吧:

  1. 如果经传输几部高清电影,这个时候数据量就会我特别的大,选择CPU来操作,CPU肯定会非常的忙,可以选择DMAC。
  2. 假如现在是需要传输的是手机聊天的消息,这数据量是非常的小,由于手机网络的原因,消息非常的慢,可以选择DMAC,当消息收到完成后再交给CPU来处理。而不用让CPU处于傻等的状态。

 

 

优劣势:

优势:零拷贝不需要内存层面的数据复制,将数据发送中的4个复制缩减到2个,在简单的数据传输通道类的应用中,发送具有非常好的性能,至少将传输的性能提供3倍以上,最典型的例子就是kafka。

劣势:同样的零拷贝由于不再需要将数据在操作系统内核与应用程序间拷贝数据,对于读取的数据修改成为问题。不过也有变通办法,那就是预先将数据处理完成,写入到文件中,运行时仅读取文件发送,但对于复杂的数据存储发送类应用,场景还是存在着问题,也需要具体问题具体分析。

 

 

总结:

零拷贝技术是一种高效的数据传输通道类技术,它比起常用的数据传输技术,提升性能有至少3倍之多,但没有完美的技术,只有适用的场景,零拷贝技术只能进行数据的传输,在传输过程中应用程序不能对数据内容有任何的修改,这也意味着,它的应用只能在传输技术中。

 

 

Netty中零拷贝的理解 首先,我想介绍一下传统上零拷贝的含义,事实上,Netty中的零拷贝又有所区别,最后再介绍Netty中零拷贝的四种实现方式。 数据传输的相关概念 计算机早期的数据传输方式: 整个流程: CPU主动启动I/O设备; CPU不断询问I/O设备是否准备好; 若I/O设备准备好了,CPU开始从I/O设备中读数据; CPU将数据传输给主存。 从整个数据传输流程可以看出:CPU是一... 阅读详情

相关推荐

面试题:什么是零拷贝技术?mmap和sendfile如何实现零拷贝,它们是否真正实现了零拷贝?

零拷贝技术并非指完全没有数据拷贝的过程,而是减少用户态和内核态的切换次数以及CPU拷贝的次数。它通常通过直接内存访问(DMA)技术和内存映射(如mmap)等机制来实现。DMA允许硬件设备(如网卡、硬盘控制器等)直接访问内存,而无需CPU的介入。在数据传输过程中,DMA控制器负责将数据从源地址传输到目标地址,从而减少了CPU的拷贝工作。内存映射技术将文件或设备的内容映射到进程的地址空间中,使得进程可以直接访问这些数据,而无需通过传统的读/写系统调用。这种方式减少了数据在用户空间和内核空间之间的拷贝次数。

m0_71836706的博客 1106

零拷贝(Zero Copy)

零拷贝技术指的是在计算机执行操作时,CPU不需要先将数据从一个内存区域复制到另一个内存区域,从而可以减少上下文以及CPU的拷贝时间。他的作用是在数据报从网络设备到用户程序空间传递的过程,减少数据拷贝的次数,减少系统调用,实现CPU的零参与,彻底消除CPU在这方面的负载,实现零拷贝的最主要的技术就是DMA数据传输技术和内存区域映射技术。零拷贝就是可以减少数据在用户缓冲区和内核缓冲区之间的反复的I/O拷贝操作。零拷贝机制可以减少用户进程地址空间和内核地址空间之间因为上下文切换带来的CPU开销。

m0_62645012的博客 8288

通过零拷贝实现有效数据传输

通过零拷贝实现有效数据传输 Linux zero copy

数据传输方式(零拷贝)

在介绍零拷贝之前我想说下在计算机系统中数据传输的方式。 早期阶段: 分散连接,串行工作,程序查询。 在这个阶段,CPU就像个保姆一样,需要手把手的把数据从I/O接口从读出然后再送给主存。 这个阶段具体流程是: CPU主动启动I/O设备 然后CPU一直问I/O设备老铁你准备好了吗,注意这里是一直询问。 如果I/O设备告诉了CPU说:我准备好了。CPU就从I/O接口中读数...

张花生的博客 8190

ST-LINK调试原理与STM32硬件连接实战指南

嵌入式调试器是连接开发环境与物理MCU的核心枢纽,其本质是基于ARM CoreSight架构的实时硬件观测与控制接口。它通过JTAG或SWD协议访问内核寄存器、内存及外设,实现断点、单步、内存监视等深度调试能力,远超简单程序烧录功能。ST-LINK作为主流ARM Cortex-M调试器,支持SWD(2线)与JTAG(多线)双模式,在电平匹配、复位控制、引脚复用规避等硬件层面临关键工程约束。掌握VREF参考电压配置、nSRST硬复位接线、调试引脚隔离策略及Keil MDK调试会话配置,是保障STM32稳定联机

weixin_42596214的博客 310

quartusII简易CPU设计

优点可以实现八种运算,数据的存取及运算都能很好的实现,上板也很成功。缺点首先由于自己知识储备的缺乏,只能实现较为简单的8种运算,也是最简单的直接寻址。其次为了方便操作,没有从外部输入数据,都是直接使用存储在存储器中的数据。后续发展后续会在此简易CPU的基础上增加一些功能对CPU进行完善,如算术运算可以考虑是补码运算,输入、输出采用存储缓冲等等,直至完整的全功能的处理器。收获通过这次实践,更熟悉Quartus软件的操作。能过更加清楚每个器件的操作,比如计数器,运算器,译码器等的实现功能。

Kong08242022的博客 3483

高频面试题:什么是零拷贝?在哪些地方使用了?

这是一道高频的面试题,而且在很多技术中都使用到了,比如javaNIO、kafka、Netty、Linux等等。作为一个非常重要的知识点,而且又是高频面试题,有必要从零开始好好地认识一下。即使你是刚入门的同行,相信也能看的懂。 OK,开始今天的文章。 一、什么是零拷贝? 1、从一个案例说起 为了解释这个概念,我们先要从一个需求说起,说某天某领导给你下发了一个任务,完成一个从文件中读取数据,并传输到网...

冯冬冬的博客 1万+

【ros2】ros2_control 全面解析与实战指南

ros2_control 是 ROS2 生态中用于机器人实时控制的核心框架,旨在统一硬件接入接口、复用控制算法,避免重复开发,实现仿真与实机硬件的无缝迁移。其核心目标是简化不同硬件(传感器、执行器、完整系统)的集成流程,让开发者专注于控制逻辑而非硬件适配。创建类型功能包,依赖rclcpp。实现on_initupdate在中声明控制器插件,编译生成动态库。在 YAML 配置文件中指定自定义控制器类型,加载测试。

EnHengNa的博客 1469

一文搞懂什么是零拷贝

其名字中的”直接”二字用于区分使用 page cache 机制的缓存 I/O,其他所有技术中,数据至少需要在内核空间存储一份,但是在 Direct I/O 技术中,数据直接存储在用户空间中,绕过了内核。sendfile() 是一种特殊的系统调用,它允许在内核空间和用户空间之间直接传输数据,避免了数据在内核和用户空间之间的额外拷贝。splice() 的主要优势在于减少了数据拷贝的次数和数据在用户空间和内核空间之间的来回传输,从而显著提高了数据传输的效率。splice() 是一种在管道传输中实现零拷贝的方式。

AmazDreamer的博客 2593

告别BAPI!深入SAP S/4HANA BP框架:cl_md_bp_maintain维护客户主数据的正确姿势与性能优化

本文深入解析SAP S/4HANA中cl_md_bp_maintain框架的高效实践与架构设计,对比传统BAPI方式,展示其在业务伙伴(BP)主数据维护中的性能优势与现代化特性。通过详细代码示例和性能测试数据,揭示如何利用该框架实现批量处理、集中校验及智能错误恢复,助力企业从ECC向S/4HANA平滑迁移。

weixin_30596735的博客 357

C# 实现鼠标轨迹录制与回放自动化功能(附源码)

通过本文的介绍,相信大家已经掌握了鼠标轨迹录制与回放功能的实现方式。该功能在自动化测试和重复性工作中具有重要应用价值。后续可以进一步优化,增加更多扩展功能,形成一个完整的自动化工具。

weixin_72139050的博客 1755

零拷贝详解

一篇文章轻松搞懂什么是零拷贝、传统IO执行流程、实现零拷贝的几种方式以及Java如何实现零拷贝。

weixin_54232666的博客 3225

2月底速申!国家超算互联网免费算力全攻略|编程小白零消耗实操首测_2026-02-26

2月底速申!国家超算互联网免费算力全攻略|编程小白零消耗实操首测作为一名编程小白,我目前正在学习编译和运行 Qt 框架,也在逐步摸索开发环境的配置方法,目标是打造一款属于自己的个人效率工具。就在这时,我挖到了一个国家级硬核福利:国家超算互联网核心节点开放免费试运行!哪怕是零基础如我,也能申领到 100 卡时异构加速卡算力,关键是——2 月底前申请更稳妥,早占位早使用。

qq_58517981的博客 2098

零拷贝原理详解

引言 传统的 Linux 操作系统的标准 I/O 接口是基于数据拷贝操作的,即 I/O 操作会导致数据在操作系统内核地址空间的缓冲区和应用程序地址空间定义的缓冲区之间进行传输。这样做最大的好处是可以减少磁盘 I/O 的操作,因为如果所请求的数据已经存放在操作系统的高速缓冲存储器中,那么就不需要再进行实际的物理磁盘 I/O 操作。但是数据传输过程中的数据拷贝操作却导致了极大的 CPU 开销,限制了操...

Tasdily的博客 6万+

多模态大模型在AI人工智能领域的创新实践探索

随着人工智能技术的飞速发展,单一模态的数据处理已经难以满足复杂现实场景的需求。多模态大模型通过融合多种模态的数据,如文本、图像、音频等,能够更全面、深入地理解和处理信息,为人工智能的发展带来了新的机遇和挑战。本文的目的在于深入探讨多模态大模型在AI人工智能领域的创新实践,包括其核心概念、算法原理、实际应用等方面,旨在为相关领域的研究人员和从业者提供全面的技术参考和实践指导。本文的范围涵盖了多模态大模型的基本原理、算法实现、数学模型、项目实战以及实际应用场景等多个方面。

大模型应用工坊 1316

[网络安全自学篇] 六.OllyDbg动态分析工具基础用法及Crakeme逆向破解

这是作者的系列网络安全自学教程,主要是关于网安工具和实践操作的在线笔记,特分享出来与博友共勉,希望您们喜欢,一起进步。上一篇文章分享了IDA Pro反汇编工具的基础用法,并简单讲解一个EXE逆向工程解密实战方法;本篇文章将讲解动态分析OllyDbg工具的基础用法,主要是结合两个Crakeme案例逆向破解。希望对初学者有帮助,大神请飘过,谢谢各位看官!

杨秀璋的专栏 1万+

零拷贝数据传输

零拷贝可以避免中间缓冲区之间的冗余数据拷贝,并减少用户空间和内核空间之间的上下文切换次数。当硬件(磁盘驱动器、网卡、图形卡、声卡)支持DMA(直接内存访问)时,理想的零拷贝(零CPU拷贝)是可能的。

vonlinee的博客 965

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

通过零拷贝实现高效的数据传输

(翻译自:https://www.ibm.com/developerworks/linux/library/j-zerocopy/)(这里的零拷贝指的是可以不需要cpu参与的拷贝)许多web应用提供大量的静态内容服务,这意味着服务器要从硬盘读取内容并将完全相同的内容写到response的socket中。此活动过程看起来只要少量的cpu活动,但它的效率非常低下:操作系统内核从硬盘读取数据,然后将这些...

SummerMangoZz的博客 2543

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

什么是零拷贝及实现方式

零拷贝(Zero-Copy)是一种高效的数据传输技术,它可以将数据从内核空间直接传输到应用程序的内存空间中。传统的数据传输过程通常需要经历多次内存拷贝。首先,从磁盘读取数据,然后将数据从内核空间拷贝到用户空间,再从用户空间拷贝到应用程序的内存中。这些额外的拷贝会消耗大量的CPU资源和内存带宽,降低数据传输的效率。零拷贝就是为了避免这些不必要的数据拷贝,能够将数据直接传输到目标内存区域,以提高数据传输的效率。

2301_76166241的博客 1633

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

零拷贝的理解

在内核空间到用户空间的零拷贝(Kernel Space to User Space Zero-Copy)场景中,数据从内核空间传递到用户空间时,采用一些技术手段来减少或避免数据的实际复制。COW的基本原理是在需要复制数据时,先共享原始数据的副本,只有在写入操作发生时,才进行实际的复制。文件描述符传递是一种在进程之间传递打开文件的文件描述符的机制,允许接收进程访问传递的文件。零拷贝技术的应用可以显著提高数据传输的效率,减少了数据在系统内存之间的冗余复制操作,特别是在高性能网络应用中,零拷贝技术被广泛采用。

Alaskan_Husky的博客 2212

零拷贝技术

在传统的内存拷贝过程中,CPU负责控制数据的传输,首先从源地址读取数据,再将数据写入目标地址。它避免了传统 I/O 操作中的多次用户态和内核态之间的上下文切换和数据拷贝,从而提高了数据传输的效率,尤其是在处理大文件时。进程通过访问这块内存,就可以访问映射文件或设备的数据,而不需要进行显式的数据拷贝。零拷贝并不是没有拷贝数据,而是减少用户态/内核态的切换次数以及CPU拷贝的次数。模式的数据,从而减少了 CPU 的参与,提高了数据传输效率。,显著提高了数据传输效率,减少了系统资源的消耗。

m0_46318653的博客 2176

Java通过零拷贝实现高效的数据传输

零拷贝,零开销 本文仅是中文版本,原文由 Sathish Palaniappan, Pramod Nagaraja 发布于 2008年09月2号。文章适合初次接触零拷贝技术并想进一步学习的读者,零拷贝本身是一种思想,不与任何编程语言绑定,不懂Java的读者可以跳过零拷贝技术在Java中实现的具体细节。 许多Web应用提供大量的静态内容,主要就是从磁盘读取数据然后将数据写回套接字,中间不涉及数据的变换。这种操作对CPU的使用相对较少,但是效率很低:首先,内核从文件读取数据,然后将数据从内核空间拷贝到用

chuixue24的博客 538

什么是零拷贝?

零拷贝(Zero Copy)技术是一种计算机执行操作时,CPU 不需要先将数据从某处内存复制到另一个特定区域的方法。换句话说,零拷贝技术可以减少数据在系统内存中的复制次数,从而减少 CPU 的负担和内存带宽的使用。

Autter_A3的博客 1394

零拷贝

用过 Kafka 的同学都知道它吞吐量很大,速度也快,但是 Kafka 是基于磁盘的,为什么还有这个可观的性能呢?本文就介绍一下其中一个技术——零拷贝。 到目前为止,几乎每个人都听过 Linux 中所谓的零拷贝功能,但是我经常遇到对它不完全理解的人。基于此,我决定写一些文章深入探讨这个有用的功能。在这篇文章中,我们将从用户的角度讨论零拷贝,因此内核层次的细节将会省略。 什么是零拷贝? 为了更好地理...

GatsbyNewton 3792
上一篇: 学习笔记——数据结构与算法.递归
下一篇: linux下安装MySQL-server-5.6.28
null_null_bug
博客等级 码龄7年 72粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值