零拷贝

简介

零拷贝的“零”是指用户态和内核态间copy数据的次数为零。

传统的数据copy(文件到文件、client到server等)涉及到四次用户态内核态切换、四次copy。四次copy中,两次在用户态和内核态间copy需要CPU参与、两次在内核态与IO设备间copy为DMA方式不需要CPU参与。零拷贝避免了用户态和内核态间的copy、减少了Java零拷贝机制解析核态间的切换。

DMA(Direct Memory Access,直接内存存取) 是所有现代电脑的重要特色,它允许不同速度的硬件装置来沟通,而不需要依赖于CPU 的大量中断负载。 DMA控制器,接管了数据读写请求,减少CPU的负担。这样一来,CPU能高效工作了。 现代硬盘基本都支持DMA。

使用Zero Copy前后对比:

使用前:

img

使用后:

img

Linux支持的(常见)零拷贝

mmap内存映射 sendfile Sendfile With DMA Scatter/Gather Copy splice

无论是传统IO方式,还是引入零拷贝之后,2次DMA copy 是都少不了的。因为两次DMA都是依赖硬件完成的。

img

实际上,零拷贝时有广义和狭义之分的。 广义零拷贝: 能减少拷贝次数,减少不必要的数据拷贝,就算作“零拷贝”。 这是目前,对零拷贝最为广泛的定义,我们需要知道的是,这是广义上的零拷贝,并不是操作系统 意义上的零拷贝。

Java零拷贝机制解析

Linux提供的领拷贝技术 Java并不是全支持,支持2种(内存映射mmapsendfile);

NIO提供的内存映射:MappedByteBuffer

NIO提供的sendfile:FileChannel.transferTo() FileChannel.transferFrom()

适用场景

数据不需要应用程序计算处理的场景,例如:访问静态资源

参考

Java中的零拷贝

Java零拷贝

版权

评论