零拷贝(Zero-Copy)

news2025/2/27 2:37:58

一,数据的四次拷贝与四次上下文切换

很多应用程序在面临客户端请求时,可以等价为进行如下的系统调用:

  • File.read(file, buf, len);
  • Socket.send(socket, buf, len);

例如消息中间件 Kafka 就是这个应用场景,从磁盘中读取一批消息后原封不动地写入网卡(NIC,Network interface controller)进行发送。在没有任何优化技术使用的背景下,操作系统为此会进行 4 次数据拷贝,以及 4 次上下文切换,如下图所示:

如果没有优化,读取磁盘数据,再通过网卡传输的场景性能比较差:

4次copy

  • CPU 负责将数据从磁盘搬运到内核空间的 Page Cache 中
  • CPU 负责将数据从内核空间的 Page Cache 搬运到用户空间的缓冲区
  • CPU 负责将数据从用户空间的缓冲区搬运到内核空间的 Socket 缓冲区中
  • CPU 负责将数据从内核空间的 Socket 缓冲区搬运到的网络中

4次上下文切换

  • read 系统调用时:用户态切换到内核态
  • read 系统调用完毕:内核态切换回用户态
  • write 系统调用时:用户态切换到内核态
  • write 系统调用完毕:内核态切换回用户态

问题分析

  • CPU 全程负责内存内的数据拷贝还可以接受,因为效率还算可以接受,但是如果要全程负责内存与磁盘、网络的数据拷贝,这将难以接受,因为磁盘、网卡的速度远小于内存,内存又远远小于 CPU
  • 4 次 copy 太多了,4 次上下文切换也太频繁了

二,DMA技术

DMA,英文全称是Direct Memory Access,即直接内存访问。DMA本质上是一块主板上独立的芯片,允许外设设备和内存存储器之间直接进行IO数据传输,其过程不需要CPU的参与。我们一起来看下IO流程,DMA等忙做了什么事情。

1,用户应用进程调用read函数,向操作系统发起IO调用,进入阻塞状态,等待数据返回.
2,CPU收到指令后、对DMA控制器发起指令调度。
3,DMA收到IO请求后,将请求发送给磁盘:
做盘将数圳放入做盘控制缓冲区,并通知DMA
4,DMA将数据从微盘控制器缓冲区揭贝到内核缓冲区。
5,DMA向CPU发山数据读完的信号,把工作交换给CPU,由CPU负责将数据从内核缓冲区拷贝到用户缪冲区。
6,用户应用进程山内核态切换回用户态,解除阻寒状态

可以发现,DMA做的事情很清晰哦,它主要就是帮TCPU转发一下IO请求,以及将贝数据。

为什么需要它的?

主要就是效率,它帮助CPU做事情,这时候,CPU就可以闲下来大做别的事情,提高了CPU的利用效率。大白话解释就是,CPU老哥太忙太器啦,所以他找了个小弟《名叫DMA) ,替他完成一部分的拷贝工作,这样CPU老哥就能着手于做其他事情。

三,零拷贝技术

零拷贝技术是一个思想,指的是指计算机执行操作时,CPU 不需要先将数据从某处内存复制到另一个特定区域。

可见,零拷贝的特点是 CPU 不全程负责内存中的数据写入其他组件,CPU 仅仅起到管理的作用。但注意,零拷贝不是不进行拷贝,而是 CPU 不再全程负责数据拷贝时的搬运工作。如果数据本身不在内存中,那么必须先通过某种方式拷贝到内存中(这个过程 CPU 可以不参与),因为数据只有在内存中,才能被转移,才能被 CPU 直接读取计算。

零拷贝技术的具体实现方式有很多,例如:

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

不同的零拷贝技术适用于不同的应用场景,下面依次进行分析。

1,mmap

mmap 的函数原型如下:

addr: 指定映射的虚拟内存地址
length:映射的长度
prot:映射内存的保护模式
fags: 指定映射的类型
fa:进行映射的文件句柄
offset:文件偏移量

前面一小节,零找贝相关的知识点回顾,我们介绍了虚拟内存,可以把内核空间和用户空间的虚拟地址映射到同一个物理地址,从而减少数据拷贝次数! mmap就是用了虚拟内存这个特点,它将内核中的读级冲区与用户空间的缓冲区进行映射,所有的IO都在内核中完成。

1,用户进程通过 mmap方法向操作系统内核发起IO调用,上下文从用户态切换为内核态。

2,CPU利用DMA控制器,把数据认硬盘小拷贝到内核缓冲区。

3,上下文从内核态切换回用户态,mmap方法返回。

4,用户进程通过 write 方法向操作系统内核发起IO调用,上下文从用户态切换为内核态。

5,CPU将内核缓冲区的数据拷贝到的socket缓冲区。

6,CPU利用DMA控制器,把数据从socket缓冲区拷贝到网卡,上下文从内核态切换回用户态,write调用返回。

