图文并茂的讲清楚Linux零拷贝技术

今天我们来聊一聊Linux零拷贝技术,今天我们以一个比较有代表性的技术sendfile系统调用为切入点,详细介绍一下零拷贝技术的原理。

1.零拷贝技术简介


Linux零拷贝技术是一种优化数据传输的技术,它可以减少数据在内核态和用户态之间的拷贝次数,提高数据传输的效率。

在传统的数据传输过程中,数据需要从内核缓冲区拷贝至应用程序的缓冲区,然后再从应用程序缓冲区拷贝到网络设备的缓冲区,最后才能发送出去。

而零拷贝技术通过直接在应用程序和网络设备之间传输数据,避免了中间的拷贝过程,从而提高了数据传输的效率。

Linux零拷贝技术实现方式:

  • sendfile系统调用:sendfile系统调用可以在内核态中直接将文件内容发送到网络设备的缓冲区,避免了数据在用户态和内核态之间的拷贝。

  • splice系统调用:splice系统调用可以将一个文件描述符的数据直接传输到另一个文件描述符,也可以将数据从一个文件描述符传输到网络设备的缓冲区,避免了中间的拷贝过程。

  • mmap和write系统调用:mmap系统调用可以将文件映射到内存中,然后使用write系统调用将内存中的数据直接发送到网络设备的缓冲区,避免了数据在用户态和内核态之间的拷贝。

  • DMA(Direct Memory Access):DMA是一种硬件技术,可以直接将数据从内存传输到网络设备的缓冲区,避免了CPU的介入,提高了数据传输的效率。

2.sendfile系统调用


sendfile系统调用直接在内核中操作文件数据,将数据从源文件描述符复制到目标文件描述符的发送缓冲区,然后通过网络协议栈将数据发送出去。

这样就避免了数据在内核和用户空间之间的复制,提高了传输效率。

sendfile系统调用函数原型:

#include <sys/sendfile.h>
ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count);参数说明:
out_fd:目标文件描述符,用于发送数据。
in_fd:源文件描述符,从该文件读取数据。
offset:指定从源文件的哪个位置开始读取数据,可以为NULL表示从当前位置开始。
count:要传输的字节数。返回值:
成功:返回写入out_fd文件的字节数。
失败:返回-1,并设置errno。

3.sendfile实现原理


3.1 传统方式发送文件


使用传统方式把一个文件通过socket发送出去,我们需要执行一个比较长的路径。

路径:磁盘->文件页缓存->用户缓冲区->套接字缓冲区->网卡。

上下文切换和内存拷贝情况如下:

  • 上下文切换:4次(read调用,read返回,write调用,write返回)

  • DMA拷贝:2次

  • CPU拷贝:2次(文件页缓存->用户缓冲区,用户缓冲区->套接字缓冲区)

3.2 sendfile发送文件


使用sendfile发送文件,相对来说整个路径会短一些。

路径:磁盘->文件页缓存->套接字缓冲区->网卡。

上下文切换和内存拷贝情况如下:

上下文切换:2次(sendfile调用,sendfile返回)

DMA拷贝:2次

CPU拷贝:1次(文件页缓存->套接字缓冲区)

3.3 sendfile实现原理


sendfile实现的核心是管道,管道在Linux系统中应用的比较多,比如说通过管道实现进程间通信。

当需要将文件数据拷贝至socket缓冲区时,会临时创建一个管道(环形缓冲区),将文件数据先拷贝至管道,再将管道数据迁移至socket缓冲区,数据迁移并不是数据拷贝,只是将指针指向内存地址。

3.4 小节


通过采用sendfile发送文件,可以减少2次上下文切换和1次CPU拷贝,如果我们的实际应用场景是需要进行大量的文件发送,采用sendfile能够很大程度上提高系统性能。

相关视频推荐

2024年c/c++程序员如何提升自己的核心竞争力?这套linux c/c++后端服务器开发技术教程不要错过!icon-default.png?t=N7T8https://www.bilibili.com/video/BV1CF4m1L7hU/

Linux C/C++开发(后端/音视频/游戏/嵌入式/高性能网络/存储/基础架构/安全)

需要C/C++ Linux服务器架构师学习资料加qun812855908获取(资料包括C/C++,Linux,golang技术,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK,ffmpeg等),免费分享

4.管道


4.1 管道简介


管道在Linux系统中应用很广泛,除了零拷贝技术使用到管道,进程间通信同样使用到管道,那么管道到底是什么?

管道是什么?

管道其实就是一个环形缓冲区,通过管道可以将数据从一个文件拷贝另外一个文件。

管道由struct pipe_inode_info结构体定义,该数据结构有4个重要成员:

  • pipe_buffer:管道缓冲区数组,一个固定长度的数组,每个数组成员都是一个缓冲区,对应一个struct pipe_buffer结构。

  • head:头部序号,表示当前可写缓冲区的位置,需要配合mask使用。

  • tail:尾部序号,表示当前可读缓冲区的位置,需要配合mask使用。

  • ring_size:管道缓冲区数组长度,ring_size - 1计算出mask,head & mask获取当前可写缓冲区数组下标,tail & mask获取当前可读缓冲区数组下标。

