什么是零拷贝以及其应用场景是什么?
写在前面
本文看下什么是零拷贝,以及其具体的应用场景有哪些。
1:什么是零拷贝
想要解释清楚什么是零拷贝,需要先来看下常规的阻塞io一次io的过程,这里以从文件读取内容然后写到socket为例来看下,如下:
1:发起read调用,发生一次上下文切换,从用户态转换为内核态
2:内核拷贝数据到pagecahe
3:发生一次上下文切换,内核态转换为用户态,用户进程将数据拷贝到用户缓冲区
4:发生一次上下文切换,用户态转换为内核态,内核将数据拷贝socket缓冲区
5:内核将数据拷贝到网卡
pagecache是磁盘数据的缓冲区,用来在一定程度上缓解磁盘速度和内存速度的差异,起到预读,缓存作用。
可以参考下下图:

这里可能的性能瓶颈如下:
1:上下文切换
2:数据拷贝
所以我们如果是能够尽量上下文切换的次数,以及数据拷贝的次数,就能对性能有比较好的提升了。首先数据拷贝到用户缓冲区这一步,其实是完全没有必要的,因为应用程序只是捣一手而已,所以如果是可以少了这个步骤,那么数据拷贝到用户缓冲区和其之前的上下文切换,以及之后的从用户缓冲区拷贝数据到socket缓冲区以及对应的上下文切换就可以避免了,也就是如下的部分:

此时,就要需要将数据从pagecache拷贝到socket缓冲区,因此还需要引入额外的一次数据拷贝,但以少两次上下文切换,两次数据拷贝为收益还是比较值得的。整个过程就变为下图:

黄色框就是新机制额外引入的一次数据拷贝了。
其实,还可以继续优化,如果是应用程序直接告知数据要写到那个socket(这个当然很容易做到),那么就可以直接将数据从pagecache拷贝到网卡,那么新引入的这次拷贝也可以被干掉,并且从socket缓冲区拷贝到网卡这步也可以被干掉了,就变为下图这样的过程:

