美文网首页
零拷贝实现流程梳理

零拷贝实现流程梳理

作者: 死鱼 | 来源:发表于2019-08-23 16:08 被阅读0次

何为零拷贝?

我们先从linux正常的数据读写场景入手:

数据读写图解
当用户需要把信息从一个物理入口传送到另一个物理出口的时候,需要经历这些操作:
1、通过DMA把数据传送到内核内存中
2、cpu把数据复制到用户内存中
3、cpu把数据复制到缓冲区中
4、通过DMA把数据传送到网卡中
零拷贝的作用就是减少两次无谓的CPU复制

零拷贝如何实现

第一步:消灭第一个CPU复制

使用 mmap() 函数替代 read() 来读取数据;

buffer = mmap(inputFd, length);

应用程序调用mmap后,数据会通过DMA的方式读取到内核内存区中。然后,linux会把这段内核内存和用户内存共享。这样就能节省了第一个CPU复制。

mmap读写流程
第二步:消灭第二个CPU复制

这里就要用到系统调用 sendfile() 函数


sendfile流程

sendfile函数做的事情就是调用mmap(),把数据写到共享内存后,再把数据拷贝到socket缓冲区里去。

而这个过程是可以优化的。这里默认使用方式是cpu把数据从页缓存复制到socket缓冲区中,但其实是可以把入口数据的文件描述符和数据长度传给socket缓冲区,这样DMA就能直接把数据内存数据读到网卡去了。


零拷贝流程

这一步是不会把数据复制到socket缓冲区去的,DMA引擎会直接把数据读取到网卡,这样就能节省了第二次的复制工作。

相关文章

  • 零拷贝实现流程梳理

    何为零拷贝? 我们先从linux正常的数据读写场景入手: 零拷贝如何实现 第一步:消灭第一个CPU复制 使用 mm...

  • zero-copy

    zero-copy 零拷贝 在linux上kafka使用了两种手段实现零拷贝: mmap 写入数据阶段 sendf...

  • 76 netty零拷贝原理&netty线程模型原理

    1 什么是零拷贝 zery-copy 2,为什么kafka中使用 zery-copy 3, 零拷贝技术实现方案有哪...

  • 零拷贝实现原理

    [TOC] 内容拷贝过程 场景:从一个文件中读出并将数据传到另一台服务器实现伪代码如下: 注意: 在应用拷贝时会涉...

  • 深拷贝实现

    // 深拷贝实现流程// 基础版// 如果是前拷贝,我们可以很容易写出下面的代码function clone(ta...

  • Netty分享之ByteBuf零拷贝

    gris 转载请注明原创出处,谢谢! 我们或多或少了解过一些零拷贝的概念,而零拷贝也正是netty能够实现高性能的...

  • 深拷贝、浅拷贝

    父类实现深拷贝时,子类如何实现深度拷贝。父类没有实现深拷贝时,子类如何实现深度拷贝。 深拷贝同浅拷贝的区别:浅拷贝...

  • 面试题整理

    父类实现深拷贝时,子类如何实现深度拷贝。父类没有实现深拷贝时,子类如何实现深度拷贝。 深拷贝同浅拷贝的区别:浅拷贝...

  • iOS面试基础一

    #父类实现深拷贝时,子类如何实现深度拷贝.父类没有实现深拷贝时,子类如何实现深度拷贝.# <(1)深拷贝同浅拷贝的...

  • 0. iOS面试题基础篇

    1. 父类实现深拷贝时,子类如何实现深度拷贝。父类没有实现深拷贝时,子类如何实现深度拷贝。 1.1 深拷贝同浅拷贝...

网友评论

      本文标题:零拷贝实现流程梳理

      本文链接:https://www.haomeiwen.com/subject/bwftectx.html