零拷贝总结

news/2024/4/27 20:27:58/文章来源:https://blog.csdn.net/secret2316352792/article/details/127250825

数据交互模式

在这里插入图片描述
在这里插入图片描述

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dqLJVb5U-1665401648551)(en-resource://database/1074:1)]

  1. 读数据过程:
  • 应用程序要读取磁盘数据,调用 read()函数从而实现用户态切换内核态,这是第 1 次状态切换;
    DMA 控制器将数据从磁盘拷贝到内核缓冲区,这是第 1 次 DMA 拷贝;
    CPU 将数据从内核缓冲区复制到用户缓冲区,这是第 1 次 CPU 拷贝;
    CPU 完成拷贝之后,read()函数返回实现用户态切换用户态,这是第 2 次状态切换;
  1. 写数据过程:
  • 应用程序要向网卡写数据,调用 write()函数实现用户态切换内核态,这是第 1 次切换;
    CPU 将用户缓冲区数据拷贝到内核缓冲区,这是第 1 次 CPU 拷贝;
    DMA 控制器将数据从内核缓冲区复制到 socket 缓冲区,这是第 1 次 DMA 拷贝;
    完成拷贝之后,write()函数返回实现内核态切换用户态,这是第 2 次切换;
  • 综上:
    读过程涉及 2 次空间切换、1 次 DMA 拷贝、1 次 CPU 拷贝;
    写过程涉及 2 次空间切换、1 次 DMA 拷贝、1 次 CPU 拷贝;
    可见传统模式下,涉及多次空间切换和数据冗余拷贝,效率并不高,接下来就该零拷贝技术出场了。
    注:直接内存访问(Direct Memory Access),是一种硬件设备绕开 CPU 独立直接访问内存的机制。所以 DMA 在一定程度上解放了 CPU,把之前 CPU 的杂活让硬件直接自己做了,提高了 CPU 效率。

mmap 方式

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QVZOvhc1-1665401648551)(en-resource://database/1076:1)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3WULPS8n-1665401648551)(en-resource://database/1078:1)]

  • mmap 是 Linux 提供的一种内存映射文件的机制,它实现了将内核中读缓冲区地址与用户空间缓冲区地址进行映射,从而实现内核缓冲区与用户缓冲区的共享。

  • mmap 对大文件传输有一定优势,但是小文件可能出现碎片

  • 综上:
    减少了一次cpu数据拷贝,用户态与内核态的切换次数没有减少

sendfile方式

在这里插入图片描述

  • 从用户程序的用户态切换至内核态,使用 DMA将数据读入内核缓冲区,不会使用 cpu
  • 数据从内核缓冲区传输到 socket 缓冲区,cpu 会参与拷贝
  • DMA 将 socket 缓冲区的数据写入网卡,不会使用 cpu
  • 综上:
    发生了两次状态切换,1 次 CPU 拷贝、2 次 DMA 拷贝。

sendfile+DMA 收集

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ecKClx6J-1665401648552)(en-resource://database/1084:1)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w3Tmx78v-1665401648553)(en-resource://database/1082:1)]

  • 从 java 程序的用户态切换至内核态,使用 DMA将数据读入内核缓冲区,不会使用 cpu

  • 只会将一些 offset 和 length 信息拷入 socket 缓冲区,几乎无消耗

  • 使用 DMA 将 内核缓冲区的数据写入网卡,不会使用 cpu

  • 综上:
    发生了两次状态切换,2 次 DMA 拷贝、不利用cpu计算、因为取消了缓冲区,所以零拷贝更适合小文件传输(不适合大文件)

    splice 方式

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-a4fx4ESH-1665401648553)(en-resource://database/1088:1)]

    • splice 系统调用可以在内核缓冲区和 socket 缓冲区之间建立管道来传输数据,避免了两者之间的 CPU 拷贝操作。splice 也有一些局限,它的两个文件描述符参数中有一个必须是管道设备

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

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

相关文章

论文/机器学习笔记:SENet (Squeeze-and-Excitation Networks)

Image 2017 挑战赛夺冠paper 1 motivation 希望显式地建模特征通道(channel)之间的相互依赖关系 通过学习的方式来自动获取到每个特征通道的重要程度依照这个重要程度去提升有用的特征并抑制对当前任务用处不大的特征 2 模型 给定一个输入 x&#xff…

利用phpstudy导入mysql文件

1.创建mysql文件 mysql 常用命令: 打开mysql: mysql -u root -p 查看数据库: show databases; 创建 数据库: create database baseName (数据库名称) 使用数据库: use baseName(数据库名称) 显示表:show tables; 创建表&#xff…

C#【高级篇】 IntPtr是什么?怎么用?

C#学习汇总 - 总目录 C#【高级篇】 IntPtr是什么?怎么用?前言一、IntPtr(IntPointer)的由来二、IntPtr(属于结构体)的说明三、IntPtr的使用示例1、int类型与IntPtr类型之间的转换2、string类型与IntPtr之间…

Java collection集合的体系特点

Java collection集合的体系特点 集合类体系结构 collection单列集合,每个元素(数据)只包含一个值。 Map双列集合,每个元素包含两个值(键值对)。 collection集合体系(常见) colle…

位段是什么玩意?你听说过吗??

当我们学完结构体之后,我们就要好好学学结构体实现位段的能力!!! 目录 一、位段是什么? 二、位段的内存分配 三、位段的跨平台问题 总结 一、位段是什么? 位段的声明和结构体大体相同,但是有两…

【Unity_AssetBundle】(二)AB包资源打包、Asset Bundle Browser工具的使用

1.Asset Bundle Browser包安装 Asset Bundle Browser是AB包打包工具较底版本Unity编辑器: Windows——>Package Mannger——>搜索Asset Bundle Browser进行下载导入即可 较高版本Unity编辑器: 高版本Unity在Addressables功能中封装了AB包功能 安…

Telnet、DHCP、静态路由、等价路由、环回接口、浮动静态路由详解

文章目录前言一、Telnet二、DHCP----动态主机配置协议手工配置缺陷报文类型DHCP租期地址池DHCP中继代理路由信息来源直连路由静态路由优先级数据流量是双向的静态路由的扩展配置等价路由环回接口手工汇总路由黑洞缺省路由空接口路由浮动静态路由前言 一、Telnet Telnet是位于…

【数据结构】 归并排序、 基数排序

目录 一、什么是归并排序? 二、归并排序 三、什么是基数排序? 四、基数排序 五、各种排序的比较 一、什么是归并排序? 归并排序是建立在归并操作上的一种有效,稳定的排序算法。是将已有序的子序列合并,得到完全有…

09-Pawn类 UE4 C++

1.首先创建一个C的Pawn类 右键点击Public,选择新建C类 选择Pawn,然后点击下一步 命名后,点击创建 创建完毕,双击打开MyPawn 2.在MyPawn.h中添加如下代码: UPROPERTY(EditAnywhere) class UStaticMeshComponent* Mes…

SpringCloud-31-Spring Cloud Config微服务与配置文件解耦

11.8 微服务与配置文件解耦 我们可以将之前的子模块中的配置提取出来,托管到gitee上统一管理,这样运维人员维护配置文件就不变动子模块了,实现了模块与配置的解耦。 下面用例子来解释下这种做法的好处 在基础工程spring-cloud-microservice…

热血江湖服务端架设开服搭建教程

热血江湖服务端架设开服搭建教程 玩网游比较多的小伙伴,相信对热血江湖这款游戏也不陌生,摆脱了传统武侠游戏阴暗血腥的游戏风格,提倡一种“明朗而愉快的武侠”精神。画面上即不会太随意又不会过于沉重,画面干净清新。活泼可爱的…

ORACLE新增数据库(用户),使用navicate

oracle新增数据库并不像mysql直接指令就行,百度一圈都是用Oracle Database Configuration Assistant的,其实navicate就直接可以新建,以下是新建方法: 1.连接数据库 2.新建表空间 点击navicate上方工具栏中"其它"&…

何为功能平价?特斯拉「抛弃」多传感融合,背后有哪些门道

技术与成本,永远是博弈的两方。 当大部分车企都在寻求通过增加更多、更高性能的传感器(也就是通常所说的多传感融合技术)来强化智能驾驶功能可靠性和拓展性的大背景下,特斯拉依然我行我素,继续沿着纯视觉感知的路线前…

盘点一个Python列表(元素多样)处理的实战题目(使用正则表达式也可以实现)

大家好,我是Python进阶者。 一、前言 前几天在Python白银交流群【凡人不烦人】问了一个Python列表处理的问题,提问截图如下:下面是他的部分数据: lst = [(问答题)(2) 假设镀锌钢管, http://admintk.sc.zzstep.com/UpLoadImage/2019-10-10/a84f340e-6c67-42b1-8eae-3dc14281…

队列的操作实验(数据结构)

队列的操作实验(数据结构) 一、实验目的 1.掌握队列存储结构的表示和实现方法。 2.掌握队列的入队和出队等基本操作的算法实现。 3.了解队列在解决实际问题中的简单应用。 二、实验内容 1.建立顺序循环队列…

【LeetCode】【二叉搜索树迭代器】

173. 二叉搜索树迭代器 实现一个二叉搜索树迭代器类BSTIterator ,表示一个按中序遍历二叉搜索树(BST)的迭代器: BSTIterator(TreeNode root) 初始化 BSTIterator 类的一个对象。BST 的根节点 root 会作为构造函数的一部分给出。指…

【优化充电】基于matlab粒子群算法电动汽车充电动态优化策略【含Matlab源码 2163期】

一、粒子群算法电动汽车充电优化 1 电动汽车充电负荷估算 电动汽车的充电负荷主要与电动汽车起始充电时刻和充电时长相关,而起始充电时刻是由电动汽车用户的到家时间决定的,充电时长主要与电动汽车的行驶里程和充电倍率相关。 目前电动汽车还没有大规模运营, 只能通过统计燃油…

ASP.NET Core微服务(六)——【.Net Core操作redis】StackExchange.Redis

ASP.NET Core微服务(六)——【.Net Core操作redis】StackExchange.Redis 目录 ASP.NET Core微服务(六)——【.Net Core操作redis】StackExchange.Redis 项目创建 StackExchange.Redis操作示例 引包【using StackExchange.Redis;】 ConnectionMultiplexer RedisDBHelper …

Git学习总结

目录: (1)版本控制 (2)Git和SVN的区别 (3)Git历史 (4)安装Git及环境配置 (5)常用的Linux命令 (6)Git的必要配置 &a…

PMO和PM如何实现从战略解码到项目执行的端到端闭环?

一、PMO的使命与职责 PMO的使命是提升端到端组织效能,赋能于精细化管理,成为企业的加速器,保障战略项目的交付。 那么PMO要保障战略的交付,核心职责有哪些呢? 二、组织为什么需要端到端项目管理? 核心价…