提升数据传输效率的杀手锏“零拷贝技术“

💡那么为什么需要零拷贝技术? 它是怎么演进的过来的呢?

首先了解零拷贝之前呢, 我们先来认识一下零拷贝的前世今生.先来回顾一下消息传输的正常流程

举个例子说明

就举寄快递的例子吧 ,一般我们先把快递送到附近的驿站, 然后由快递员前往驿站拿取快递,最后将快递进行寄出。

使用快递驿站寄快递场景

这时候你会发现,寄出快递的快慢完全由快递员决定,快递驿站仅仅是个“中转站” 而已, 那么你会想了,有没有更快的方法?

那我能不能直接将快递拿给快递员 直接寄出呢?这样会不会快点

家里取快递案例

答案是肯定的,这样做直接省去了快递驿站的中转, 直接交由快递小哥,减少了你拿快递去驿站的时间 以及 快件在驿站的逗留时间。


💡那么在实际计算机里面是这部分是怎么流转的呢?

首先我们先来了解一下计算机各自有自己的操作空间,一般由软件操作的空间 我们叫用户态,由操作系统操作的空间一般叫内核态。

首先由软件进行发起文件查询, 然后由操作系统去操作底层的硬盘进行文件获取,然后在由操作系统将文件传递到软件中进行展示。

这是一次的数据传输操作流程

主要过程如下

1.内核态通过DMA进行拷贝磁盘文件到内核缓冲区中。

备注:DMA拷贝是指由DMA控制器将磁盘控制器缓冲区中的数据拷贝到内核缓冲区中

磁盘文件DMA拷贝

2. 用户态在从内核缓冲区中奖数据拷贝到用户缓冲区中,这时候应用程序才可以使用这部分数据,并且这个过程主要由CPU完成的。

磁盘文件到用户态数据传输流程

大家应该还有留意上图中有切换1 切換2 的示意,这里主要是上下文的切换,由于需要从用户态切换到内核态进行数据读取, 所以需要上下文间也进行切换,先进行保存当前执行状态方便切换后续的流程正常进行,所以这里需要进行两次的上下文切换,并且每次上下文切换是一种开销较大的操作,因为它涉及保存和恢复大量的执行状态信息,所以会造成一定程度的系统资源开销。

备注:
上下文切换是指操作系统在多任务处理时,从一个任务(或进程)切换到另一个任务(或进程)时,保存当前任务的执行状态(包括寄存器状态、程序计数器值等),以便稍后能够恢复该任务的执行。这种切换是操作系统进行任务调度和管理的基本操作之一。

3. 如果要将这个数据进行发送给其他机器,那么又需要调用操作系统进行消息发送

用户态发送消息到操作系统

这里和上述第二个流程一样,我们又需要操作系统帮忙将消息进行发送,这里又涉及两次上下文的切换,用户缓冲区在将里面的数据通过CPU拷贝到内核态的Socket缓冲区中(网络传输缓冲区)

4.最后操作系统操作网卡将数据通过DMA拷贝到网卡上进行消息发送。

传统磁盘发送数据流程


💡唉,好长的流程,就不能简化么?

确实,但这是操作系统的操作流程,为了更好的保证操作系统的安全以及各个层级之间的界限,这个做是合理且正常的 ,但不是所有数据都需要通过用户态进行的,就像开头说的那样,

我想直接将快递发给快递小哥,不需要快递驿站的中转也是可以的,所以零拷贝技术就油然而生了。


💡零拷贝

原理:传统的数据传输方式通常涉及将数据从一个缓冲区复制到另一个缓冲区,这会产生额外的开销和延迟。而零拷贝技术则通过避免数据在传输过程中的复制,直接在内存中操作数据的指针,从而节省了CPU和内存资源的消耗,也就是说比较传统的消息,在消息处理 I/O操作的时候减少频繁复制数据的问题,从而节省CPU和内存的消耗。

简而言之就是简化流程,我们想要操作系统帮我做到,主要的目标直接帮我将数据直接发送出去,不需要绕这么一圈的流程,所以零拷贝主要目的是减少流程中转,提升数据传输的效率,降低系统资源的消耗。


💡那么零拷贝的实现方式有多少种?什么是mmap?sendfile呢?

关于零拷贝主要实现的技术有mmap+write ,sendfile ,splice 等几种方式。接着我们一起来探讨主流的mmap 以及sendFile模式吧


💡mmap +write

嗯, 相对于传统的4次拷贝,我们来优化一下吧,看看能不能减少一下传输的流程。目前觉得最应该优化的就是用户缓冲区,他和快递驿站一样就是过度的,

那么能不能由快递驿站通知快递员直接上门取件呢?这样岂不是减少了用户拿快递去驿站的时间么

