详细讲解零拷贝机制的进化过程
一、传统拷贝方式
(一)操作系统经过4次拷贝
CPU 负责将数据从磁盘搬运到内核空间的 Page Cache 中;
CPU 负责将数据从内核空间的 Page Cache 搬运到用户空间的缓冲区;
CPU 负责将数据从用户空间的缓冲区搬运到内核空间的 Socket 缓冲区中;
CPU 负责将数据从内核空间的 Socket 缓冲区搬运到的网络中;
(二)4 次上下文切换
read 系统调用时:用户态切换到内核态;
read 系统调用完毕:内核态切换回用户态;
write 系统调用时:用户态切换到内核态;
write 系统调用完毕:内核态切换回用户态;

二、DMA参与下的数据拷贝
DMA参与后只是在”拷贝1“的位置,暂时交给DMA来控制,可以暂时释放CPU去做别的事情。

三、mmap+write方式实现的零拷贝
(一)上下文状态切换:
1.用户进程通过mmap方法,向操作系统内核发起IO调用,用户态切换内核态;
2.内核态切换回用户态,mmap方法返回;
3.用户进程通过write方法向操作系统内核发起IO调用,上下文从用户态切换为内核态;
4.数据从socket缓冲区拷贝到网卡结束后,上下文从内核态切换回用户态,write调用返回。
(二)数据拷贝
1. CPU利用DMA控制器,把数据从硬盘中拷贝到内核缓冲区;
2.CPU将内核缓冲区的数据拷贝到socket缓冲区
3.CPU利用DMA控制器,把数据从socket缓冲区拷贝到网卡
mmap+write方式的实现的零拷贝,IO发生了4次用户空间和内核空间的上下文切换,这个并没有节省,但是数据拷贝减少了一次。
其中2次DMA拷贝和1次CPU拷贝。
(mmap是将读缓冲区的地址和用户缓冲区的地址进行映射,内核缓冲区和应用缓冲区共享,所以节省了一次CPU拷贝,并且用户京城内存是虚拟的在,只是映射到内核读缓冲区,可以节省一半的内存空间。)

四、sendfile实现的零拷贝
sendfile是Linux2.1内核版本后引入的一个系统调用函数,
API如下:
ssize_t sendfile(int out_fd,int in_fd,off_t *offset,size_t count)out_fd为待写入内容的文件描述符,一个socket描述符;
in_fd为待读出内容的文件描述符,必须是真实的文件,不能是socket和管道;
offset:制定从读入文件的哪个位置开始读,如果为NULL,表示文件的默认起始位置;
count 制定在fdout 和 fdin之间传输的字节数。
sendfile表示两个文件描述符之间传输数据,它是在操作系统内核中操作的,避免了数据从内核缓冲区和用户缓冲区之间的拷贝操作,因此可使用他来实现零拷贝。
(一)上下文状态切换+数据拷贝
1.用户进程发起sendfile系统调用,上下文从用户态转向内核态
2.DMA控制器,把数据从硬盘中拷贝到内核缓冲区;
3.CPU将读缓冲区中的数据拷贝到socket缓冲区;
4.DMA控制器,异步将数据从socket缓冲区拷贝到网卡;
5.上下文从内核态切换回用户态,sendfile返回。
sendfile实现的零拷贝,IO发生了两次用户空间与内核空间的上下文切换,以及3次数据拷贝,其中3次数据拷贝中,包括了2次DMA拷贝和1次CPU拷贝。那能不能把CPU的拷贝次数减少到0次呢?有的,即带有DMA手机拷贝功能的sendfile

五、sendfile+DMA scatter/gather实现的零拷贝
Linux2.4之后,对sendfile做了优化升级,引入SG-DMA技术,其实就是对DMA拷贝加入了scatter/gather操作,它可以直接从内核空间缓冲区中将数据读取到网卡。使用这个特点做零拷贝,还可以少一次CPU拷贝。
(一)上下文状态切换+数据拷贝
1.用户进程发起sendfile系统调用,上下文从用户态切换为内核态;
2.DMA控制器,把数据从硬盘中拷贝到内核缓冲区;
3.CPU把内核换乘功能区重点 文件描述信息(内核缓冲区的内存地址和偏移量)发送到socket缓冲区
4.DMA控制器根据文件描述信息,直接把数据从内核缓冲区拷贝到网卡
5.上下文从内核态奇幻回用户态,sendfile调用返回。