这其实就是零拷贝了,所以很难给零拷贝下一个准确的定义。但我觉得可以这样来描述:通过技术手段尽量的减少上下文切换和拷贝次数的io方式叫做零拷贝。
2:零拷贝使用的场景
在前面的分析中零拷贝需要依赖于pagecache,而这也决定了零拷贝使用的场景,所以,我们首先要来看下pagecache的作用是什么。pagecache最大的作用是预读,什么意思呢?假定你要读取15k的内容,但是内核会假定你很快读取接下来的15k内容,那么就会直接读取30k的内容,这样接下来的15k内容就不需要读磁盘了,还有一点就是“时间局部性”原理,即刚被读过的数据,被再次读取的概率很高,所以此时pagecache起到了缓存数据的作用。而pagecache的大小是很有限的,所以大文件的读取pagecache是无法发挥它的威力的,甚至会拖后腿,所以,零拷贝的应用场景是小文件的读取。
如果是读取大文件会怎么样呢?就会导致pagecache长时间被占满,并且无法发挥其作用,导致其他小文件的读取也无法享受到pagecache的好处。
所以,如果你的场景中是小文件的读取,或者是小文件频繁的读取可以优先考虑使用零拷贝。
3:jdk对零拷贝的支持
在javaNIO中提供了对零拷贝的支持,依赖于方法java.nio.channels.FileChannel.transferTo:
public abstract long transferTo(long position, long count,WritableByteChannel target)throws IOException;
使用实例:
package org.example;//import lombok.extern.slf4j.Slf4j;
//
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;public class TestByteBufferTransferTO {public static void main(String[] args) {long startTime = System.currentTimeMillis();try (FileChannel from = new FileInputStream("d:\\test\\CentOS-7-x86_64-Minimal-2207-02.iso").getChannel();FileChannel to = new FileOutputStream("centos" + System.currentTimeMillis() + ".iso").getChannel()) {long size = from.size();for (long left = size; left > 0; ) {
// log.info("position:{},left:{}", size - left, left);System.out.println("position:{},left:{}" + (size - left) + left);left -= from.transferTo((size - left), left, to);}} catch (IOException e) {
// log.debug("e:{}", e);} finally {// 零拷贝耗时:18679System.out.println("零拷贝耗时:" + (System.currentTimeMillis() - startTime));}}
}
运行:

4:netty对零拷贝的支持
直接包装了jdk的零拷贝,如下:

写在后面
参考文章列表
04 | 零拷贝:如何高效地传输文件?。
零拷贝原理的文章网上满天飞,但你知道如何使用零拷贝吗?。
相关文章:
什么是零拷贝以及其应用场景是什么?
写在前面 本文看下什么是零拷贝,以及其具体的应用场景有哪些。 1:什么是零拷贝 想要解释清楚什么是零拷贝,需要先来看下常规的阻塞io一次io的过程,这里以从文件读取内容然后写到socket为例来看下,如下: …...
开源(open source)是什么?为什么要开源?
为什么开源这个问题挺复杂,这里就从社会面以及个人两个角度来说。当然个人层面的开源其实是建立在社会面形成开源氛围后开始的。 社会面开源 这里举一个例子,既互联网从 web1.0 到 web3.0 (开源 → 闭源 → 再开源)的历程&#…...
基于Spring Boot的论坛网站:从零到部署
2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统,它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等,非常…...
vue开发的一个小插件vue.js devtools
可打开谷歌商城的情况下,不可打开的可以到极简插件里面去下载 极简插件官网_Chrome插件下载_Chrome浏览器应用商店 搜索vue即可...
GraphLLM:基于图的框架,通过大型语言模型处理数据
GraphLLM是一个创新的框架,它允许用户通过一个或多个大型语言模型(LLM)来处理数据。这个框架不仅提供了一个强大的代理,能够执行网络搜索和运行Python代码,还提供了一套工具来抓取网页数据,并将其重新格式化…...
HarmonyOS 5.0应用开发——Navigation实现页面路由
【高心星出品】 Navigation实现页面路由 Navigation:路由导航的根视图容器,一般作为页面(Entry)的根容器去使用,包括单页面(stack)、分栏(split)和自适应(a…...
物联网行业应用实训室建设方案
一、建设背景 随着物联网技术的迅猛发展和广泛应用,物联网产业已跃升为新时代的经济增长引擎,对于产业升级和社会信息化水平的提升具有举足轻重的地位。因此,为了满足这一领域的迫切需求,培养具备物联网技术应用能力的优秀人才成…...
SOLIDWORKS 2025更灵活零件建模
SOLIDWORKS 2025更灵活零件建模 北京众联亿诚是达索官方授权的SOLIDWORKS经销商,专业经销SOLIDWORKS正版软件并提供免费试用、培训认证、二次开发等增值服务。 在工程设计领域,SOLIDWORKS作为一款功能强大的三维CAD软件,一直以其优越的性能…...
智能巡检机器人的大模型训练
随着工业自动化和智能化进程的不断加快,智能巡检机器人已成为维护和管理复杂设备的重要工具。在电力、石油化工、煤矿、数据中心等行业中,智能巡检机器人通过自主巡检、故障检测等功能,提高了设备管理的效率和安全性。大模型训练在智能巡检机…...
RabbitMQ系列学习笔记(九)--路由模式
文章目录 一、路由模式原理二、多重绑定三、路由模式实战1、消费者代码2、生产者代码3、运行结果分析 本文参考 尚硅谷RabbitMQ教程丨快速掌握MQ消息中间件rabbitmq RabbitMQ 详解 Centos7环境安装Erlang、RabbitMQ详细过程(配图) 一、路由模式原理 使用发布订阅模式时&#x…...
[OS] pthreads-1
线程的基本概念 线程是进程中的一个单一的执行流。一个进程可以包含多个线程,这些线程共享进程中的资源,并且在相同的地址空间中执行。多线程是提高应用程序并行性的流行方法。例如,在浏览器中,不同的标签页可以视作独立的线程。…...
ThreeJS入门(137):THREE.StringKeyframeTrack 知识详解,示例代码
作者: 还是大剑师兰特 ,曾为美国某知名大学计算机专业研究生,现为国内GIS领域高级前端工程师,CSDN知名博主,深耕openlayers、leaflet、mapbox、cesium,webgl,ThreeJS,canvas…...
用大模型或者向量模型比如huggingface上的模型,处理一批图片,对该图片进行分类,检索
要使用大模型或向量模型对图片进行分类和检索,通常可以采用以下几种方法: 1. **图像分类**:使用预训练的图像分类模型(如ResNet、EfficientNet等)对图片进行分类。 2. **图像特征提取**:使用预训练的模型(如CLIP、ResNet等)提取图像的特征向量,然后进行相似度检索。 …...
Mac 使用 zsh 终端提示 zsh: killed 的问题
我的脚本的内容为: #!/bin/bashset -epids$(ps -ef | grep consul | grep -v grep | awk {print $2})for pid in $pids; doecho "kill process: $pid"kill -9 $pid donecd $(dirname $0)nohup ./consul agent -dev > nohup.log &可以看到这是一个…...
数字后端零基础入门系列 | Innovus零基础LAB学习Day6
今天没有具体的数字IC后端lab实验。今天的重点是熟悉掌握静态时序分析STA中的几类timing path以及setup和hold检查机制(包含setup和hold计算公式)。 芯片流片失败的那些故事 数字后端零基础入门系列 | Innovus零基础LAB学习Day5 等大家把今天内容学习…...
(Linux驱动学习 -13).SPI驱动实验
目录 一.SPI驱动相关结构体与函数 1.struct spi_master 结构体 2.申请 spi_master - spi_alloc_master 3.释放 spi_master - spi_master_put 4.向内核注册 spi_master - spi_register_master 5.注销掉 spi_master 6.struct spi_driver 结构体 7.向内核注册 spi_driver -…...
Angular 框架入门教程:从安装到路由、服务与状态管理详解
一、引言 在前端开发领域,Angular 是一个强大且流行的框架。它由 Google 维护,基于 TypeScript,采用模块化设计,提供了组件化开发、依赖注入、路由、表单处理等丰富功能,旨在帮助开发者构建高效、可维护的单页应用程序…...
【华为HCIP实战课程十八】OSPF的外部路由类型,网络工程师
一、外部路由类型: 上节讲的外部路由类型,无关乎COST大小,OSPF外部路由类型1优先于外部路由类型2 二、转发地址实验拓扑 我们再SW3/R5/R6三台设备运行RIP,SW3即运行RIP又运行OSPF SW3配置rip [SW3-rip-1]ver 2 [SW3-rip-1]network 10.0.0.0 AR5去掉ospf配置和AR6配置rip…...
oss 简单命令(已亲测)
1、 服务器本地文件复制到OSS指定目录 ./ossutil cp -r /opt/post/afc/afcServer/afcenter/logs/ oss://oss-name/ScBak/20230608/ -c /opt/post/ossconfig 2、在oss服务器上创建文件夹 ./ossutil mkdir oss://oss-name/ScBak/20230608/dam -c /opt/post/ossconfig 3、查…...
申请https证书
引入证书: 当服务器使用HTTPS之前都会申请一份证书,证书是为了证明服务端公钥的权威性,服务器向浏览器传输证书,浏览器再从证书里获取公钥,证书明文数据签名。 如何理解CA签发证书的过程 a.CA会有自己的公钥 和 私钥ÿ…...
从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...
【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...
多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...
均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...
Kafka入门-生产者
生产者 生产者发送流程: 延迟时间为0ms时,也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于:异步发送不需要等待结果,同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...
省略号和可变参数模板
本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...
c# 局部函数 定义、功能与示例
C# 局部函数:定义、功能与示例 1. 定义与功能 局部函数(Local Function)是嵌套在另一个方法内部的私有方法,仅在包含它的方法内可见。 • 作用:封装仅用于当前方法的逻辑,避免污染类作用域,提升…...
EasyRTC音视频实时通话功能在WebRTC与智能硬件整合中的应用与优势
一、WebRTC与智能硬件整合趋势 随着物联网和实时通信需求的爆发式增长,WebRTC作为开源实时通信技术,为浏览器与移动应用提供免插件的音视频通信能力,在智能硬件领域的融合应用已成必然趋势。智能硬件不再局限于单一功能,对实时…...