减少一次拷贝到过程示图

mmap 技术就是利用虚拟内存(内存地址映射),让原来用户空间和内存空间分开种开辟一个共享的空间进行使用,那么内核态只需要将数据复制到共享区,然后应用程序将读取的数据写回socket的时候就不需要进行一次多余的拷贝了,具体如下图所示

mmap虚拟缓冲

这么做的原因由于虚拟内存地址的映射,这样在用户缓冲区读取信息,可以直接吧内存缓冲区的数据进行读取 然后复制到Socket缓冲区即可,不需要从用户态进行复制内核态,直接从内核缓冲区进行复制即可,因为这一块内存是共享了的,物理内存地址一致,用户态可以直接操作。这样做法可以减少一次CPU复制到过程, 但是还是由用户态发起的上下文的切换还是需要切换4次 用户缓冲区还是需要将数据读取到用户缓冲区,然后在写回去缓冲区。

那么还有更加完美的方法吗?


💡sendFile

sendFile


快看 目前我们只有三次拷贝 和 两次上下文切换啦,主要减少了一次由应用程序发起的write请求,直接发起sendfile 操作 所以只需要读的两次上下文切换


💡还能继续减少吗? 能不能把CPU copy 也减少了呢?

sendfile的scatter和gather

那就是采取文件描述符的形式,让socket缓冲区直接使用文件描述符直接读取内核缓冲区的内容,避免CPU进行数据的拷贝,然后直接DMA到网卡中,再一次减少一个CPU copy,这样只有两个上下文的切换 以及两次数据的拷贝。

备注:
文件描述符是操作系统提供给进程的一种标识文件和I/O资源的方式,它允许进程通过唯一的整数来访问和操作这些资源。

总结:

零拷贝技术作为数据传输优化的重要特性之一,在大数据处理领域发挥着重要作用。引入了零拷贝技术后,通过减少复制带来的资源消耗以及上下文切换带来的开销,进一步提升系统的性能和效率,实现更高效的数据传输和处理。

好啦,这就是零拷贝技术的介绍。

推荐阅读

https://juejin.cn/post/6995519558475841550

🗣️那么后续想要了解kafka的高可用是如何做到的?

那么请留意后期的推文,或者关注我集中更新哦~

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

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

相关文章

Java的IDEA的工程管理

模块和包的图标: 举个例子: IDEA中创建包: 如图所示,com.LBJ的意思是在com包中创建子包LBJ 参见: IDEA中项目、模块和包的关系_idea中模块和项目-CSDN博客

网站为什么要选择使用安全加速SCDN?

安全加速SCDN(安全内容交付网络)是一种网络加速服务,旨在提高网站和应用程序的性能和安全性。它使用专门的技术和基础设施来加速内容传输并保护网站免受网络攻击。 安全加速SCDN可以通过内容缓存、快速传输和动态路由技术来加速网站和应用程…

linux nginx配置ssl, 实现https+ip访问

mkdir sslZhengShu openssl req -newkey rsa:2048 -nodes -keyout ca.key -out ca.csr openssl x509 -req -days 365 -in ca.csr -signkey ca.key -out ca.crt openssl genrsa -out server.key 2048 openssl req -new -key server.key -out server.csr 和之前输入一样即可 …

京东云0基础搭建帕鲁服务器_4核16G和8核32G幻兽帕鲁专用服务器

使用京东云服务器搭建幻兽帕鲁Palworld游戏联机服务器教程,非常简单,京东云推出幻兽帕鲁镜像系统,镜像直接选择幻兽帕鲁镜像即可一键自动部署,不需要手动操作,真正的新手0基础部署幻兽帕鲁,阿腾云atengyun.…

每日一题--最长连续序列

洛阳春-岑参 人到洛阳花似锦,偏我来时不逢春。 谁道三冬无春色,冰山高处万里银 目录 题目描述 思路分析 方法及其时间复杂度 法一 暴力枚举: 法二 哈希表遍历: 法三 并查集: 个人总结 题目描述 128. 最长连续序…

【UEditorPlus】后端配置项没有正常加载,上传插件不能正常使用

解决办法: 1、找到UEditorPlus的根目录,修改 ueditor.all.js 文件 搜索:isJsonp utils.isCrossDomainUrl(configUrl); 更改为:isJsonp false; 2、重新运行前端即可正常使用 如果出现依旧不行,请关闭服务&#xff…

后端之卡尔曼滤波

后端之卡尔曼滤波 前言 在很久之前,人们刚结束信息传递只能靠信件的时代,通信技术蓬勃发展,无线通信和有线通信走进家家户户,而著名的贝尔实验室就在这个过程做了很多影响深远的研究。为了满足不同电路和系统对信号的需求&#…

