零拷贝技术
背景
磁盘可以说是计算机系统重最慢的硬件之一,读写速度相对内存10以上,所以针对优化磁盘的技术非常的多,比如:零拷贝、直接I/O、异步I/O等等,这些优化的目的就是为了提高系统的吞吐量,另外操作系统内核中的磁盘高速缓存区,也可以有效的减少磁盘的访问次数。
传统的数据传输方式
如果服务端提供数据传输功能,传统方式:将文件从磁盘上读取出来,然后通过网络协议写入,发送给客户端。
read(file, tmp_buf, len);
write(socket, tmp_buf, len);
其中涉及到的内部流程如下:

- 第一次拷贝(DMA拷贝):把数据从磁盘上拷贝到操作系统内核缓冲区。
- 第二次拷贝(CPU拷贝):把内核缓冲区的数据拷贝到用户缓冲区,此时我们的程序就可以使用读到的数据
- 第三次拷贝(CPU拷贝):把用户缓冲区的数据再拷贝到内核的socket缓冲区(套接字缓冲区)。
- 第四次拷贝(DMA拷贝):把内核的socket缓冲区数据拷贝到网卡缓冲区中。
零拷贝方式

- 第一次拷贝(DMA拷贝):通过DMA技术将磁盘数据拷贝到内核缓冲区中。
- 第二次拷贝(DMA拷贝):内核缓冲区的“描述符”+“长度”传到socket缓冲区,然后SG-DMA控制器可直接将内核缓冲区中的数据拷贝到网卡中。此过程不需要将内核缓冲区中的数据拷贝到socket缓冲区中,这样减少了一次数据拷贝。
总结
零拷贝技术相对于传统文件传输,减少了2次上下文切换、2次CPU拷贝,最终只用2次上下文切换和2次DMA拷贝,不经过CPU拷贝。
扩展
内核缓冲区实际上是磁盘高速缓存(PageCache),通常刚被访问的数据段时间内再次被访问的概率很高,于是我们可以用PageCache来缓存最近被访问的数据,,当空间不足时淘汰最久未被访问的缓存,所以读磁盘数据的时候,优先在PageCache中找,如果有就返回,没有则从磁盘读取,然后缓存在PageCache中。PageCache也具备预读功能。
例:假设read方法每次读取32kb字节,虽然read刚开始只读0~32kb的字节,但是内核会将后面的32~64KB也读取到PageCache,这样读取后面32~64kb的时候,如果在32~64kb数据被淘汰出PageCache前,进程读取到它了,此时速度就很快。
相关文章:
零拷贝技术
背景 磁盘可以说是计算机系统重最慢的硬件之一,读写速度相对内存10以上,所以针对优化磁盘的技术非常的多,比如:零拷贝、直接I/O、异步I/O等等,这些优化的目的就是为了提高系统的吞吐量,另外操作系统内核中的…...
Flutter_Android上架GooglePlay_问题
上架GooglePlay权限问题 问题描述 REQUEST_INSTALL_PACKAGES 权限问题解决方式 方式1 找到所有使用该权限的库修改删除该权限引用 方式2 打开项目 ~/andoird/app/src/main/AndroidMainfest.xml 添加文本<uses-permission android:name"android.permission.REQUES…...
【Java】解决Java报错:NumberFormatException
文章目录 引言1. 错误详解2. 常见的出错场景2.1 字符串包含非数字字符2.2 空字符串或 null 字符串2.3 数值超出范围 3. 解决方案3.1 验证字符串格式3.2 使用异常处理3.3 处理空字符串和 null 4. 预防措施4.1 数据验证4.2 编写防御性代码4.3 单元测试 结语 引言 在Java编程中&a…...
视觉大模型(VLLM)学习笔记
视觉多模态大模型(VLLM) InternVL 1.5 近日,上海人工智能实验室 OpenGVLab 团队、清华大学、商汤科技合作推出了开源多模态大语言模型项目InternVL 1.5,它不仅挑战了商业模型巨头例如 GPT-4V 的霸主地位,还让我们不禁…...
【软考的系统分析师的考题考点解析2025】
2024-2025系统分析师考试(简称软考)是计算机技术与软件专业技术资格(水平)考试中的高级资格考试,主要考察考生在系统分析、系统设计、项目管理等方面的知识和技能。以下是软考系统分析师的常见考点、考题和重点&#x…...
JavaScript前端技术入门教程
引言 在前端开发的广阔天地中,JavaScript无疑是最耀眼的一颗明星。它赋予了网页动态交互的能力,让网页从静态的文本和图片展示,进化为可以与用户进行实时交互的丰富应用。本文将带您走进JavaScript的世界,为您提供一个入门级的教…...
类和对象(上续)
前言:本文介绍类和对象中的一些比较重要的知识点,为以后的继续学习打好基础。 目录 拷贝构造 拷贝构造的特征: 自定义类型的传值传参 自定义类型在函数中的传值返回 如果返回值时自定义的引用呢? 在什么情况下使用呢&#…...
【C++初阶学习】第十三弹——优先级队列及容器适配器
C语言栈:数据结构——栈(C语言版)-CSDN博客 C语言队列:数据结构——队列(C语言版)-CSDN博客 C栈与队列:【C初阶学习】第十二弹——stack和queue的介绍和使用-CSDN博客 前言: 在前面,我们已经…...
Java(十七)---ArrayList的使用
文章目录 前言1.ArrayList的简介2. ArrayList使用2.1.ArrayList的构造2.2.ArrayList的扩容机制(JDK17) 3.ArrayList的常见操作4. ArrayList的具体使用4.1.[杨辉三角](https://leetcode.cn/problems/pascals-triangle/description/)4.2.简单的洗牌游戏 5.ArrayList的问题及思考 …...
实验六、IPv4 地址的子网划分,第 2 部分《计算机网络》
你有没有发现,困的时候真的清醒不了。 目录 一、实验目的 二、实验内容 三、实验小结 一、实验目的 完成本练习之后,您应该能够确定给定 IP 地址和子网掩码的子网信息。 知道 IP 地址、网络掩码和子网掩码后,您应该能够确定有关该 IP 地…...
定个小目标之刷LeetCode热题(12)
这是一道简单题,使用位运算中的异或运算即可,异或运算有以下性质: 1、任何数异或 0 结果仍然是原来的数,即 a⊕0a 2、任何数和其自身做异或运算,结果是 0 所以我们只需要让数组里的所有元素进行异或运算得到的结果就…...
MYSQL内存占用查询语句
可以通过以下 SQL 语句查询相关配置参数的当前值: InnoDB 缓冲池大小 (innodb_buffer_pool_size): SHOW VARIABLES LIKE innodb_buffer_pool_size;最大连接数 (max_connections): SHOW VARIABLES LIKE max_connections;临时表大小 (tmp_table…...
HikariCP连接池初识
HikariCP的简单介绍 hikari-光,hikariCP取义:像光一样轻和快的Connetion Pool。这个几乎只用java写的中间件连接池,极其轻量并注重性能,HikariCP目前已是SpringBoot默认的连接池,伴随着SpringBoot和微服务的普及&…...
LeetCode136只出现一次的数字
题目描述 给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。 解析 需要想到异或运算&#…...
html5实现端午节网站源码
文章目录 1.设计来源1.1 端午首页页面1.2 端午由来页面1.3 端午图集页面1.4 端午活动页面1.5 给我留言页面 2.效果和源码2.1 动态效果2.2 目录结构 源码下载 作者:xcLeigh 文章地址:https://blog.csdn.net/weixin_43151418/article/details/139524377 ht…...
echarts组件x轴坐标显示不全解决方法
1.旋转: 修改前: option {xAxis: {type: category,data: [Mon, Tue, Wed, Thu, Fri, Sat, Sun,Mon, Tue, Wed, Thu, Fri, Sat, Sun,Mon, Tue, Wed, Thu, Fri, Sat, Sun]},yAxis: {type: value},series: [{data: [120, 200, 150, 80, 70, 110, 130,120, 200, 150, 80, 70, 1…...
JS实现移动端的轮播图滑动事件
在移动端实现轮播图滑动事件,我们通常使用 touchstart、touchmove 和 touchend 这三个事件。下面是一个基本的示例,展示了如何使用原生JavaScript来创建一个简单的移动端轮播图滑动效果: HTML结构: <div id"carousel&qu…...
2024.6.10学习记录
1、代码随想录二刷 2、项目难点 review 3、计组复习...
RapidJSON
要在项目中使用 RapidJSON 库,需要首先下载并包含该库的头文件。以下是详细的步骤,包括如何下载、引用和使用 RapidJSON: 使用 CMake 引用 RapidJSON 如果你的项目使用 CMake 构建系统,可以按照以下步骤引用 RapidJSONÿ…...
二叉树的创建
目录 一、二叉树的定义 二、代码定义 三、遍历二叉树 1、前序遍历 2、中序遍历 3、后序遍历 四、方法的使用 一、二叉树的定义 二叉树(binary tree)是指树中节点的度不大于2的有序树,它是一种最简单且最重要的树。二叉树的递归定义为&a…...
AvrLib-fork:面向AVR的C++14零开销硬件抽象库
1. 项目概述AvrLib-fork 是一个面向 AVR 微控制器平台的高度类型安全、现代 C(C14 兼容)嵌入式库,专为 PlatformIO 生态系统深度优化设计。它并非 Arduino Core 的简单封装,而是一套从底层硬件抽象出发、以零开销抽象(…...
C#搞CV别再跪了!OpenCVSharp的SIFT/SURF实现:我熬3夜踩5个坑,吐血整理保姆级代码
🌪️ 一、先泼冰水:SIFT/SURF的“专利坟场”,别往里跳!(血泪预警) ⚠️ 重点敲黑板: SURF已凉透:OpenCV 4.5.0 彻底移除!别再搜“怎么用SURF”,纯属浪费生命&…...
逆向工程实战:从V8引擎角度破解JavaScript无限debugger(保姆级教程)
V8引擎深度解析:JavaScript调试机制与安全实践 在JavaScript开发领域,调试器(debugger)是开发者日常工作中不可或缺的工具。作为Chrome浏览器和Node.js的核心引擎,V8对debugger关键字的处理机制直接影响着开发者的调试体验。本文将深入探讨V8…...
开源STK插件模块大全:提升你的空天地一体化仿真效率
开源STK插件模块大全:提升空天地一体化仿真效率的实战指南 如果你已经熟悉STK的基础操作,却还在为复杂的星座仿真流程和有限的分析功能而头疼,那么开源插件模块将成为你的效率倍增器。本文将带你深入探索那些被专业用户私藏的工具箱ÿ…...
基于动态三维环境下的Q-Learning算法无人机自主避障路径规划研究(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
3步掌握开源卡牌编辑器:批量制作桌游卡牌的终极指南
3步掌握开源卡牌编辑器:批量制作桌游卡牌的终极指南 【免费下载链接】CardEditor 一款专为桌游设计师开发的批处理数值填入卡牌生成器/A card batch generator specially developed for board game designers 项目地址: https://gitcode.com/gh_mirrors/ca/CardEd…...
PyTorch 2.8镜像实战案例:自媒体创作者批量生成短视频封面图工作流
PyTorch 2.8镜像实战案例:自媒体创作者批量生成短视频封面图工作流 1. 场景痛点与解决方案 短视频创作者每天面临的最大挑战之一,就是需要为每个视频制作吸引眼球的封面图。传统方式要么依赖设计师(成本高、周期长),…...
终极指南:Jellyfin豆瓣插件完整配置手册,30分钟打造中文媒体库
终极指南:Jellyfin豆瓣插件完整配置手册,30分钟打造中文媒体库 【免费下载链接】jellyfin-plugin-douban Douban metadata provider for Jellyfin 项目地址: https://gitcode.com/gh_mirrors/je/jellyfin-plugin-douban 还在为Jellyfin媒体库缺少…...
网易云音乐无损音乐下载器:5分钟搞定你的私人音乐库终极方案
网易云音乐无损音乐下载器:5分钟搞定你的私人音乐库终极方案 【免费下载链接】NeteaseCloudMusicFlac 根据网易云音乐的歌单, 下载flac无损音乐到本地.。 项目地址: https://gitcode.com/gh_mirrors/nete/NeteaseCloudMusicFlac 还在为网易云音乐的无损音乐无…...
Comsol 模拟地下水井抽采与回灌:不同工况下的奇妙之旅
comsol地下水井抽采与回灌,井运行时间不连续,分粗沙,细沙以及粘土三种工况最近在研究地下水相关课题,用到 Comsol 模拟井抽采与回灌过程,发现其中不连续运行时间以及不同地质工况设置还挺有意思,今儿个来跟…...
