【IO】零拷贝、mmap、sendfile

news2025/1/15 6:35:09

文章目录

  • 前言
  • 一、普通IO
  • 二、mmap
  • 三、sendfile
    • 1. Linux2.1的sendfile
    • 2. Linux2.4的sendfile
  • 四、总结与扩展
    • 1. 结论
    • 2. 解释、扩展
  • 参考

前言

概念: 没有发生CPU拷贝数据,都是DMA(直接内存访问)拷贝

优势:

  • 减少内核态与用户态的切换
  • 减少数据复制次数
  • 避免CPU拷贝浪费CPU资源
  • 整个内存空间只有一份数据

一、普通IO

在这里插入图片描述

应用程序想要读取磁盘文件并进行网络发送时,会发生4次上下文切换,4次数据拷贝

  1. 用户态的应用想要读取磁盘文件,会转换到内核态,通过DMA拷贝到内核缓冲区
  2. 内核态的数据通过CPU拷贝到用户态的用户缓冲区
  3. 用户态的用户缓冲区的数据通过CPU拷贝到内核态的Socket缓冲区
  4. 内核态的Socket缓冲区通过DMA拷贝到网络引擎,网络引擎发送结束后需要返回给用户态发送结果

二、mmap

在这里插入图片描述
通过对用户缓冲区和内核缓冲区建立映射,共享一块映射数据,不需要从内核缓冲区拷贝到用户缓冲区,因此:

应用程序想要读取磁盘文件并进行网络发送时,会发生4次上下文切换,3次数据拷贝

三、sendfile

1. Linux2.1的sendfile

在这里插入图片描述
Linux2.1时,提供了sendfile方法,数据直接从内核缓冲区CPU拷贝到Socket缓冲区,和用户态无关,因此:

应用程序想要读取磁盘文件并进行网络发送时,会发生3次上下文切换,3次数据拷贝

2. Linux2.4的sendfile

在这里插入图片描述
Linux2.4时,优化了sendfile方法,数据直接从内核缓冲区通过DMA拷贝到网络引擎,但是需要通过CPU拷贝少量位移信息,因此:
应用程序想要读取磁盘文件并进行网络发送时,会发生3次上下文切换,2次数据拷贝。没有通过CPU拷贝数据

四、总结与扩展

1. 结论

上下文切换次数数据拷贝次数
普通IO42次DMA,2次CPU
mmap42次DMA,1次CPU
Linux2.1版sendfile32次DMA,1次CPU
Linux2.4版sendfile32次DMA

Linux2.4版本的sendfile才真正意义上实现了零拷贝

2. 解释、扩展

知识点联系:
IO-NIO-Netty-【RocketMQ、Dubbo】
sendfile-kafka
mmap-RocketMQ

什么是用户态与内核态。

参考

  • Linux 零拷贝技术-mmap与sendFile
  • 尚硅谷Netty视频33p-零拷贝原理解析

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

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

相关文章

《算经》中的百钱买百鸡问题,你会做吗?试下看看(39)

小朋友们好,大朋友们好! 我是猫妹,一名爱上Python编程的小学生。 欢迎和猫妹一起,趣味学Python。 今日主题 你知道我国历史上有个王朝叫北魏吗? 北魏(386年—534年),南北朝时期北…

HashMap 简述

文章目录 前言一、HashMap的数据结构二、HashMap存储数据的大致过程1 哈希值2 什么是哈希冲突?3 为何有两种数据结构? 三、HashMap常用知识总结 前言 HashMap 是开发中常用的一种数据结构,通常用做返回值,计算比对等,会经常用到; 一、HashMap的数据结构 jdk8之后,数据结构是…

时至今日,Pascal系列Turbo Pascal 5.0依旧是我心中永远的神

从DOS时代到Windows时代,从桌面应用到Web应用,每一个时代都有它特定的编程工具 在我看来,DOS时代的编程语言,Pascal必占一席之地。 尤其是Turbo Pascal系列的最后一个版本——Turbo Pascal 5.0,更是我心目中永不褪色的…

nginx企业级高性能配置优化

一、基础配置优化 1、CPU亲和性优化 1.1、推荐直接将配置项设置成auto (worker_cpu_affinity),即采用了Nginx推荐的CPU绑核策略方式。 1.2、手动绑定,将worker线程数量与CPU核心数一一绑定方式设置,设置成auto Nginx会自动识别并按照推荐策略…

New Bing 全面开放?我看未必

前段时间大家应该都被ChatGPT刷屏了,其实就回答来说New Bing 才是最厉害的,因为它底层使用了ChatGPT 并且可以支持联网查询数据,回答中还能支持看到出处,方便确认其真实性。 New Bing 是微软基于 OpenAI ChatGPT 技术开发的新一代…

vue3项目搭建

一、安装 vue3.0 脚手架 (1)node安装(前端开发环境) 打开node官网:https://nodejs.org/zh-cn/ 下载node并安装(安装vue3建议node在10.0版本以上)。 输入node -v可显示node版本 (2)…

