当前位置: 首页 > news >正文

零拷贝技术

文章目录一、用户态与内核态二、传统模式下的文件传输流程三、零拷贝技术下的解决方案1.传统 sendfile2.sendfile SG-DMA四、零拷贝技术的实际应用一、用户态与内核态在现代操作系统中为了保障系统的安全与稳定CPU 通常支持两种运行模式用户态 和 内核态。用户态用户程序运行的状态权限较低不能直接访问硬件或内核内存空间。当进程执行用户自己的代码时就处于用户态。内核态操作系统内核运行的状态拥有最高权限可以直接访问所有硬件资源如磁盘、网卡、内存等和内核空间的数据。当进程通过系统调用进入内核代码时就切换到内核态。区分用户态和内核态的主要目的是隔离保护防止用户程序的错误或恶意行为破坏系统核心。应用程序需要操作硬件或执行敏感操作时必须通过系统调用System Call请求内核代为完成。二、传统模式下的文件传输流程传统 I/O 方式中将一个文件从磁盘发送到网络例如 Web 服务器返回一个静态文件通常使用 read() write() 两个系统调用。整个过程涉及4 次上下文切换 和 4 次数据拷贝包括 2 次 CPU 拷贝和 2 次 DMA 拷贝。具体的步骤如下进程调用 read()从用户态切换到内核态第 1 次切换。内核通过 DMADirect Memory Access直接内存访问控制器将文件数据从磁盘拷贝到内核缓冲区第 1 次拷贝DMA 拷贝。CPU 将数据从内核缓冲区拷贝到用户缓冲区第 2 次拷贝CPU 拷贝。read() 返回从内核态切换回用户态第 2 次切换。进程调用 write()再次从用户态切换到内核态第 3 次切换。CPU 将数据从用户缓冲区拷贝到Socket 缓冲区第 3 次拷贝CPU 拷贝。DMA 将数据从 Socket 缓冲区拷贝到网卡进行网络传输第 4 次拷贝DMA 拷贝。write() 返回从内核态切换回用户态第 4 次切换。三、零拷贝技术下的解决方案零拷贝Zero-Copy 技术通过消除或减少 CPU 参与的数据拷贝次数大幅提升 I/O 吞吐量、降低延迟。其核心思想是让数据尽量在内核态内部直接流转避免在用户态和内核态之间来回复制。现代操作系统提供多种零拷贝机制其中最经典且效果显著的是 sendfile() 系统调用。它允许在两个文件描述符之间直接传输数据完全在内核态完成无需将数据拷贝到用户空间。1.传统 sendfile传统的 sendfile() 实现未支持 SG-DMA 或 DMA Gather Copy 的老式网卡/驱动虽然减少了上下文切换次数但仍然需要一次 CPU 拷贝结果共2 次上下文切换3 次数据拷贝其中 1 次为 CPU 拷贝。相比传统 readwrite4 次切换4 次拷贝已有明显提升但 CPU 仍需参与一次数据搬运。。其流程如下进程调用 sendfile()从用户态切换到内核态第 1 次切换。DMA 将文件数据从磁盘拷贝到内核缓冲区第 1 次拷贝DMA 拷贝。CPU 将数据从内核缓冲区拷贝到 Socket 缓冲区第 2 次拷贝CPU 拷贝。DMA 将数据从 Socket 缓冲区拷贝到网卡第 3 次拷贝DMA 拷贝。sendfile() 返回从内核态切换回用户态第 2 次切换。2.sendfile SG-DMA借助支持 DMA Gather Copy 或 SG-DMA 的网卡sendfile() 可以实现仅 2 次上下文切换 和 2 次 DMA 拷贝完全消除 CPU 拷贝进程调用 sendfile()从用户态切换到内核态第 1 次切换。DMA 将文件数据从磁盘拷贝到内核缓冲区第 1 次 DMA 拷贝。内核仅将数据的位置和长度信息文件描述符、偏移量等传递给网卡网卡通过 DMA Gather 直接从内核缓冲区读取数据并发送无需 CPU 拷贝。sendfile() 返回从内核态切换回用户态第 2 次切换。四、零拷贝技术的实际应用应用/框架使用的零拷贝技术说明Kafkasendfile / transferTo消息日志文件从磁盘发送到网络时利用零拷贝大幅提高吞吐量Kafka 官方宣传零拷贝是其高性能关键之一。RocketMQmmap write / sendfile在消息存储和同步刷盘时结合零拷贝优化文件读写性能。NettyFileRegion (基于 sendfile 或 transferTo)用于高效传输文件内容常用于 HTTP 静态文件服务、代理等。Nginxsendfile 指令开启 sendfile on; 后Nginx 在处理静态文件请求时自动使用零拷贝极大降低 CPU 占用。Apache Tomcatsendfile通过 Sendfile 端点处理大型静态资源时启用零拷贝加速。Rediswritev分散-聚集写与零拷贝思路结合在输出缓冲区处理时减少数据复制。数据库系统如 Cassandra、RocksDBsendfile, splice用于快速备份、数据迁移、日志传输。
http://www.rkmt.cn/news/1397992.html

