深入简出零拷贝及应用 | 青训营

146 阅读3分钟

零复制(英语:Zero-copy;也译零拷贝)技术是指计算机执行操作时,CPU不需要先将数据从某处内存复制到另一个特定区域,从而减少上下文切换以及CPU的拷贝时间。这种技术通常用于通过网络传输文件时节省CPU周期和内存带宽。

Linux传统文件传输过程

  • 发生了4次用户态与内核态的上下文切换

    发生了两次系统调用,一次是read()方法,一次是write()方法,每次系统调用时,都会先从用户态切换到内核态,等内核完成之后会再次从内核态切换到用户态。

  • 发生了4次数据拷贝

Linux系统按照特权等级把进程可以运行的空间分为用户空间和内核空间两部分。分别对应着不同的特权等级,数字越小权限越大。内核空间主要提供进程调度、内存分配和连接硬件资源等功能。用户空间在最外层,它只能访问受限的资源,不能直接访问内存等硬件设备,必须通过系统调用进入到内核中之后才能访问这些特权资源。内核空间与用户空间切换的过程称特权模式切换。

CPU上下文切换: 当调用read()方法时,就发生了一次上下文切换。CPU上下文切换的过程中,首先会保存CPU寄存器里原来用户态的指令位,为了执行内核态代码,CPU寄存器需要更新为内核态指令的新位置,然后跳转到内核态运行内核任务,最后当系统调用结束后CPU寄存器需要恢复原来保存的用户态,然后在切换为用户空间继续之前运行的进程。

用户空间(user space)和内核空间(kernel space)

进程运行在用户空间时则处于用户态;进程运行在内核空间在处于内核态。

32 位操作系统的寻址空间(虚拟地址空间,或叫线性地址空间)为 4G(2的32次方)。即一个进程的最大地址空间为4G。在Linux的虚拟地址空间中,用户空间和内核空间的大小比为3:1。每个进程的 4G 地址空间中,最高 1G 都是一样的,即内核空间。只有剩余的 3G 才归进程自己使用。

为什么需要区分用户空间和内核空间?

隔离操作系统程序和应用程序。

CPU拷贝

内核空间为什么不能直接使用用户空间的数据呢?

  • 内核不能信任任何用户空间的指针
  • 稳定性vs效率

CPU数据拷贝方式

I/O轮询

优点:实现简单

缺点:占用CPU全部资源,效率低

I/O中断

优点:对比I/O轮询的方式,一定程度上释放了CPU资源

缺点:在大数据量传输的情况下,CPU会反复中断

DMA传输

优点:彻底减少了一次CPU拷贝

缺点:依赖设备硬件支持

零拷贝的实现方式未完后续补,快截止了😭