零拷贝
2022-01-05 16:57:07 0 举报
Java零拷贝
作者其他创作
大纲/内容
1. java调用transferTo方法后,要从java程序的用户态切换至内核态,使用DMA将数据读入内核缓冲区,不会使用cpu2.只会将一些offset和length信息拷入socket缓冲区,几乎无消耗3.最后使用DMA将内核缓冲区的数据写入网卡,不会使用cpu- 只发生了一次用户态与内核态的切换- 数据拷贝了2次所谓的零拷贝,并不是真正的无拷贝,而是在不会拷贝重复数据到jvm内存中,零拷贝的优点:更少的用户态与内核态切换,不利于cpu计算,减少cpu缓存伪共享,零拷贝适合小文件传输
1
内核缓冲区
2
socket缓冲区
File f = new File(\"data.txt\");span class=\"eq-l\
传统IO
用户缓冲区
ByteBuffer.allocateDirect():使用的是操作系统内存
磁盘
网卡
进一步优化(linux2.4):零拷贝
1. java本身并不具备IO读写能力,因此read方法调用后,要从java程序的用户态切换至内核态,去调用操作系统的读能力,将数据读入内核缓冲区。这期间用户线程阻塞,操作系统使用DMA(Direct Memory Access)来实现文件读,其间也不会使用cpuDMA也可以理解为硬件单元,用来解放CPU完成文件IO2. 从内核态切换回用户态,将数据从内核缓冲区读入用户缓冲区,这期间cpu会参与拷贝,无法利用DMA3.调用write方法,这时将数据从用户缓冲区写入socket缓冲区,cpu会参与拷贝4.接下来要向网卡写数据,这项能力java又不具备,因此又得从用户态切换至内核态,调用操作系统的写能力,使用DMA将socket缓冲区的数据写入网卡,不会使用cpu用户态与内核态切换了3次,数据拷贝了4次
3
NIO优化
进一步优化(底层采用了linux2.1后提供的sendFile方法),java中对应着有两个channel调用transferTo/transferFrom方法拷贝
4
1. java调用transferTo方法后,要从java程序的用户态切换至内核态,使用DMA将数据读入内核缓冲区,不会使用cpu2.数据从内核缓冲区传输到socket缓冲区,cpu会参与拷贝3.最后使用DMA将socket缓冲区的数据写入网卡,不会使用cpu- 只发生了一次用户态与内核态的切换- 数据拷贝了3次
0 条评论
下一页