当前位置:网站首页>网络文件传输之零拷贝
网络文件传输之零拷贝
2022-07-26 01:07:00 【局外人Inside】
一、传统文件传输
传统文件传输的操作流程如下所示:
- 首先调用Java中的file.read方法,由于Java的IO流并不具备IO读写能力,所以此时会先从用户态切换至内核态(Kernel),利用内核的能力去读取磁盘中的文件并将数据存放在内核缓冲区中,在这个期间用户线程会阻塞住。(内核使用DMA(Direct Memory Access 直接内存访问)来进行文件读,期间不会使用CPU);
- 从内核态切换为用户态,将数据从内核缓冲区读取至用户缓冲区(buffer),期间CPU参与拷贝;
- 调用file.write方法,将数据从用户缓冲区写至socket缓冲区,CPU参与拷贝;
- 此时需要从socket缓冲区向网卡写数据,用户态不具备该能力,所以需要重新切换至内核态,调用内核的写能力,使用DMA将数据从socket缓冲区写至网卡,不需要CPU,文件拷贝完成。
可以看到上面文件的读写表层虽然是利用了Java的API,但Java的API实际不是物理设备级别的读写,只是缓存层次的复制,底层的读写其实是内核来完成的,在此期间,文件数据被复制了4次,用户态与内核态之间切换了三次(重量级操作),都很消耗性能。
二、优化V1.0
NIO优化后的流程如下:

NIO通过directByteBuffer来优化文件传输,directByteBuffer由ByteBuffer.allocateDirect()分配得到,是一块操作系统内存和jvm内存映射的内存空间,相当于jvm能够直接操作操作系统内存,也就少了在读取数据时由内核缓冲区拷贝至用户缓冲区的过程,因为现在这两块内存实际上是相互映射的同一块内存,并且这块内存不受JVM垃圾回收的影响,内存地址固定,有利于IO读写。
Java中的directByteBuffer对象仅仅维护了此内存对象的虚引用,内存回收分为两步:
- directByteBuffer对象被回收,虚引用加入到引用队列;
- 通过专用线程访问引用队列,释放虚引用对应的堆外内存。
三、优化V2.0
在2.0版本,NIO应用Linux2.1后提供的sendFile方法做了进一步优化,Java中体现在两个channel调用transferTo/transferFrom方法上:

相较原版传输,Java首先调用transferTo方法,此时用户态切换为内核态,使用DMA将文件数据读入内核缓冲区,不使用CPU;然后利用CPU将数据由内核缓冲区拷贝至socket缓冲区;最终使用DMA将数据由socket缓冲区拷贝至网卡。整个传输过程中只发生了一次用户态到内核态的切换,且文件只拷贝了三次。
四、优化V3.0
在linux2.4之后对transferTo/transferFrom方法底层做了进一步优化,如图:

相较原版传输:Java首先调用transferTo方法,此时用户态切换为内核态,使用DMA将文件数据读入内核缓冲区,不使用CPU;然后利用CPU将一些offset和length信息拷贝至socket缓存区,几乎无消耗;最终使用DMA将数据从内核缓冲区拷贝至网卡。整个传输过程中只发生了一次用户态到内核态的切换,数据只拷贝了两次,也就是所谓的零拷贝(注意零拷贝其实并不是真正的不拷贝,而是只将数据很小的offset和length信息进行拷贝,不会拷贝重复数据在jvm内存中)。
零拷贝优点:内核态与用户态之间切换次数少;不利用CPU计算和拷贝文件,减少CPU缓存伪共享;适合小文件传输。
边栏推荐
- “元气可乐”不是终点,“中国可乐”才是
- Centrosymmetric binary mode cslbp, matlab
- Embedded development: tips and tricks -- seven tips for designing powerful boot loader
- IP地址能精确到哪步?动态IP及静态IP是什么?切换IP最常用的方法
- 【RTOS训练营】作业讲解、队列和环形缓冲区、队列——传输数据、队列——同步任务和晚课提问
- 健身房一年关店8000家,逆势盈利的工作室是怎么开的?
- 动态IP地址是什么?为什么大家会推荐用动态ip代理?
- Subarray with 19 and K
- 【RTOS训练营】关于上课和答疑
- It will be easier to implement MES system by doing well in these four stages
猜你喜欢

《nlp入门+实战:第四章:使用pytorch手动实现线性回归 》

How does the proxy IP server ensure its information security in the network

jupyter更改主界面并且导入数据集

如何才能修炼成一名不可替代的程序员?

web中间件日志分析脚本3.0(shell脚本)
![[Code] refers to the repeated number in the offer 03 array](/img/83/50f5157c363d46f38f6e4ef7fae3b2.png)
[Code] refers to the repeated number in the offer 03 array

IP地址能精确到哪步?动态IP及静态IP是什么?切换IP最常用的方法

109. Upload local files using SAP ui5 fileuploader control
![[RTOS training camp] equipment subsystem, questions of evening students](/img/12/20fc69b5faf4c2d6dfaacde8142e33.jpg)
[RTOS training camp] equipment subsystem, questions of evening students

Small sample learning - getting started
随机推荐
【RTOS训练营】继续程序框架、tick中断补充、预习、课后作业和晚课提问
Jupyter changes the main interface and imports the dataset
[RTOS training camp] continue the program framework, tick interrupt supplement, preview, after-school homework and evening class questions
Lua basic grammar
【ctf】Crypto初步基础概要
Small sample learning data set
[RTOS training camp] course learning methods and C language knowledge (pointer, structure, function pointer, linked list) and student questions
健身房一年关店8000家,逆势盈利的工作室是怎么开的?
手游多开用模拟器多开游戏如何切换IP搬砖
What is the dynamic IP address? Why do you recommend dynamic IP proxy?
Suddenly found an optimization artifact
【RTOS训练营】作业讲解、队列和环形缓冲区、队列——传输数据、队列——同步任务和晚课提问
Zabbix监控主机及资源告警
985 associate professors in Colleges and universities sun their annual salary, and the provident fund tops the monthly salary of ordinary people. Netizen: it is worthy of being in Shanghai
Android SQLite first groups and then sorts left concatenated queries
《自然语言处理实战入门》深度学习基础 ---- attention 注意力机制 ,Transformer 深度解析与学习材料汇总
Failed to load DLL
Game thinking 17: Road finding engine recast and detour learning II: recast navigation grid generation process and limitations
Lua基础语法
Data is written into excel and filled with color