可以发现, mmap+write 实现的零拷贝,I/0发生了4次用户空间与内核空间的上下文切换,以及3次数据拷贝。其中3次数据拷贝中,包括了2次DMA拷贝和1次CPU拷贝。
mmap 是将读缓冲区的地址和用户缓冲区的地址进行映射,内核缓冲区和应用缓冲区共享,所以节省了一次CPU拷贝并且用户进程内存是虚拟的,只是映射到内核的读缓冲区,可以节省一半的内存空间。

2,sendfile

sendfile 是Linux2.1内核版本后引入的一个系统调用函数,API如下:

out_fd:为待写入内容的文件描述符,一个socket描述符。

in_fd:为待读出内容的文件描述符,必须是真实的文件,不能是socket和管道。

offset: 指定从读入文件的哪个位置开始读,如果为NULL,表示文件的默认起始位置

count:指定在fdout和fdin之间传输的字节数。

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

1,用户进程发起sendfile系统调用,上下文(切换1)从用户态转向内核态

2,DMA控制器,把数据从硬盘中拷贝到内核缓冲区。

3,CPU将读缓冲区中数据拷贝到socket缓冲区

4,DMA控制器,异步把数据从socket缓冲区拷贝到网卡,

5,上下文(切换2)从内核态切换回用户态,sendfile调用返回。

可以发现, sendfile 实现的零拷贝,I/O发生了2次用户空间与内核空间的上下文切换,以及3次数据拷贝。其中3次数据拷贝中,包括了2次DMA拷贝和1次CPU拷贝。那能不能把CPU拷贝的次数减少到0次呢? 有的,即带有DMA收集拷贝功能的sendfile !

3,带有DMA收集拷贝功能的sendfile

linux2.4版本之后,对 sendfile 做了优化升级,引入SG-DMA技术,其实就是对DMA拷贝加入了 scatter/gather 操作,它可以直接从内核空间缓冲区小将数据读收到网卡。使用这个特点搞零拷贝,即还可以多省去一次CPU拷贝。

1,用户进程发起sendfile系统调用,上下文(切换1)从用户态转向内核态

2,DMA控制器,把数据从硬盘中拷贝到内核缓冲区。

3,CPU把内核缓冲区中的文件描述符信息(包括内核缓冲区的内存地址和偏移量)发送到socket缓冲区

4,DMA控制器根据文件描述符信息,直接把数据从内核缓冲区拷贝到网卡

5,上下文(切换2)从内核态切换回用户态,sendfile调用返回。

可以发现, sendfile+DMA scatter/gather 实现的零拷贝,I/0发生了2次用户空间与内核空间的上下文切换,以及2次数据拷贝。其中2次数据拷贝都是包DMA拷贝。这就是真正的零拷贝(Zero-copy)技术,全程都没有通过CPU来搬运数据,所有的数据都是通过DMA来进行传输的。

三,java实现的零拷贝

Java Nio mmap的文持

javaNIO有一个 MappedByteBuffer 的类,可以用米实现内存映射。它的底层是调用了Linux内
核的mmap的API.

Java NIO对sendfile的支持

FileChannel的 transferTo()/transferFrom() ,底层就是sendfile 系统调用函数。Kafka这个开源项目就用到它。

 

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

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

相关文章

kafka介绍

1.kafka是什么 Kafka是一种高性能、可扩展、容错的分布式流处理平台,广泛应用于日志收集、实时数据处理、消息传递等场景所开发的一个消息队列中间件 2.kafka的优势 Kafka的优势在于其高吞吐量、可扩展性、容错性以及灵活的数据保留策略。它的高吞吐量是因为Kafk…

十一、Node.js

一、Node.js是什么? 在了解Node.js之前,我们先去了解一下什么叫v8引擎。这里参考一下其他博主的资料。 聊聊V8引擎_努力学习前端的77的博客-CSDN博客 这个时候我们再去看下Node.js的定义。 官方对Node.js的定义: Node.js是一个基于V8 Ja…

mysql优化-减少查询回表次数和回表数据量

减少数据回表常见的三种方式分别是1)查询条件使用聚集索引;2)使用索引下推;3)使用索引覆盖。 1 查询条件使用聚集索引-避免回表查询 按照索引使用数据结构B树叶子结点是否包含表中全部字段,mysql 索引可以…

“数字中国·福启海丝”多屏互动光影艺术秀27日在福州举办

作为深化“数字海丝”的核心区、海上丝绸之路的枢纽城市,为喜迎第六届数字中国建设峰会盛大召开之际,福州市人民政府特此举办“数字中国福启海丝”多屏互动光影秀活动。本次光影秀活动是由福建省文化和旅游厅指导,福州市人民政府主办&#xf…

USB转串口芯片CH9101U

CH9101是一个USB总线的转接芯片,实现USB转异步串口。提供了常用的MODEM联络信号,用于为计算机扩展异步串口,或者将普通的串口设备或者MCU直接升级到USB总线。 特点 全速USB设备接口,兼容USB V2.0。内置固件,仿真标准串…

CH9121网络串口透传应用

