什么是零拷贝(Zero-copy)?
日期: 2020-11-07 分类: 个人收藏 426次阅读
什么是零拷贝(Zero-copy)?
零复制(英语:Zero-copy;也译零拷贝)技术是指计算机执行操作时,CPU不需要先将数据从某处内存复制到另一个特定区域。这种技术通常用于通过网络传输文件时节省CPU周期和内存带宽。
DMA是什么?
DMA全称:Direct Memory Access(直接内存存取),它允许不同速度的硬件装置来沟通,而不需要依赖于 CPU 的大量中断负载。
DMA主要是解决外围设备可以直接访问内存,从中减少CPU参与。
参考:
https://baike.baidu.com/item/DMA/2385376
https://zhuanlan.zhihu.com/p/138573828
虚拟内存是什么?
目前在数多系统都采用虚拟内存。虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。
参考:
https://baike.baidu.com/item/%E8%99%9A%E6%8B%9F%E5%86%85%E5%AD%98
传统的的拷贝需要经历四个:jvm切换到内核态缓冲区读取->操作系统将数据拷贝用户缓冲区-->-再次切换到内核态并将用户缓存区数据拷贝进来->将内核态缓冲区写入socket buffer(cpu参与两次)
零拷贝经历两个:用户->内核态缓冲区(cpu不参与)
其实被拷贝了两次为什么叫零拷贝呢?由于站在系统的角度来待!
零拷贝的好处?
减少上下文切换,避免CPU参与拷贝带来的负载;
减少cpu和带宽的开销;
提升效率;
哪些框架应用了零拷贝技术?
java
为nio的MappedByteBuffer
参考: https://docs.oracle.com/javase/7/docs/api/java/nio/MappedByteBuffer.html
https://javadoc.scijava.org/Java9/java/nio/MappedByteBuffer.html
linux
tmp_buf = mmap(file,len)
write(socket,tmp_buf,len)
kafka
rocketmq
netty
nginx
代码实现
/**
* @author: csh
* @Date: 2020/10/22 14:19
* @Description:java零拷贝
*/
public class ZeroCopy {
public static void main(String[] args) throws Exception {
File file = new File("file.txt");
long len = file.length();
byte[] ds = new byte[(int)len];
//mappedByteBuffer为零拷贝
MappedByteBuffer mappedByteBuffer = new FileInputStream(file).
getChannel().map(FileChannel.MapMode.READ_ONLY,0,len);
for (int offset = 0; offset < len; offset++) {
byte b = mappedByteBuffer.get();
ds[offset] = b;
}
Scanner scanner = new Scanner(new ByteArrayInputStream(ds)).useDelimiter("");
while (scanner.hasNext()){
System.out.println(scanner.next()+" ");
}
}
}
最后
零拷贝是一种思想,慢慢衍生出来的技术,在很多框架或系统都支持,并且为系统性能提到很关键的作用,特别大文件的拷贝。不管java/netty/linux/等等都有这个零拷贝的存在。
参考文章:
https://zh.wikipedia.org/wiki/%E9%9B%B6%E5%A4%8D%E5%88%B6
https://www.linuxjournal.com
除特别声明,本站所有文章均为原创,如需转载请以超级链接形式注明出处:SmartCat's Blog
上一篇: 程序员的十年之痒
下一篇: 你不好奇 CPU 是如何执行任务的吗?
精华推荐