什么是DMA引擎
DMA的出现就是为了解决批量数据的输入/输出问题。DMA是指外部设备不通过CPU而直接与系统内存交换数据的接口技术。这样数据的传送速度就取决于存储器和外设的工作速度
DMA传输将从一个地址空间复制到另外一个地址空间。当CPU初始化这个传输动作,传输动作本身是由DMA控制器来实行和完成。 典型例子---移动一个外部内存的区块到芯片内部更快的内存区。
DMA传输开始前: CPU------>DMA控制器
DMA传输结束后: DMA控制器------>CPU
一个完整的DMA传输过程必须经历DMA请求、DMA响应、DMA传输、DMA结束4个步骤。
什么是零拷贝
传统拷贝:
在没有任何优化技术使用的背景下,操作系统为此会进行4次拷贝以及4次上下文切换
磁盘 --copy1--> PageCache --copy2--> 用户缓冲区 --copy3--> Socket缓冲区 --copy4--> 网卡
什么是上下文切换:
它是指,先把前一个任务的CPU上下文(也就是CPU寄存器和程序计数器)保存起来,然后加载新任务的上下文到这些寄存器和程序计数器,最后再跳转到程序计数器所指的新位置,运行新任务。
零 拷贝:
零拷贝(Zero-Copy)技术是指电脑执行操作时,CPU不需要参与数据的搬运复制。这种技术通常用于网络传输文件时,节省CPU周期和内存带宽。
一次系统调用代替两次系统调用
磁盘文件 --copy1--> PageCache --copy2--> 网卡
零拷贝与传统拷贝的区别:
零拷贝技术的文件传输方式相比传统文件传输的方式,减少了两次用户态和内核态的切换和数据拷贝次数。零拷贝技术可以把文件的传输性能提高至少一倍以上
Java提供了NIO库中的transferTo方法,go语言中的syscall包中的Sendfile都提供了直接操作底层零拷贝技术的能力