使用思维链(Chain-of-thoughts)提示在大型语言模型中引出推理

语言模型(LM)在NLP领域的发展速度非常快,特别是在大型语言模型(LLM)方面:当语言模型具有大量参数或权重/系数时,它们被称为“大型”。这些“大型”语言模型拥有处理和理解大量自然语言数据的能力。 LLM被用于一系列自然语言任务,…

【Java EE】-Servlet(三) MessageWall

作者:学Java的冬瓜 博客主页:☀冬瓜的主页🌙 专栏:【JavaEE】 分享: 寂寞会发慌,孤独是饱满的。——史铁生《命若琴弦》 主要内容:前后端交互接口协商,约定好,使用什么数据格式传输&…

变现 起航篇! 手把手交你用chatgpt快速生成视频!

Chatgpt 很多同学都用的非常熟练了,但是都停留在文字阶段,有没有更好玩的用法,可以深度的利用chatgpt做一些事情呢? 今天菜哥就找一个方法可以快速利用chatgpt制作视频,整个过程大概3分钟,非常有趣&#xf…

浪涌保护器的工作类型及其应用

所有电路系统中的电气设备都需要浪涌保护器的保护支持。这主要取决于器件的内部电路如何能够处理电压波动。如果器件出现输入电压波动,则会导致器件损坏,因为电源电压的波动可能对器件有害。在本文中,我们将了解什么是浪涌保护器,…

【源码+个人总结】Spring 的 三级缓存 解决 循环依赖

Spring可以通过以下方法来避免循环依赖: 构造函数注入:使用构造函数注入来注入依赖项,这是一种比较安全的方式,因为在对象创建时就会注入依赖项,可以避免循环依赖。 Setter方法注入:使用Setter方法注入依赖…

云开发谁是卧底线下小游戏发牌助手微信小程序源码

源码下载:https://download.csdn.net/download/m0_66047725/87614365 云开发谁是卧底线下小游戏源码,发牌助手微信小程序源码。 “谁是卧底OL”是一个非常有趣,风靡全国的比拼语言表述能力、知识面与想象力的游戏。 谁是卧底OL是一款由开发…

Notepad++下载安装NppFTP插件

文章目录 一、Notepad内下载安装NppFTP插件1.打开Notepad——插件——插件管理2.找到NppFTP插件——点击安装3.安装完成 二、直接下载安装NppFTP插件1.网盘下载2.将下载好的NppFTP插件放入到Notepad\plugins的插件目录下3.重启Notepad 三、Notepad下载总结 一、Notepad内下载安…

【刷题】142. 环形链表 II

142. 环形链表 II 一、题目描述二、示例三、实现3.1 方法13.2 方法2 142. 环形链表 II 一、题目描述 给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 如果链表中有某个节点,可以通过连续跟踪 nex…

前端学习 - 淼哥学Vue

如何判断数据是否受Vue管理,数据(对象,数组,字符串等)能否响应式更新? 即查看数据是否有对应get/set方法,数组没有对应get/set方法,故操作数组要通过其封装好的变更方法 变更方法 …

js高级知识汇总一

目录 1.怎么理解闭包? 2.闭包的作用? 3.闭包可能引起的问题? 4.变量提升 5.函数动态参数 6.剩余参数 ...(实际开发中提倡使用) 7.展开运算符 8.箭头函数 9.解构赋值(数组、对象) 10 创…

一文总结动态规划

动态规划 一、背包问题1 问题定义2 问题分类3 解题模板01背包最值问题剩余背包问题 4 例题分析LeetCode1049.最后一块石头的重量II 二、区间动态规划1 解题模板2 例题分析牛客.石子合并 总结与分析 一、背包问题 1 问题定义 如何确定一个题目是否可以用背包问题解决 背包问题…

给儿童使用护眼台灯怎么样选择更好?专家建议孩子买台灯

随着娃越长越大,虽然还在读幼儿园,但平时免不了要写写画画,之前一直在这个桌子上,台灯是一个赠送的LED货色,那个频闪啊,于是趁着当地商场活动先入了张学习桌椅,至于台灯嘛当然要选个好的了&…

21财经专访徐亚波博士:AI恒纪元时代,数说故事踏浪新征途

21世纪经济报道【创业投资】栏目,一直致力于寻找中国最有生命力和创造力的快速成长公司,探秘其背后的新兴资本推动力。为此,数说故事创始人兼CEO徐亚波博士接受了21世纪经济报道的专访。 近年来,大数据产业已经成为推动数字经济发…

【C语言】都玩过三子棋游戏把,但你知道怎么用C语言实现三子棋游戏吗?让我来手把手教你。

三子棋游戏 1.前言2.功能分析2.1主函数设计及菜单设计2.2打印棋盘与棋盘初始化2.3玩家下棋2.4电脑下棋2.5判断输赢 3.game.h头文件展示4.text.c源文件文件展示5.game.c源文件文件展示 所属专栏:C语言 博主首页:初阳785 代码托管:chuyang785 感…