零拷贝(Zero Copy)技术

news2024/12/23 18:57:07

概念

我们知道Linux系统分为用户态和内核态,在用户态每发起一次IO请求,就需要进行2次上下文切换(分别是用户态->内核态,内核态→用户态),和一次CPU拷贝(将数据从内核缓存拷贝到用户缓存)。
设想一个最简单的应用场景,即从一个文件读取数据并写入另一个文件,整个过程需要进行四次上下文切换,并且需要2次CPU拷贝和2次DMA拷贝。
在这里插入图片描述
无论是上下文切换还是CPU拷贝都是十分消耗CPU资源的行为,而零拷贝就是使用各种技术减少甚至消除这些CPU参与的上下文切换和拷贝动作。

方法

零拷贝的实现共有三大类方法:

  1. 减少甚至消除内核态到用户态的拷贝:在某些情况下,例如上述的文件读写,其实用户并不需要访问实际的数据,那么数据就无需经过 内核->用户→内核 的两次拷贝过程,让数据只在内核中拷贝一次甚至完全不拷贝。Linux提供了一些特殊的系统调用,例如mmap,sendfile,splice等,可以实现这类操作,整个过程还是以内核为主导。
  2. 用户绕过内核与硬件直接IO:通过某些方法可以使用户态的进程绕过内核直接与硬件通信,从而避免数据的多次传输,内核在这一过程中只起辅助作用,整个过程以用户态进程为主导。
  3. 在传统IO架构上优化传输方式。

接下来我们将简单介绍这几种方法的几个具体实现案例。

减少拷贝

mmap

mmap的整个流程如下:

  1. 首先由用户态进程发起mmap系统调用,切换到内核态
  2. 内核将指定的内核缓存区映射到用户缓存区
  3. 内核驱动DMA拷贝相关数据至内核缓存,拷贝完成后切换回用户态
  4. 用户调用writer系统调用,切换至内核态
  5. 内核将数据从数据拷贝至套接字缓存区
  6. DMA讲数据拷贝至实际硬件(网卡、磁盘)
  7. write返回,切换回用户态
    整个流程需要进行4次上下文切换,一次CPU拷贝和两次DMA拷贝,与经典方法相比少了一次CPU拷贝。
    但是这种映射也是很消耗CPU资源的,只适合在传输数据量较大时使用,否则反而会更慢。
    在这里插入图片描述
    优点:减少一次CPU拷贝
    缺点:不能对数据进行任何操作,in只能是指向文件的fd。系统调用次数没有优化。

sendfile

如果只是想简单的进行数据传输,那么上述流程显然还可以简化,sendfile就是mmap和write函数的结合。
sendfile中可以直接指定想要读取的文件和想要写入的文件,只进行一次系统调用,从而将上下文切换减少至2次。
内核中的实际流程和mmap一致。
在这里插入图片描述
在2.4版本之后,Linux又做了一些优化,可以让DMA拷贝到非连续的内存并且可以从非连续内存拷贝数据,因此最后一次CPU拷贝就也可以去掉了,流程如下
在这里插入图片描述
优点:系统调用减少至1次,CPU拷贝次数减少至0次。

splice

splice技术是通过一个管道在内核空间传递想要拷贝数据的物理内存地址,从而实现实际数据的0拷贝。
用户在使用时需要先创建一个pipe管道,获取其输入和输出对应的文件描述符,再调用两次splice,分别将数据的物理内存地址写入和pipe和从pipe中读出。
在这里插入图片描述
优点:CPU拷贝次数减少至0次
缺点:需要3次系统调用
由于后续sendfile底层使用了splice,因此splice没有额外提供更简便的接口。
只用在数据传输特别频繁时,可以通过该接口重复利用pipe,可以节省内存。

send with MSG_ZEROCOPY

可以将数据从用户态零拷贝的传输到网卡,在传输大包时很有用

if (setsockopt(socket_fd, SOL_SOCKET, SO_ZEROCOPY, &one, sizeof(one)))
        error(1, errno, "setsockopt zerocopy");

