NIO零拷贝

传统I/O

NIO零拷贝
可以看到传统的I/O操作进行了4次用户空间与内核空间的上下文切换,以及4次数据拷贝。

零拷贝I/O

NIO零拷贝
上下文从用户空间切换到内核空间后
1、系统将数据从硬件通过DMA(直接内存访问)拷贝到内核空间缓冲区
2、内核空间缓冲区(Kernel buffer)此时不会将数据拷贝到socket缓冲区(socket buffer),而是将内核空间缓冲区的描述信息(buffer的内存地址以及长度信息)写入到socket缓冲区
3、协议引擎(protocol engine)直接从这两个缓冲区获取数据(体现了操作系统的gather方式),然后将内核空间缓冲区的数据发送到网络。

建议:实际开发过程中有从本地磁盘读写数据发送到网络的需求,可以通过fileChannel.transferTo()方法,该方法底层采用Nio零拷贝技术。