每日一练:LeeCode-48、旋转图像【二维数组+行列交换】

给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 示例 1: 输入:matrix [[1,2,3],[4,5,6],[7,8,9]] 输出…

6、鸿蒙学习-Stage模型应用程序包结构

基于Stage模型开发的应用,经编译打包后,其应用程序的结构如下图应用程序包结构(Stage模型)所示。开发者需要熟悉应用程序包结构相关的基本概念。 一、在开发态,一个应用包含一个或者多个Module,可以在DevE…

vscode安装vue3+elment-plus

1.用vscode打开打算创建项目的目录 2.命令行中运行以下命令 npm create vuelatest3.设置好项目名称 4.执行以下命令 cd <your-project-name>5.执行以下命令 cnpm install6.执行以下命令安装elment-plus cnpm install element-plus --save7.执行以下命令 npm run dev…

怎样去保证 Redis 缓存与数据库双写一致性?

解决方案 那么我们这里列出来所有策略&#xff0c;并且讨论他们优劣性。 先更新数据库&#xff0c;后更新缓存先更新数据库&#xff0c;后删除缓存先更新缓存&#xff0c;后更新数据库先删除缓存&#xff0c;后更新数据库 先更新数据库&#xff0c;后更新缓存 这种方法是不推…

【明道云】如何让用户可以新增但不能修改记录

【背景】 遇到一个需求场景&#xff0c;用户希望新增数据后锁住数据不让更改。 【分析】 在设计表单时直接将字段设置只读是不行的。字段设置只读将会直接让界面上此字段的前端组件不可编辑。包括新增时也无法填入。显然是不符合需求的。 需要既能新增&#xff0c;新增后又不…

macOS 13 Ventura (苹果最新系统) v13.6.6正式版

macOS 13 Ventura是苹果电脑的全新操作系统&#xff0c;它为用户带来了众多引人注目的新功能和改进。该系统加强了FaceTime和视频通话的体验&#xff0c;同时优化了邮件、Safari浏览器和日历等内置应用程序&#xff0c;使其更加流畅、快速和安全。特别值得一提的是&#xff0c;…

eclipse自动跳到console 解决办法

eclipse启动服务后&#xff0c;想看一些properties信息或者别的&#xff0c;但老是自动跳转到console页面&#xff0c;下面是解决办法&#xff1a; Eclipse中按照如下顺序找到设置菜单的位置&#xff1a; Window — Preferences — Run/Debug — Console 找到以下两项&#xf…

Ubuntu18.04安装RYU

安装RYU 环境&#xff1a;Ubuntu18.04 1.先安装一些插件 apt-get install python-eventlet python-routes python-webob python-paramiko2.安装RYU&#xff0c;使用下载源文件安装 git clone https://github.com/osrg/ryu.gitcd ryu git tag进入RYU查看下载的版本有哪些。在…

用 AI 编程-释放ChatGPT的力量

最近读了本书&#xff0c;是 Sean A Williams 写的&#xff0c;感觉上还是相当不错的。一本薄薄的英文书&#xff0c;还真是写的相当好。如果你想看&#xff0c;还找不到&#xff0c;可以考虑私信我吧。 ChatGPT for Coders Unlock the Power of AI with ChatGPT: A Comprehens…

小美的平衡矩阵(前缀和例题)

2024美团秋招&#xff0c;被这一题给难住了 美团校招笔试真题_Java工程师、C工程师_牛客网 题目&#xff1a; 解答&#xff1a; 这道题的关键点就是要计算出以某一点为矩阵右下角时&#xff0c;1的个数 我一开始是想着遍历&#xff0c;以某一点为起点&#xff08;矩阵左上角&a…

内存泄露排查流程

一、创建内存泄露案例 package com.mxl.controller;import lombok.Data; import lombok.extern.slf4j.Slf4j; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.Re…

使用Kaggle API快速下载Kaggle数据集

前言 在使用Kaggle网站下载数据集时&#xff0c;直接在网页上点击下载可能会很慢&#xff0c;甚至会出现下载失败的情况。本文将介绍如何使用Kaggle API快速下载数据集。 具体步骤 安装Kaggle API包 在终端中输入以下命令来安装Kaggle API相关的包&#xff1a; pip install…

如何利用webpack来优化前端性能

当涉及前端性能优化时&#xff0c;Webpack 是一款不可或缺的工具。它不仅仅是一个模块打包工具&#xff0c;还提供了各种功能和插件&#xff0c;可以帮助开发人员优化前端应用程序的性能。在这篇文章中&#xff0c;我们将深入探讨如何有效地利用 Webpack 来优化前端性能&#x…