ret = send(socket_fd, buffer, sizeof(buffer), MSG_ZEROCOPY);

绕过内核直接IO

上文介绍的各种方法都是由内核在内核态中进行操作,尽量较少不必要的拷贝。
那么假如用户可以直接访问硬件,通过DMA讲数据直接拷贝至用户态,岂不是更为理想。
在这里插入图片描述
这种方式的优点十分明显,数据全程不经过内核态,较少拷贝,同时用户可以在用户态中任意操作读取到的数据。

但也有一些缺点:

  1. 破坏了对硬件的抽象,使用繁琐
  2. 将硬件的操作权下放给用户,增大了风险
  3. 硬件与用户进程绑定,只能支持特定场景
  4. 为了防止DMA在拷贝时实际物理内存被其他进程占用,需要提前申请内存池

用户直接访问硬件

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

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

相关文章

redis设置密码并修改查看的几种方式

前言 最近正值世纪杯期间,不知道大家心目中的球队成绩如何,最近在工作中需要设置redis服务器的密码的场景 设置密码可以在很大的程度保护redis服务器,但是相关的命令需要通过密码校验之后才能使用 下面就分享给大家两种设置redis服务器的密…

Java并发编程—CompletableFuture的异步执行案例

在博主前几篇博客中,https://blog.csdn.net/qq_52545155/article/details/128167519?spm1001.2014.3001.5501,给大家分享了关于多线程中异步任务的执行和一些相关概念,在这篇博客中,主要是通过一个实际的案例让大家对于Completab…

利用卷神经网络实现IOSLab数字手写图像识别

利用卷神经网络实现IOSLab数字手写图像识别 文章目录利用卷神经网络实现IOSLab数字手写图像识别一、前言二、作业要求三、数据集样本分析四、代码实现1、运行环境2、导入依赖项3、导入数据集4、加载数据和数据预处理5、划分数据集6、CNN网络结构构建7、编译模型8、训练模型9、模…

性能分析之解析 RESAR 性能分析七步法

文章目录一、压力场景数据分析二、架构分析三、响应时间分析四、全局监控分析五、定向监控六、判断性能瓶颈七、提出解决方案一、压力场景数据分析 下面是⼀个登录接⼝的基准场景测试,JMeter 启动后,线程在 1-2 个的时候 TPS 已经达到 200 左右&#xf…

JavaScript -- 字符串常用方法及示例代码介绍

文章目录字符串的方法1 length2 索引3 str.at()4 str.charAt()5 str.concat()6 str.includes()7 str.indexOf() 和 str.lastIndexOf()8 str.startsWith() 和 str.endsWith()9 str.padStart() 和 str.padEnd()10 str.replace() 和 str.replaceAll()11 str.slice() 和 str.substr…

Mysql调优(一)——性能监控

一、大纲图 【Mysql调优.xmind】 二、Mysql调优简写 2.1 性能监控 2.1.1 使用show profile查询剖析工具,可以指定具体的type 此工具默认是禁用的,可以通过服务器变量在会话级别动态的修改: set profiling1;当设置完成之后,在…

某Android大厂面试100题,涵盖测试技术、环境搭建、人力资源......【速度领取】

最近看到网上流传着各种面试经验及面试题,往往都是一大堆技术题目贴上去,但是没有答案。 为此,小编用业余时间整理了这份软测常见的面试题及详细答案,包含测试技术面试题、开发及环境搭建类面试题以及人力资源方向的面试题&#…

代码随想录训练营第42天|01背包问题、LeetCode 416. 分割等和子集

参考 代码随想录 01背包问题 01背包是在M件物品取出若干件放在空间为W的背包里,每件物品的体积为W1,W2至Wn,与之相对应的价值为P1,P2至Pn。01背包是背包问题中最简单的问题。01背包的约束条件是给定几种物品,每种物品有且只有一…

java计算机毕业设计ssm网上拍卖系统vdum4(附源码、数据库)

