什么是零拷贝技术(zero-copy)?

小咪咪 2021-09-25 03:44 626阅读 0赞

零拷贝方式

零拷贝主要的任务就是避免CPU将数据从一块存储拷贝到另外一块存储,主要就是利用各种零拷贝技术,避免让CPU做大量的数据拷贝任务,减少不必要的拷贝,或者让别的组件来做这一类简单的数据传输任务,让CPU解脱出来专注于别的任务。这样就可以让系统资源的利用更加有效。

我们继续回到引文中的例子,我们如何减少数据拷贝的次数呢?一个很明显的着力点就是减少数据在内核空间和用户空间来回拷贝,让数据传输不需要经过user space,这也引入了零拷贝的一个类型:

使用mmap#####

我们减少拷贝次数的一种方法是调用mmap()来代替read调用:

  1. buf = mmap(diskfd, len);
  2. write(sockfd, buf, len);

应用程序调用mmap(),磁盘上的数据会通过DMA被拷贝的内核缓冲区,接着操作系统会把这段内核缓冲区与应用程序共享,这样就不需要把内核缓冲区的数据往用户空间拷贝。应用程序再调用write(),操作系统直接将内核缓冲区的内容拷贝到socket缓冲区中,这一切都发生在内核态,最后,socket缓冲区再把数据发到网卡去。
同样的,看图很简单:

format_png

不使用零拷贝方式

当应用程序访问某块数据时,操作系统首先会检查,是不是最近访问过此文件,文件内容是否缓存在内核缓冲区,如果是,操作系统则直接根据read系统调用提供的buf地址,将内核缓冲区的内容拷贝到buf所指定的用户空间缓冲区中去。如果不是,操作系统则首先将磁盘上的数据拷贝的内核缓冲区,这一步目前主要依靠DMA来传输,然后再把内核缓冲区上的内容拷贝到用户缓冲区中。
接下来,write系统调用再把用户缓冲区的内容拷贝到网络堆栈相关的内核缓冲区中,最后socket再把内核缓冲区的内容发送到网卡上。
说了这么多,不如看图清楚:

format_png 1

数据拷贝

转自: https://blog.csdn.net/weixin_42096901/article/details/103017044

发表评论

表情:
评论列表 (有 0 条评论,626人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Kafka 拷贝技术

    Kafka除了具备消息队列MQ的特性和使用场景外,它还有一个重要用途,就是做存储层。用kafka做存储层,为什么呢?一大堆可以做数据存储的 MySQL、MongoDB、H...

    相关 拷贝技术

    如今几乎每个人都听说过Linux中所谓的"零拷贝"特性,然而我经常碰到没有充分理解这个问题的人们。因此,我决定写一些文章略微深入的讲述这个问题,希望能将这个有用的特性解释清楚。

    相关 五分钟了解什么拷贝

    系统调用 了解零拷贝之前,你需要先了解什么是系统调用。以下以linux为例。 在linux中,系统分为内核空间和用户空间,我们所运行的JAVA等应用程序是运行在用户空间