Post

零拷贝

高速缓存PageCache

  • 在内存中有一个分区用来缓存热点数据
  • 有预读功能
  • 读写速度比磁盘快
  • 应用与内核态缓存区,如下文内核态缓存区

DMA技术

  • 在进行I/O设备(如:磁盘)和内存进行数据传输时,由DMA负责数据搬运,而不需要CPU参与

传统文件传输

  • Snipaste_2022-02-18_14-51-45
  • 系统调用:read(file, tmp_buf, len)、write(socket, tmp_buf, len)
  • 4次上下文切换:read两次+write两次
  • 4次数据拷贝:2次DMA拷贝 + 2次CPU拷贝

零拷贝技术

  • Snipaste_2022-02-18_15-04-04
  • 零拷贝:数据传输过程中,仅由DMA参与数据拷贝,CPU不参与
  • 系统调用:sendfile(int out_fd, int in_fd, off_t *offset, size_t count)
  • 2次上下文切换:sendfile两次
  • 2次数据拷贝:2次DMA拷贝

大文件传输

  • Snipaste_2022-02-18_15-12-30
  • 使用异步IO ,绕开PageCache,过程如图
  • 为什么不用零拷贝?
    • 零拷贝使用了PageCache
    • 很快占满PageCache,导致热点小数据不能使用PageCache
    • 大文件PageCache命中率不高

参考

  • 原来 8 张图,就可以搞懂「零拷贝」了:https://www.cnblogs.com/xiaolincoding/p/13719610.html
This post is licensed under CC BY 4.0 by the author.