DMA(Direct Memory Access)直接内存访问技术:在进行 I/O 设备和内存的数据传输的时候,数据搬运的工作全部交给 DMA 控制器,而 CPU 不再参与任何与数据搬运相关的事情,这样 CPU 就可以去处理别的事务。
零拷贝(Zero-copy):通过 DMA 将磁盘上的数据拷贝到内核缓冲区里,然后将缓冲区描述符和数据长度传到 socket 缓冲区,网卡的 SG-DMA 控制器就直接将内核缓存中的数据拷贝到网卡的缓冲区里。
零拷贝技术的文件传输方式相比传统文件传输的方式,减少了 2 次上下文切换和数据拷贝次数,只需要 2 次上下文切换和数据拷贝次数,就可以完成文件的传输,而且 2 次的数据拷贝过程,都不需要通过 CPU,2 次都是由 DMA 来搬运。
内核缓冲区:实际上是磁盘高速缓存(PageCache),PageCache可以缓存最近被访问的数据和预读,大大提高读写磁盘的性能。
PageCache不支持大文件(GB 级别的文件)读写,性能非常低。在高并发的场景下,针对大文件的传输的方式,应该使用「异步 I/O + 直接 I/O」来替代零拷贝技术。