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

扩展------零拷贝技术(Mmap,SendFile)

什么是零拷贝

零拷贝(Zero-Copy)是一种计算机操作技术,旨在减少数据在内存之间的拷贝次数,以提高数据传输的效率和性能。

传统的IO模式:

模拟网络传输数据运行过程:

  • 用户态read()发起系统调用,进入内核态等待从硬件上读取到数据拷贝(第一次)到内核缓冲区中,再将缓冲区中的数据拷贝(第二次)到用户态。
  • 用户态拿到数据后调用write()发起系统调用,将数据拷贝(第三次)到socket缓冲区中,再将缓冲区的数据拷贝(第四次)到网卡把数据发送出去。
  • 传统模式下涉及到了四次用户态和内核态的切换和四次数据拷贝

在传统的数据传输过程中,数据可能需要在不同的缓冲区之间多次复制,这会消耗大量的 CPU 时间和系统资源。而零拷贝技术通过避免或减少这些不必要的数据拷贝操作,直接将数据从数据源传输到目标位置,例如从磁盘直接传输到网络,而无需经过应用程序的缓冲区。

Mmap技术

 Mmap模式下模拟网络传输数据运行过程:

  • 用户态mmap()发起系统调用,进入内核态等待从硬件上读取到数据拷贝(第一次)到内核缓冲区中,此时切换回用户态,数据只是被映射到用户空间,没有进行拷贝。
  • 用户态调用write()发起系统调用进入内核态,此时只需要将内核缓冲区的数据拷贝(第二次)到socket缓冲区中,再将缓冲区的数据拷贝(第三次)到网卡把数据发送出去。
  • Mmap模式下只涉及到了四次用户态和内核态的切换和三次数据拷贝

Mmap技术与传统IO模式相比虽然说只省下了一次数据拷贝次数,但是用户态和内核态之间是没有发生数据拷贝的。那有没有更高效的方式呢?有就是SendFile

SendFile技术

 SendFile模式下模拟网络传输数据运行过程:

  • 用户态SendFile()发起系统调用,进入内核态等待从硬件上读取到数据拷贝(第一次)到内核缓冲区中,此时不切换到用户态。
  • 只需要将内核缓冲区的数据拷贝(第二次)到socket缓冲区中,再将缓冲区的数据拷贝(第三次)到网卡把数据发送出去即可。
  • SendFile模式下只涉及到了两次用户态和内核态的切换和三次数据拷贝

SendFile技术与Mmap技术相比又少了两次上下文切换的过程。

应用场景 

所以Kafka的性能比RocketMQ要高! 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 统计语言模型——Ngram
  • SpringMVC 工作流程简述
  • 2024年华数杯数学建模竞赛——赛题浅析
  • FFmpeg实现文件夹多视频合并
  • 使用Python创建多功能文件管理器
  • AcWing食物链
  • Lua 脚本编程基础
  • 搭建nexus上传jar包,并结合jenkins运行项目
  • OpenCV||超细节的基本操作
  • Redis学习笔记——第19章 事务
  • 【算法】递归实现二分查找(优化)以及非递归实现二分查找
  • RMAN-06618不同版本之间RMAN无法连接
  • 『C++实战项目 负载均衡式在线OJ』二、编译模块编写(持续更新)
  • 【前端 22】使用Nginx部署前端项目
  • 手持式气象站:科技赋能精准气象观测
  • 实现windows 窗体的自己画,网上摘抄的,学习了
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • 《Javascript数据结构和算法》笔记-「字典和散列表」
  • Cumulo 的 ClojureScript 模块已经成型
  • E-HPC支持多队列管理和自动伸缩
  • ERLANG 网工修炼笔记 ---- UDP
  • ES6系列(二)变量的解构赋值
  • gcc介绍及安装
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • iOS小技巧之UIImagePickerController实现头像选择
  • javascript从右向左截取指定位数字符的3种方法
  • Java反射-动态类加载和重新加载
  • Node.js 新计划:使用 V8 snapshot 将启动速度提升 8 倍
  • Spring Cloud Feign的两种使用姿势
  • vue和cordova项目整合打包,并实现vue调用android的相机的demo
  • 离散点最小(凸)包围边界查找
  • 前端面试之CSS3新特性
  • 什么软件可以提取视频中的音频制作成手机铃声
  • 使用Gradle第一次构建Java程序
  • 用quicker-worker.js轻松跑一个大数据遍历
  • 栈实现走出迷宫(C++)
  • C# - 为值类型重定义相等性
  • Java数据解析之JSON
  • Mac 上flink的安装与启动
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • #1015 : KMP算法
  • #Lua:Lua调用C++生成的DLL库
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • (11)MSP430F5529 定时器B
  • (31)对象的克隆
  • (4)(4.6) Triducer
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (代码示例)使用setTimeout来延迟加载JS脚本文件
  • (动手学习深度学习)第13章 计算机视觉---图像增广与微调
  • (二)什么是Vite——Vite 和 Webpack 区别(冷启动)
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (转)EOS中账户、钱包和密钥的关系
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • .apk 成为历史!