零拷贝技术
一、应用场景
- 内核优化:快速上传/下载文件(fileChannel至socketChannel)
- 内核优化:快速拷贝文件(fileChannel至fileChannel)
二、产生原因
- 上传/下载文件:传统网络传输文件时,数据需要经过4次数据拷贝,分别为网卡到内核缓存、内核到用户缓存、用户到内核缓存、内核到磁盘,频繁切换用户态和内核态;
- 拷贝文件:传统传输文件时,数据需要经过4次数据拷贝,分别为磁盘到内核缓存、内核到用户缓存、用户到内核缓存、内核到磁盘,频繁切换用户态和内核态;
三、解决方案
-
零拷贝技术(初级版):解决内核和用户态间缓存数据拷贝和用户态切换
// 解决内核和用户态间缓存数据拷贝和用户态切换 import java.nio.channels.FileChannel; import java.nio.channels.SocketChannel; // 省略代码 File file = new File(""); FileChannel fileChannel = new FileInputStream(file).getChannel(); SocketChannel socketChannel = socket.getChannel(); // 数据经过3次数据拷贝、0用户态切换 // 网卡到内核缓存、文件内核缓存到socket内核缓存、socket内核缓存到磁盘 fileChannel.transferTo(0L, file.length(), socketChannel);
-
零拷贝技术(升级版):scatter/gather解决初级班基础上,内核缓存间拷贝和内核发起的系统中断问题
// 解决初级版基础上,内核缓存间拷贝问题 ByteBuffer header = ByteBuffer.allocate(128); ByteBuffer body = ByteBuffer.allocate(1024); ByteBuffer[] byteBuffer = {header, body}; // scatter分散数据 fileChannel.read(byteBuffer); // gather重新聚集写入数据 socketChannel.write(byteBuffer);
-
Kafka使用零拷贝技术(初级版)
// 文件零拷贝 // 数据经过3次数据拷贝、0用户态切换 // 网卡到内核缓存、文件内核缓存到socket内核缓存、socket内核缓存到磁盘 fileChannel.transferTo(0L, file.length(), socketChannel);
四、参数
参数 | 作用和优点 | 缺点 |
---|---|---|
InputStream/OutputStream | 数据流:磁盘、内核、用户、内核、磁盘 优点:实现简单 |
1、4次拷贝、4次内核切换 2、阻塞 |
fileChannel.transferFrom/transferTo | 数据流:磁盘、内核、内核、磁盘 优点:减少拷贝、内核切换次数 |
1、3次拷贝、0次内核切换 2、伪零拷贝(内核到内核) |
scatter/gather | 数据流:磁盘、内核、磁盘 优点:减少拷贝、内核切换次数 |
1、2次拷贝、0次内核切换 2、传输时不能更改数据 3、真零拷贝 |
本文来自博客园,作者:SArtOnline,转载请注明原文链接:https://www.cnblogs.com/sartonline/p/16195548.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!