mmap(内存映射)、sendfile() 与零拷贝技术

news2024/12/23 18:24:19

内存映射(Memory-mapped I/O)是将磁盘文件的数据映射到内存,用户通过修改内存就能修改磁盘文件。

img

RocketMQ为什么快?kafka为什么快?什么是mmap?这些问题都逃不过一个点,就是零拷贝。

虽然还有其他的原因,但是这里主要讨论零拷贝。

传统的IO方式

传统的IO方式底层其实是调用read和write来实现;

  1. 用户进程通过read向操作系统发起系统调用,指示上下文从用户态转向内核态;
  2. DMA控制器把数据从硬盘读取到内核缓冲区;
  3. CPU把内核读缓冲区的数据拷贝到应用缓冲区,上下文从内核态转为用户态,read返回;
  4. 用户进程通过write方法发起调用,上下文从用户态切换为内核态;
  5. CPU将用户/应用缓冲区中的数据拷贝到socket缓冲区(写缓冲);
  6. DMA控制器把数据从socket缓冲区拷贝到网卡(写入网卡设备),上下文从内核态切换回用户态,write返回。

什么是DMA拷贝?

对于一个IO操作而言,都是通过CPU发出对应的指令来完成的,但是相比于CPU来说,IO的速度太慢了,CPU有大量时间处于等待IO的状态,因此就产生了DMA直接内存访问技术,本质上来说DMA就是一块主板上独立的芯片,通过它来进行内存和IO设备的数据传输,从而减少了CPU的等待时间,但是不论是谁来拷贝,频繁的拷贝耗时也是对性能的影响。

一次简单的传统IO过程,发生了4次用户态和内核态的上下文切换,这在高并发场景下无疑会对性能产生极大的影响。

这整个过程中发生了4次用户态和内核态的上下文切换和4次的拷贝,如下图:
在这里插入图片描述

什么是零拷贝?

零拷贝技术是指计算机执行操作的时候,CPU不需要先将数据从某处内存复制到另一个特定的区域,这种技术通常用于网络传输文件时节省CPU周期和内存带宽。

那么针对零拷贝而言,并非是真的没有数据拷贝的过程,只不过是减少了用户态和内核态的切换次数,以及CPU的拷贝次数。

下面来谈谈几种常见的零拷贝技术

1. mmap + write

简单来说就是通过mmap替换了read + write中的read操作,减少了一次CPU的拷贝。

mmap的主要实现方式是将内核读缓冲区中的地址和用户缓冲区中的地址进行映射,内核缓冲区和应用缓冲区共享,从而减少了从读缓冲区到用户缓冲区的一次CPU拷贝,那整个过程发生了4次用户态和内核态的上下文切换和3次拷贝,流程如下:

  1. 用户通过mmap方法向操作系统发起调用,上下文从用户态转向内核态;
  2. DMA控制器把数据从硬盘中拷贝到都缓冲区;
  3. 上下文从内核态转为用户态,mmap调用返回;
  4. 用户进程通过write方法发起调用,上下文从用户态切换为内核态;
  5. CPU将内核读缓冲区中的数据拷贝到socket缓冲区(写缓冲);
  6. DMA控制器把数据从socket缓冲区拷贝到网卡(写入网卡设备),上下文从内核态切换回用户态,write返回。

总的来说,mmap + write的方式节省了一次CPU拷贝,同时由于用户进程中的内存是虚拟的,只是映射到内核的读缓冲区,所以可以节省一半的内存空间,比较适合大文件的传输。
在这里插入图片描述

2. sendfile()方式

相比于mmap + write的方式来说,sendfile同样减少了一次CPU拷贝,而且还减少了两次上下文切换。
在这里插入图片描述
sendfile()是Linux2.1内核版本之后引入的一个系统调用函数,通过使用sendfile,数据可以直接在内核空间进行传输,因此避免了用户空间和内核空间的拷贝,同时由于sendfile()替代read+write从而减少了一次系统调用(两次用户态和内核态的上下文切换),具体流程如下:
在这里插入图片描述
总结