概述 随着物联网技术的普及,越来越多的传统设备出现联网功能需求。串口作为使用较为广泛的一种通信接口,串口转以太网,进行远程数据传输需求逐渐显现出来。CH9121内部集成TCP/IP协议栈,无需编程,即可轻松实现网络数据…

撰写项目文档: 节省时间的技巧和模板

高质量的项目文档具有长期价值。它不仅有助于确保项目的成功,而且还可以作为未来项目和计划的参考! 项目文档是任何项目的脉搏,它连接了成功运行项目所需的一切。 文档必须足够宽泛,以便开发能够取得进展。但要足够灵活&#xf…

DAB-Deformable-DETR源码学习记录之模型构建(二)

书接上回,上篇博客中我们学习到了Encoder模块,接下来我们来学习Decoder模块其代码是如何实现的。 其实Deformable-DETR最大的创新在于其提出了可变形注意力模型以及多尺度融合模块: 其主要表现在Backbone模块以及self-attention核cross-atten…

平台+AI:全面拥抱大模型的商业创新,打造企业数字化「柔性供应链」 | D3演讲实录

马斯克曾说:“高生产率解决诸多问题。” 在社会化内卷的大环境下,借助数智化“降本增效”已是不争事实。AI技术日新月异、大量信息繁杂涌现,无数原来烟囱式的模式亟需变革,平台与AI之间怎样融合,才能发挥更大的功效&a…

深度学习量化总结(PTQ、QAT)

背景 目前神经网络在许多前沿领域的应用取得了较大进展,但经常会带来很高的计算成本,对内存带宽和算力要求高。另外降低神经网络的功率和时延在现代网络集成到边缘设备时也极其关键,在这些场景中模型推理具有严格的功率和计算要求。神经网络…

如何减少项目在Corona和V-Ray中的3ds Max渲染时间?

相信在大多 3D 项目里,渲染是最耗费时间的部分,它不仅是建模和纹理化 3D 场景的过程,而是需要利用硬件来完成任务。我们在配备独立GPU和带有2到4个强大内核的CPU的中档计算机上,可以将3ds Max中创建和处理的项目轻松渲染完成&…

MATLAB实现车牌识别

车牌识别主要包括三个主要步骤:车牌区域定位、车牌字符分割、车牌字符识别。 本项目通过对拍摄的车牌图像进行灰度变换、边缘检测、腐蚀及平滑等过程来进行车牌图像预处理,并由此得到一种基于车牌颜色纹理特征的车牌定位方法,最终实现了车牌…

在Docker上部署SpringBoot项目

在Docker上部署SpringBoot项目 在学习中发现了部署的时候总是有各种问题,此文章只有操作步骤没有原理解释,只是用来提醒自己部署步骤 第一步:将SpringBoot项目打包成jar包 使用idea打包,点一下就行 第二部:编写Dockerfile文件 新建一个名为Dockerfile的文件,注意没有后缀…

improper Integral反常积分

笔记 笔记二 例题 hyperlink

安陆EGS20 SDRAM仿真

目录 一. 搭建仿真平台 二. 实现SDRAM连续写入1024个数据,然后再连续读出,并比较 1. 调试过程中问题: 2. 顶层代码 3. 功能代码 三. SDRAMFIFO实现上述功能调试 1. 代码设计要点 2. 仿真过程问题 3. 上板运行调试 安陆反馈&#xf…

80%的人都关注的电子合同签署疑问,君子签官方解答来了!

电子合同签错了在平台可以撤回吗?如果合同上名字签错了,有法律效力吗?签的电子合同,内容会不会被别人看见?… 最近,小编将80%的人都关注的电子合同签署问题进行了整理,官方专业解答帮助大家更好…

mac真机调试h5攻略

原因: h5项目想在mac本通过chrome://inspect/#devices调试 (win上调试h5很简单,请参考:chrome真机调试Android_chrome 调试安卓_芒果终结者的博客-CSDN博客) 调试步骤: 1. 需要下载安装安卓开发工具and…

信息化发展

信息系统是:管理模型、信息处理模型和系统实现条件结合的 信息系统生命周期: 可行性分析与项目开发计划 需求分析 概要设计 详细设计 编码 测试 可以简化为: 系统规划:现行情况的分析,可行性研究报告 -> 设计任务…

Java笔记_13(集合进阶2)

Java笔记_13 一、双列集合1.1、Map的常见API1.2、Map遍历方式一(键找值)1.3、Map集合遍历方法二(键值对)1.4、Map集合遍历方法三(lambda表达式)1.5、HashMap1.6、HashMap练习1.7、HashMap底层源码解析1.7、…

12秒内AI在手机上完成作画!谷歌提出扩散模型推理加速新方法

本文源自:量子位 只需12秒,只凭手机自己的算力,就能拿Stable Diffusion生成一张图像。 而且是完成了20次迭代的那种。 要知道,现在的扩散模型基本都超过了10亿参数,想要快速生成一张图片,要么基于云计算&…