管道缓冲区由struct pipe_buffer定义,该结构有3个重要成员:

  • page:页指针

  • offset:数据在页中偏移

  • len:数据长度

管道已满或为空判断?

管道已满判断:

head - tail >= ring_size,表示管道已满。

管道为空判断:

head == tail,表示管道为空。

相关结构体定义 

struct pipe_inode_info是Linux内核中用于管道文件的数据结构。它定义在include/linux/pipe_fs_i.h头文件中。

pipe_inode_info结构体的定义如下:

struct pipe_inode_info {unsigned int head; //头部序号unsigned int tail; //尾部序号unsigned int max_usage; //最大使用量unsigned int ring_size; //缓冲区数组大小unsigned int nr_accounted; //已使用缓冲区数量struct pipe_buffer *bufs; //缓冲区数组......
}

struct pipe_buffer是Linux内核中用于管道(pipe)缓冲区的数据结构。它定义在include/linux/pipe_fs_i.h头文件中。

4.2 管道写


通过head & mask获取缓冲区数组下标,将数据写入pipe_buffer对应的内存页,数据起始位置为offset偏移值,写入的数据长度记录在len成员中。

完成数据写操作后,head头部序号增加1,指向下一个可写位置。

4.3 管道读


通过tail & mask获取缓冲区数组下标,将数据从pipe_buffer对应的内存页读取出来,数据起始位置为offset偏移值,读取数据长度不能大于len记录的数据长度。

完成数据读操作后,len设置成0,pipe_buffer被清空,tail尾部序号增加1,指向下一个可读位置。

5.总结


相比于传统的数据传输技术,零拷贝技术能够大大提高系统性能,在实际项目开发中,我们可以选择符合项目特点的零拷贝技术,以最低的成本提高系统性能。

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

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

相关文章

图论入门题题解

✨欢迎来到脑子不好的小菜鸟的文章✨ &#x1f388;创作不易&#xff0c;麻烦点点赞哦&#x1f388; 所属专栏&#xff1a;刷题_脑子不好的小菜鸟的博客-CSDN博客 我的主页&#xff1a;脑子不好的小菜鸟 文章特点&#xff1a;关键点和步骤讲解放在 代码相应位置 拓扑排序 / 家谱…

寄存器(CPU工作原理)

文章目录 寄存器(CPU工作原理)1. 通用寄存器2. 字在寄存器中的存储3. 几条汇编指令4. 物理地址5. 16位结构的CPU6. 8086CPU给出物理地址的方法7. 段的概念8. 段寄存器9 . CS和IP10. 修改CS、IP的指令11. 代码段 寄存器(CPU工作原理) 一个典型的CPU由运算器、控制器、寄存器等器…

【好书推荐-第十期】《AI绘画教程:Midjourney使用方法与技巧从入门到精通》

&#x1f60e; 作者介绍&#xff1a;我是程序员洲洲&#xff0c;一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主、前后端开发、人工智能研究生。公众号&#xff1a;洲与AI。 &#x1f388; 本文专栏&#xff1a;本文收录…

005-事件捕获、冒泡事件委托

事件捕获、冒泡&事件委托 1、事件捕获与冒泡2、事件冒泡示例3、阻止事件冒泡4、阻止事件默认行为5、事件委托6、事件委托优点 1、事件捕获与冒泡 2、事件冒泡示例 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /…

VUE Element例子学习

参考:【前端】VueElement UI案例&#xff1a;通用后台管理系统-项目总结_vue elementui 管理系统-CSDN博客 之前参考的el-admin-web太复杂了&#xff0c;不是纯净的demo. 所以找了一圈资料&#xff0c;找到了这个博客&#xff0c;很合适&#xff0c;有例子的代码&#xff0c;…

【redis】模拟抢红包

1.使用的数据结构 思路是需要将指定数量的红包提前压栈&#xff0c;然后当用户来“抢红包”的时候&#xff0c;将红包取出来。 规定每个用户只能抢一次&#xff0c;并且最小金额是1块钱。 选择redis中的list结构模拟。 2.模拟发红包。 GetMapping("/give-red-packets&…

SpringCloudAlibaba微服务之Nacos架构及基础概念梳理

SpringCloudAlibaba微服务之Nacos架构及基础概念梳理 文章目录 SpringCloudAlibaba微服务之Nacos架构及基础概念梳理1. 官网介绍1. 简介2. Naocs是什么3. Nacos 地图4. Nacos 生态图 2. Nacos 架构1. 基本架构及概念1. 服务 (Service)2. 服务注册中心 (Service Registry)3. 服务…

投标中项目组织结构的设置以及调整(样式表,多级列表)

