前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >什么是零拷贝(Zero-copy)?

什么是零拷贝(Zero-copy)?

作者头像
逍遥壮士
发布2020-11-12 15:15:59
1.4K0
发布2020-11-12 15:15:59
举报
文章被收录于专栏:技术趋势技术趋势

什么是零拷贝(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

代码实现

代码语言:javascript
复制
/**
 * @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/article/6345?page=0,0

https://blog.csdn.net/qq_35642036/article/details/82809856

https://developer.ibm.com/zh/articles/j-zerocopy/

http://sound2gd.wang/2018/07/24/Java-NIO%E5%88%86%E6%9E%90-11-%E9%9B%B6%E6%8B%B7%E8%B4%9D%E6%8A%80%E6%9C%AF/

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-11-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 技术趋势 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档