简介
零拷贝的“零”是指用户态和内核态间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前后对比:
使用前:
使用后:
Linux支持的(常见)零拷贝
mmap内存映射
sendfile
Sendfile With DMA Scatter/Gather Copy
splice
无论是传统IO方式,还是引入零拷贝之后,2次DMA copy 是都少不了的。因为两次DMA都是依赖硬件完成的。
实际上,零拷贝时有广义和狭义之分的。 广义零拷贝: 能减少拷贝次数,减少不必要的数据拷贝,就算作“零拷贝”。 这是目前,对零拷贝最为广泛的定义,我们需要知道的是,这是广义上的零拷贝,并不是操作系统 意义上的零拷贝。
Java零拷贝机制解析
Linux提供的领拷贝技术 Java并不是全支持,支持2种(内存映射mmap
、sendfile
);
NIO提供的内存映射:MappedByteBuffer
NIO提供的sendfile:FileChannel.transferTo()
FileChannel.transferFrom()
适用场景
数据不需要应用程序计算处理的场景,例如:访问静态资源
评论