可以发现,sendfile+DMA scatter/gather实现的零拷贝,IO发生了2次用户空间与内核空间的上下文切换,以及2次数据拷贝。其中2次数据拷贝都是DMA拷贝,这就是真正的零拷贝技术,全程都没有通过CPU来搬运数据,所有的数据都是通过DMA来传输的。
参考:https://heapdump.cn/article/3290793
相关文章:
详细讲解零拷贝机制的进化过程
一、传统拷贝方式(一)操作系统经过4次拷贝CPU 负责将数据从磁盘搬运到内核空间的 Page Cache 中;CPU 负责将数据从内核空间的 Page Cache 搬运到用户空间的缓冲区;CPU 负责将数据从用户空间的缓冲区搬运到内核空间的 Socket 缓冲区…...
2023年场外个股期权研究报告
第一章 概况 场外个股期权(Over-the-Counter Equity Option),是指由交易双方根据自己的需求和意愿,通过协商确定行权价格、行权日期等条款的股票期权。与交易所交易的标准化期权不同,场外个股期权的合同内容可以根据交…...
k8s pod,ns,pvc 强制删除
一、强制删除pod$ kubectl delete pod <your-pod-name> -n <name-space> --force --grace-period0解决方法:加参数 --force --grace-period0,grace-period表示过渡存活期,默认30s,在删除POD之前允许POD慢慢终止其上的…...
力扣第99场双周赛题目记录(复盘)
第一题 2578.最小和分割 给你一个正整数 num ,请你将它分割成两个非负整数 num1 和 num2 ,满足: num1 和 num2 直接连起来,得到 num 各数位的一个排列。 换句话说,num1 和 num2 中所有数字出现的次数之和等于 num 中所…...
spring事务失效原因
一.抛出事务不支持的异常 原理: Spring事务默认支持RuntimeException异常,抛出的异常为RuntimeException异常及其子类异常事务均可生效,而我们日常常见的异常基本都继承自RuntimeException,所以无需指定异常类型事务也能生效。 但…...
pikachu靶场CSRF之TOKEN绕过
简介 Pikachu靶场中的CSRF漏洞环节里面有一关CSRF TOKEN,这个关卡和其余关卡稍微有点不一样,因为表单里面存在一个刷新就会变化的token,那么这个token是否能绕过呢?接下来我们来仔细分析分析 实战过程 简单尝试 先利用任意一个…...
Windows中配置docker没有hyper-v功能解决方案
👨 作者简介:大家好,我是Taro,前端领域创作者 ✒️ 个人主页:唐璜Taro 🚀 支持我:点赞👍📝 评论 ⭐️收藏 文章目录前言解决步骤:1.新建文档2. 另存为3. 功能…...
电子台账:模板制作之五——二级过滤与多条件组合
1 前言工作中,经常会遇到很复杂的数据,比如内销产品和出口产品、正常产品和报废产品都混在一块儿。电子台账中,需要把这些数据都区分开,分别汇总。这种情况,可以用台账软件的二级过滤功能来处理,实际上就是…...
Kaldi Data preparation
链接:GitHub - nessessence/Kaldi_ASR_Tutorial: speech recognition using Kaldi framework Lets start with formatting data. We will randomly split wave files into test and train dataset(set the ratio as you want). Create a directory data and,then t…...
libevent 学习笔记
一、参考 libevent Libevent深入浅出 - 《Libevent 深入浅出》 - 书栈网 BookStack libevent 之 event config的相关函数介绍_event_config_new_yldfree的博客-CSDN博客 Libevent之evbuffer详解_有时需要偏执狂的博客-CSDN博客 二、libevent概述 libevent 就是将网络、I…...
jupyter的使用
1.安装 安装过程看这篇记录。 安装 2.如何启动 环境搭建好后,本机输⼊jupyter notebook命令,会⾃动弹出浏览器窗⼝打开 Jupyter Notebook # 进⼊虚拟环境 workon ai(这个是虚拟环境的名称) # 输⼊命令 jupyter notebook本地notebook的默认URL为&…...
中级数据开发工程师养成计
目标 工作之后就很少时间用来沉淀知识了,难得用空闲时间沉淀一下自己。 成为一名中级数据开发工程师。偏向于数据仓库,数据治理方向。 整体排期 1 hive 2 hadoop 3 flink 4 spark 5 闲杂工具 kafka maxwell cancal 6 数据建模(偏向于kimbo…...
fastjson 返回 $ref 数据
文章目录问题描述:1、重复引用:2、循环引用:原因分析:1、重复引用:2、循环引用:反序列化:1、开启引用检测:2、关闭引用检测:小结:问题描述: 问题…...
Zookeeper特性和节点数据类型详解
什么是ZK? zk,分布式应用协调框架,Apache Hadoop的一个子项目,解决分布式应用中遇到的数据管理问题。 可以理解为存储少量数据基于内存的数据库。两大核心:文件系统存储结构 和 监听通知机制。 文件系统存储结构 文件目录以 / …...
Java代码是如何被CPU狂飙起来的?
无论是刚刚入门Java的新手还是已经工作了的老司机,恐怕都不容易把Java代码如何一步步被CPU执行起来这个问题完全讲清楚。但是对于一个Java程序员来说写了那么久的代码,我们总要搞清楚自己写的Java代码到底是怎么运行起来的。另外在求职面试的时候这个问题…...
Dynamics365安装失败解决及注册编写
一、修改错误昨天登录报错今天开始返回我之前设置的断点开始重新配置,Reporing Services配置完成后发现dynamics365还是下载失败之后下载了一上午dynamics365就一直卡在最后的界面进度条不动索性我直接把所有环境都卸载了 连同虚拟机卸载重装终于在下午的时候dynami…...
Kafka 集群参数
Kafka 集群参数Broker 端参数存储配置ZooKeeper 配置Broker 连接配置Topic 管理配置数据留存配置Topic 级别参数JVM 参数操作系统参数重要的配置 : Broker 端参数,主题级别的参数、JVM 端参数、操作系统级别的参数 Broker 端参数 存储配置 log.dirs:指…...
等保2.0与1.0 测评要求的变化
No.1标准内容增加了 标准内容上最大的变化就是将安全要求分为了安全通用要求和扩展要求。首先,安全通用要求部分已对1.0标准的内容进行了优化,删除或修订了过时的要求项,新增了对新型网络攻击行为防护和个人信息保护等方面的新要求。其次&am…...
nodejs学习巩固笔记-nodejs基础,Node.js 高级编程(核心模块、模块加载机制)
目录Nodejs 基础大前端开发过程中的必备技能nodejs 的架构为什么是 NodejsNodejs 异步 IONodejs 事件驱动架构全局对象全局变量之 process核心模块核心模块 - path全局变量之 Buffer创建 bufferBuffer 实例方法Buffer 静态方法Buffer-split 实现核心模块之FS模块文件操作 APImd…...
2023年春【移动计算技术】文献精读(二)-3 || 附:创新点、创新思想和技术路线总结
榜样的力量是无穷的! 🎯作者主页:追光者♂ 🌸个人简介:2022年CSDN博客之星人工智能领域TOP4🌟、阿里云社区专家博主🏅 CSDN-人工智能领域新星创作者🏆 【无限进步,一起追光!】 🍎欢迎点赞👍 收藏⭐ 留言📝 🌿本篇,仅接着上两篇,为【移动计算技术】…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...
零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...
MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...
NPOI操作EXCEL文件 ——CAD C# 二次开发
缺点:dll.版本容易加载错误。CAD加载插件时,没有加载所有类库。插件运行过程中用到某个类库,会从CAD的安装目录找,找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库,就用插件程序加载进…...
MySQL 主从同步异常处理
阅读原文:https://www.xiaozaoshu.top/articles/mysql-m-s-update-pk MySQL 做双主,遇到的这个错误: Could not execute Update_rows event on table ... Error_code: 1032是 MySQL 主从复制时的经典错误之一,通常表示ÿ…...
【堆垛策略】设计方法
堆垛策略的设计是积木堆叠系统的核心,直接影响堆叠的稳定性、效率和容错能力。以下是分层次的堆垛策略设计方法,涵盖基础规则、优化算法和容错机制: 1. 基础堆垛规则 (1) 物理稳定性优先 重心原则: 大尺寸/重量积木在下…...
comfyui 工作流中 图生视频 如何增加视频的长度到5秒
comfyUI 工作流怎么可以生成更长的视频。除了硬件显存要求之外还有别的方法吗? 在ComfyUI中实现图生视频并延长到5秒,需要结合多个扩展和技巧。以下是完整解决方案: 核心工作流配置(24fps下5秒120帧) #mermaid-svg-yP…...
ui框架-文件列表展示
ui框架-文件列表展示 介绍 UI框架的文件列表展示组件,可以展示文件夹,支持列表展示和图标展示模式。组件提供了丰富的功能和可配置选项,适用于文件管理、文件上传等场景。 功能特性 支持列表模式和网格模式的切换展示支持文件和文件夹的层…...
