Post

Zero Copy

Zero Copy

Zero Copy

Linux IO方式

  • 轮询
  • IO中断
  • DMA方式
  • 传统IO使用read()和write()系统调用
    • 后续以上传文件为例, 从用户态使用read从磁盘读取数据, 使用write将数据写入网卡

IO中断 read

  • IOBlock
  • 从磁盘读取数据时CPU阻塞

DMA方式

  • DMA
  • 2次DMA copy + 2次CPU copy + 4次上下文切换

Zero Copy

  • 尽可能减少数据拷贝和上下文切换次数(不是真的0次)
  • 常见策略
    • 用户态直接IO
      • 数据库系统使用
    • 减少拷贝次数(重要方式)
      • mmap + write
      • sendfile
      • sendfile + DMA gather copy
      • splice
    • 写时复制
      • 读取时无需拷贝, 写时才将数据拷贝到自己的进程空间

mmap + write

  • 用mmap替换read系统调用
  • 内核态和用户态映射同一个物理地址
  • 2次DMA copy + 1次CPU copy + 4次上下文切换
  • mmap

sendfile

  • sendfile系统调用无需将数据从内核态copy到用户态, 直接在内核态进行数据拷贝
  • 无法修改文件, 只能进行数据传输
  • 2次DMA copy + 1次CPU copy + 2次上下文切换
  • sendfile

sendfile + DMA gather copy

  • 不需要在内核态进行copy, 而是通过fd和文件长度等信息, 在内核空间进行映射
  • 无法修改文件, 需要硬件支持, 只能copy到socket buf中
  • 2次DMA copy + 0次CPU copy + 2次上下文切换
  • gather

splice

  • 在两个内核空间的内存上建立pipe管道
  • 支持任意两个fd, 无需硬件支持, 不能修改文件
  • 2次DMA copy + 0次CPU copy + 2次上下文切换
  • splice
This post is licensed under CC BY 4.0 by the author.