Zero-Copy

服务器将硬盘上的文件,传给用户,需要几次拷贝?
解决这个问题,需要明白具体的工作流程是什么?

read(file, buf, len);        // 把文件读到缓冲区buf中
write(socket, buf, len);  // 把buf中的内容发送给用户

关于哪个步骤需要拷贝:

  1. 把磁盘中文件拷贝到kernel buf
  2. 把kernel buf拷贝到user buf
  3. 把user buf拷贝到socket 中的kernel buf
  4. 把socket buffer 拷贝到 网卡设备的buffer
    其实1,2是read,3,4是write
    所以说,一共拷贝4次,而且kernel mod和user mod的切换也是4次。

Linux 2.1内核开始引入了sendfile函数。省去了将操作系统的read buffer拷贝到程序的buffer,以及从程序buffer拷贝到socket buffer的步骤
而是直接将kernel buf 拷贝 到 socket buf。 实际上是把2,3两部步骤整合了。


拷贝次数

上下文切换

这里把上下文的切换次数从4次减少到2次,同时也把数据copy的次数从4次降低到了3次。
Java NIO中的FileChannal.transferTo()方法就是这样的实现,这个实现是依赖于操作系统底层的sendFile()实现的
但是,这还不是Zero-Copy。

  1. 将文件拷贝到kernel buffer中
  2. 向socket buf中写入当前要拷贝数据的位置和偏移量
  3. 根据socket buf中的位置和偏移量,直接将kernel buf拷贝到网卡buffer中。


这样只需要拷贝两次。这里的零拷贝是针对kernel来讲的,数据在kernel模式下是Zero-Copy。

在kafka和netty中会使用到Zero-Copy,大大提升了性能。

感谢:什么是Zero-Copy?

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 转载:原文链接 考虑这样一种常用的情形:你需要将静态内容(类似图片、文件)展示给用户。那么这个情形就意味着你需要先...
    SnailFast阅读 601评论 0 2
  • 单独从理论上理解可能会有些晦涩,我在这从一个实际的场景进行阐述,一步一步演进Zero-Copy的原理。 概述 我们...
    Yang0503阅读 1,185评论 0 1
  •   本文专门解释关于高性能IO的基层技术,关于zero-copy,mmap,direct-memory,这些都是L...
    Skymiles阅读 4,970评论 4 10
  • 场景: 从本地磁盘读取数据,然后将这些数据通过socket发送到远端。 read(file, user_buf, ...
    一只搬砖的傻狗阅读 620评论 0 0
  • 目录 前言 传统的数据传输方法 零拷贝的数据传输方法“基础的”零拷贝机制对Scatter/Gather的支持对内存...
    LittleMagic阅读 38,432评论 14 86

友情链接更多精彩内容