投标中项目组织结构的设置以及调整&#xff08;样式表&#xff0c;多级列表&#xff09;&#xff1a; 投标项目中需要处理大规模的文字排版&#xff0c;就是需要用到样式表&#xff08;解决层级关系&#xff09;&#xff0c;多级列表&#xff08;解决自动编号的问题&#xff0…

看一看阿里云,如何把抽象云概念,用可视化表达出来。

云数据库RDS_关系型数据库 云数据库RDS_关系型数据库 专有宿主机 云数据库RDS_关系型数据库_MySQL源码优化版 内容协作平台CCP-企业网盘协同办公-文件实时共享

学习与学习理论 - 2024教招 - test

一 方向 方向性很重要&#xff0c;像学投篮一样关注发力顺序才是关键出发点&#xff0c;如果这个出发点没确定下来&#xff0c;会走许多弯路。所有学习理论大的观点&#xff0c;到某个人物个人的观点。被干掉之前&#xff08;不能被干掉&#xff09;&#xff0c;掌握所需的知识…

01、python_爬虫的相关概念

一、什么是爬虫&#xff1f; 爬虫是网络爬虫的简称&#xff0c;指的是一种自动化程序&#xff0c;用于在互联网上抓取信息。爬虫的核心工作包括爬取网页、解析数据和存储数据。 通俗来说就是&#xff1a;通过一个程序&#xff0c;根据url(http://taobao.com)进行爬取网页&…

浏览器是如何渲染页面的?

浏览器是如何渲染页面的&#xff1f; 1. 解析 HTML2. 样式计算 Computed Style3. 布局 Layout4. 分层 Layer5. 绘制 Paint6. 分块 Tiling7. 光栅化 Raster8. 画 draw完整过程面试题什么是 reflow&#xff08;回流/重排&#xff09;?什么是 repaint &#xff08;重绘&#xff0…

用于回归的概率模型

机器学习中的回归方法&#xff1a; 机器学习中的概率模型 机器学习&#xff5c;总结了11种非线性回归模型&#xff08;理论代码可视化&#xff09; 高斯过程回归&#xff1a; Gaussian Processes for Machine Learning GPML——Datasets and Code Gaussian Processes 学…

根据xlsx文件第一列的网址爬虫

seleniumXpath 在与该ipynb文件同文件下新增一个111.xlsx&#xff0c;第一列放一堆需要爬虫的同样式网页 然后使用seleniumXpath爬虫 from selenium import webdriver from selenium.webdriver.common.by import By import openpyxl import timedef crawl_data(driver, url)…

洗地机热门品牌测评:石头/希亦/顺造/云鲸洗地机哪个好?哪个牌子最值得入手

大家好&#xff0c;博主是一个热爱生活和科技的居家测评博主。在过去的三年多时间里&#xff0c;我专注于清洁家电——洗地机。我深入测评了三十多款洗地机&#xff0c;现在我将用简单易懂的语言来分享洗地机的选购技巧和热门洗地机机型推荐。 洗地机选购技巧&#xff1a; 看…

免费域名证书的优势及申请

免费域名证书的优势 经济实惠&#xff1a;免费域名证书的最大优势在于其零成本。对于那些预算紧张的小型网站和个人开发者来说&#xff0c;这无疑是一个巨大的福音。他们无需支付任何费用&#xff0c;即可获得与付费证书相媲美的安全保护。简单易用&#xff1a;免费域名证书的…

智慧城市如何助力疫情防控:科技赋能城市安全

目录 一、引言 二、智慧城市与疫情防控的紧密结合 三、智慧城市在疫情防控中的具体应用 1、智能监测与预警系统 2、智慧医疗与健康管理 3、智能交通与物流管理 4、智慧社区与基层防控 四、科技赋能城市安全的未来展望 五、结论 一、引言 近年来&#xff0c;全球范围内…

二维码门楼牌管理系统应用场景:商业与零售业发展的助推器

文章目录 前言一、二维码门楼牌管理系统的基本功能二、商业和零售业中的应用场景三、二维码门楼牌管理系统的优势分析四、结论 前言 在数字化时代的浪潮中&#xff0c;二维码门楼牌管理系统凭借其独特的优势&#xff0c;正在逐步成为商业和零售业发展的新宠。它不仅能够为商家…

测试环境搭建整套大数据系统(九:docker学习)

一&#xff1a;为什么学习dockder&#xff1f; 对于组件的搭建和部署&#xff0c;可以简化。 二&#xff1a;什么是docker&#xff1f; docker是一个平台。 三&#xff1a;怎么使用docker&#xff1f; 1. 安装&#xff0c;切换仓库。 安装 curl -fsSL https://test.docke…

家用洗地机哪个型号好用?介绍几个值得考虑的品牌

作为家里的主要清洁工&#xff0c;我一直以来都是负责家里的清洁工作。我经常使用吸尘器和扫地机器人来轮流清洁&#xff0c;虽然效果还不错&#xff0c;但是这种方式太费时间和精力了。特别是在脸上厨房里做完饭和孩子吃完饭后留下的残渣时&#xff0c;我总是需要用传统的拖多…