java计算机毕业设计ssm网上拍卖系统vdum4(附源码、数据库) 项目运行 环境配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。…

MySql分库分表

问题分析: 随着互联网及移动互联网的发展,应用系统的数据量也是成指数式增长,若采用单数据库进行数据存储,存在以下性能瓶颈: 1、IO瓶颈:热点数据太多,数据库缓存不足,产生大量磁盘…

小快轻准,5分钟自助上线,中小型制造企业数字化转型

中小企业作为国民经济的重要组成部分,占据我国企业数量的90%以上。 继《中小企业数字化赋能专项行动方案》发布后,工信部近日印发《中小企业数字化转型指南》,提出14条具体举措,为中小企业明确数字化转型路径。 地方政府也纷纷出…

Linux系统管理、运行级别、关闭防火墙

目录 一、Linux服务管理 1.1 基本概念 1.2 systemctl(centos7,很重要) 1.2.1 基本语法 1.2.2 查看服务 1.2.3 防火墙操作 1.3 systemctl 设置后台服务的自启配置 二、系统运行级别 2.1 运行级别 2.2 查看当前运行级别 2.2修改当前运行…

8年三届世界杯,8年前端开发,梅西一共踢没了我八千八

转眼2022年即将过去,我已经做了那么久的开发了,一路走来,不断的工作,换工作,找工作,不断的学习新知识。 同时也看着梅西参加了3届世界杯了,逝者如斯夫,不舍昼夜啊。 在这8年里&#…

2023最新SSM计算机毕业设计选题大全(附源码+LW)之java焦作旅游网站q5msq

首先选择计算机题目的时候先看定什么主题,一般的话都选择当年最热门的话题进行组题,就比如说,今年的热门话题有奥运会,全运会,残运会,或者疫情相关的,这些都是热门话题,所以你就可以…

Elasticsearch Data Stream 数据流使用

本文是《Elasticsearch索引生命周期管理ILM》中数据流索引补充篇,文章地址如下: https://mp.weixin.qq.com/s/ajhFp-xBU1dJm8a1dDdRQQ 并且在另一片Elasticsearch的进阶使用-动态模版中也提到了相关数据流索引的内容,有兴趣的可以回过头看一下…

知乎热议的 Java 面试成神笔记,下载量已过90k,面试神技.exe进程已启动

在某论坛上面对于“中国程序员数量是否已经饱和或者过剩”这个话题很火! 今年大家都有一个共同的感受:工作不好找,薪资不理想,面试造火箭。 其实,由于不仅是因为今年受疫情影响,很多公司经营不下去&#xf…

Java中的类和对象(Java系列4)

目录 前言: 1.什么是面向对象 2.类的定义和使用 3.this引用 3.1this引用的概念 3.2this引用的特性 3.3this的使用 4.构造方法 4.1构造方法概念 4.2构造方法的特性 5.默认初始化 6.就地初始化 7.封装 8.封装扩展之包 8.1为什么对提出包的概念呢&#x…

前端开发需要会什么?先掌握这三大核心关键技术

前端工程师,如何创造/制作一个网站应用呢? 为了更好的让你理解,我们简单地做一个类比:动画制作者在创造人物的时候,需要从构图、着色和动画效果上入手,让人物有骨、有血,灵性生动。 而如果将一…

长安链共识模块优化中的“精益求精”

长安链在v2.3.0版本中对共识模块进行了优化,主要包括优化TBFT消息机制并将异步发送信息功能进行了拆分,独立设计了一致性引擎模块。优化后共识模块整体逻辑更清晰、共识更高效。 TBFT消息机制优化背景 在长安链的V2.3.0版本的TBFT共识算法中&#xff0…

W易NEWS login逆向分析

内容仅供参考学习 欢迎朋友们V一起交流: zcxl7_7 目标 网址:案例地址 分析 首先进行一次登录,获取流程 在这个流程中可以看到dl/zj/mail/l这个接口返回了新的cookie,可以猜测这个是登录核心;dl/zj/mail…