操作系统基本知识

在讲述零拷贝之前需要先明白操作系统中的几个概念:用户态、内核态、用户空间、内核空间、CPU上下文、DMA

用户空间和内核空间

应用程序需要通过操作系统提供的一些函数才能完成对磁盘、网络的访问,这些操作都是由底层操作系统来完成的。
操作系统为每个进程分配内存时,会分为两个部分:一部分是用户内存空间(用户空间)、另一部分是内核内存空间(内核空间)。内核空间是操作系统内核访问的区域,是受保护的内存空间,而用户空间是用户应用程序访问的内存区域
直白一点说:当进程运行应用程序的代码时,进程只能使用用户空间的这块内存,当应用程序发生系统调用时,进程才可以访问内核空间的这块内存。

用户态和内核态

  • 进程运行于内核空间时,即为内核态
  • 进程运行与用户空间时,即为用户态

    CPU上下文

    CPU上下文:寄存器内容和程序计数器内容
    CPU上下文切换:保存现有的CPU上下文内容,换成其他的CPU上下文

DMA技术

Direct Memory Access,直接内存访问

  1. 在没DMA时

image.png

  1. 在有DMA时

image.png

DMA的出现减少了CPU将数据拷贝到内核态的过程

零拷贝

零拷贝的方式有:

  1. mmap+write
  2. sendfile
  3. sendfile+支持SG-DMA的网卡

    原始方式

    image.png

  4. 4次上下文切换

  5. 4次文件拷贝

    mmap+write方式

    image.png

  6. 3次文件拷贝

  7. 4次上下文切换

    减少了内核态->用户态的文件拷贝

sendfile方式

image.png

  1. 2次上下文切换
  2. 3次拷贝

    sendfile直接从内核态写入socket缓冲区再到网卡

sendfile+支持SG-DMA的网卡

image.png

  1. 2次上下文切换
  2. 2次数据拷贝

    省去了缓冲区->socket缓冲区的赋值

参考资料