相关文章:

  • 数学建模小白必看:用‘模糊综合评价’选课、选导师、甚至选外卖!
  • Python列表、字典、集合高阶操作精讲:从基础到工程实战
  • 从‘人脑排班’到‘AI调度’:我用一个Excel表格和Python,带你模拟APS的四种核心排程算法(附代码)
  • buildroot的overlay文件拷贝机制BR2_ROOTFS_OVERLAY
  • Python内置函数从入门到实战:list、open等核心用法全解析
  • 知识图谱与BERT融合:基于深度Inception网络的网页分类实践
  • 避坑指南:Win10/Win11系统下Origin2018安装失败与闪退问题全解决
  • 斯坦福CS224W图机器学习笔记:我用Python+PyG复现了课程里的Node Embeddings实验
  • 告别WebGL!用Unity Embedded Browser插件在PC游戏里无缝嵌入你的数据可视化大屏(ECharts实战)
  • 保姆级教程:用PySwarms的GlobalBestPSO搞定机器人逆运动学优化(附完整代码)
  • 别再瞎调超参数了!用Python手把手教你实现Batch Norm,让模型训练快10倍
  • 基于CLIP与DINOv2的语义驱动多模态图像融合方法GFFusion解析
  • 智能驾驶多传感器融合:从原理到产业,一篇讲透
  • 5分钟上手H5P交互式视频:让普通视频变身互动学习平台的完整指南
  • 推荐题目:洛谷 P1003 [NOIP 2011 提高组] 铺地毯
  • 基于c-TF-IDF的课程学习策略:提升人格检测模型性能
  • Ubuntu 20.04.2 离线环境求生指南:手把手搞定GCC、OpenMPI等开发套件(附全套deb包)
  • 告别卡顿!从X11到Wayland:一次桌面显示协议的“现代化”升级实战(附Weston配置避坑)
  • 基于RNN的中文微博情感分析:从词向量到序列建模的实践
  • 2026年5款文生视频横评:提示词写不好怎么快速试错
  • C语言goto语句的正确使用与替代方案
  • 量子点光子量子计算:原理、误差与优化策略
  • 基于轮速信号谱分析的路面粗糙度智能感知方法
  • Ubuntu 20.04 装 ROS Noetic 卡在密钥错误?手把手教你两种修复方法(附清华源配置)
  • 告别输入法折腾:Arch Linux + Xfce 环境下 Fcitx5 的“一次配置,处处可用”指南
  • 规范驱动开发:从OpenAPI到契约测试的API设计实战
  • 为什么92%的翻译平台在V3迭代时崩溃?Lovable平台稳定性架构设计,48小时上线零回滚
  • 2026年资质代理代办流程评测:代理记账报税、代理记账收费标准、建筑资质代理代办、成都代理记账、成都公司注册、成都资质代理代办选择指南 - 优质品牌商家
  • 最简单的汇编语言 grep - x86_64 Linux
  • 神经形态计算:生物启发的下一代AI硬件架构