由于CPU和IO速度的差异问题产生DMA技术,通过DMA搬运来减少CPU的等待时间。

  • 传统IO:2次DMA拷贝+2次CPU拷贝+4次上下文切换
  • mmap:2次DMA拷贝+1次CPU拷贝+4次上下文切换
  • sendfile():2次DMA拷贝+1次CPU拷贝+2次上下文切换

但是使用sendfile()方式时,IO数据对于用户空间是不可见的。

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

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

相关文章

电脑不能开机的几个常见原因

现在手机已经将电脑取代了,用电脑的越来越少,因为一些原因上网课的多了起来,大家都将放置几年的电脑搬了出来,开不开机的大有人在,由于机器闲置很久大多都出现了各种各样的故障和问题,在这里总结了电脑台式…

C语言:浮点型存储方式

浮点型存储方式 任意一个二进制浮点数V可以表示成下面的形式 (-1)^S *M *2^E 1(S符号位) 8(E阶码) 23(M尾码)省略首位1 S:表示正负 只有0/1两个值 M:由浮点数转化成二进制数表示 在…

4.7、IPv4 数据报的首部格式

固定部分:每个 IP 数据报首部都必须包含的内容 某些 IP 数据报的首部除了包含 202020 字节的固定部分外,还包含一些可选的字段来增加 IP 数据报的功能 IP 数据报的首部常以 323232 个比特为单位进行描述 图中的每一行都由 323232 个比特(也…

小波分析——4.使用小波对信号成分进行分析

文章目录首先创建一个包含多频率成分的信号然后我们用数学实现一个墨西哥草帽小波然后我们开始对原始信号进行处理吧接下来可以把信号成分进行绘制在前面的章节里已经介绍过小波的理论、公式等知识点,现在我们来看看如何用小波来实现对复杂信号的成分分析。 在我们…

性能优化系列之『HTML5 离线化:主流的技术实现方案有哪些?』

文章の目录一、离线包类型二、离线包架构三、离线包下载四、离线包运行模式五、大厂离线包方案写在最后一、离线包类型 全局离线包:包含公共的资源,可供多个应用共同使用私有离线包:只可以被某个应用单独使用 二、离线包架构 三、离线包下载…

Fairness in Recommendation: A Survey 阅读笔记

论文链接 搁置了许久的毕设,又要开始重新启航。 2022年的最后一段时间过得真是很崎岖,2023希望大家平安喜乐。 课设还未结束,但是毕设不能再拖,开工啦!这又是一篇综述,有关推荐系统中的公平性,…

5.Isaac教程--创建Isaac应用

创建Isaac应用 本教程将指导您完成使用 Isaac SDK 创建机器人应用程序的过程,以视频输入的 OpenCV 边缘检测处理为例。 文章目录创建Isaac应用预安装显示相机源创建应用程序文件启用节点间通信配置组件创建 Bazel 构建文件运行应用程序查看相机源处理相机源添加边缘…

1.6日报

以redis为基础完成 addCacheData getCacheDataByUniqueId delCacheDataByUniqueId 并且测试通过。 升级getQRcodeAndScene接口,添加版本参数,实现“不同环境取不同小程序版本“功能 并添加扫码跳转页面功能。 遇到的问题及解决 加深对RequestBody…

性能优化系列之『HTTP-2 :升级HTTP-2的好处有哪些?如何升级?』

文章の目录一、HTTP/2 概念二、HTTP/2 优点三、HTTP/2 站点的优势四、在 Nginx 上启用 HTTP/21、升级 OpenSSL2、重新编译3、验证 HTTP/24、浏览器请求截图写在最后一、HTTP/2 概念 HTTP/2(超文本传输协议第2版,最初命名为 HTTP 2.0)&#x…

【Spring AOP】@Aspect结合案例详解(一): @Pointcut使用@annotation + 五种通知Advice注解

文章目录前言AOP与Spring AOPAspect简单案例快速入门一、Pointcutannotation二、五种通知Advice1. Before前置通知2. After后置通知3. AfterRunning返回通知4. AfterThrowing异常通知5. Around环绕通知总结前言 在微服务流行的当下,在使用SpringCloud/Springboot框…

分布式基础篇3——前端开发基础知识

前端技术对比一、ES61、简介2、什么是 JavaScript3、ES6新特性3.1 let3.2 const3.3 解构表达式3.4 字符串扩展3.5 函数优化3.6 对象优化3.7 map 和 reduce3.8 Promise3.9 模块化二、Vue1、MVVM 思想2、Vue 简介3、Vue 入门案例4、Vue 指令插值表达式v-text、v-htmlv-bindv-mode…

景区地图最短路径快速实现

1 前言以前粗略学习了一下在地图中实现最短路径,并在切图工具中实现了自动处理生成导航相关数据。https://blog.csdn.net/bq_cui/article/details/86795213最近发现工具实现的结果,错误一大堆。这次再详细捋一捋整个步骤,感兴趣的同学可以试一…

ctemplate 的安装和使用

ctemplate 用于linux下的web开发,可以动态生成一个html网页,这里的 “ 动态 ” 指的是网页的数据不是固定的,可以使用变量来填充网页内容。 目录 1、下载ctemplate 2、安装 ctemplate 3、使用ctemplate库 1、下载ctemplate 可以在gite…

前端对接微信公众号网页开发流程,授权对接

前面讲到 前端对接微信公众号网页开发流程,前期配置,本篇文章主要详细介绍关于公众号的授权对接。 一、引入微信js-sdk 在需要调用 JS 接口的页面引入如下 JS 文件 http://res.wx.qq.com/open/js/jweixin-1.6.0.js如需进一步提升服务稳定性&#xff0…

如何在windows上使用VMware安装macOS虚拟机

如何在windows上使用VMware安装macOS虚拟机一、准备工作1.1 安装 VMware1.2 下载macOS的安装包1.3 下载VMware虚拟机解锁安装苹果系统工具二、解锁VMware支持macOS安装2.1 关闭已经打开的VMware软件2.2 安装VMware Workstation Unlocker三、VMware创建虚拟机3.1 解压缩macOS的安…

【蓝桥杯】X 进制减法

难点一&#xff1a;base base * s[i] % mod;//***当前位乘以x&#xff0c;x要*s[i],一直要乘到个位的进制难点二&#xff1a;当当前该位的的进制位&#xff0c;为max(max(a[i]1, b[i]1), 2)的时候&#xff0c;结果最小ACcode:#include<iostream>using namespace std;con…

性能优化系列之『混合式开发: React Native内核及优势介绍』

文章の目录一、React Native愿景二、技术优势1、技术2、效率3、发版三、底层内核1、RN&#xff1a;helloWorld.jsx2、iOS&#xff1a;helloWorld.m3、Android&#xff1a;helloWorld.xml4、Web&#xff1a;helloWorld.html四、行业背景五、选型建议写在最后一、React Native愿景…

【计算机体系结构基础】指令流水线

单周期处理器 简要描述单周期处理器的执行过程&#xff1a; PC从指令存储器中读取指令 取指后译码得出相关的控制信号读取regfile&#xff08;寄存器堆&#xff09; 运算器对regfile中取出的操作数进行计算&#xff0c;将计算的结果写回通用寄存器堆或者得到访存指令的地址或…

边缘数据采集网关如何实现PLC远程上下载

边缘数据采集网关&#xff0c;又称边缘计算网关、工业物联网网关&#xff0c;是连接工业设备与通信网络的桥梁&#xff0c;可以实现不同协议之间的解析转换&#xff0c;打造高效实时的数据采集系统&#xff0c;并借助边缘计算规则对数据进行清洗过滤&#xff0c;适配云平台实现…

QT 学习笔记(十五)

文章目录一、UDP 通信过程1. Linux 下的 UDP 通信过程2. QT 下的 UDP 通信过程3. 在 QT 中实现 UDP 通信的流程4. TCP/IP 和 UDP的区别二、UDP 文本发送1. UDP 文本发送实例演示2. UDP 广播3. UDP 组播三、UDP 文本发送实现代码1. 主窗口头文件 widget.h2. 主窗口源文件 widget…