以读取磁盘并发送数据为例
非零拷贝技术
读取磁盘并发送数据,非零拷贝技术需要发生三次数据拷贝(磁盘 -> 应用程序内存 -> 内核缓冲区 -> 网络协议栈缓冲区),CPU参与了所有数据的搬运过程。
零拷贝技术
读取磁盘并发送数据,零拷贝技术只进行了两次数据拷贝(磁盘——>内核缓冲区——>网卡),全程没有通过 CPU 来搬运数据,所有的数据都是通过DMA来进行传输的。这样就减少了上下文切换以及CPU的拷贝时间,从而提高了文件传输的性能。
零拷贝,指整个过程 CPU 零参与。
核心技术
传统的CPU存取数据的方式是:当需要从外设获取数据时,CPU首先将外设数据加载到内存中(因为内存的速度最接近CPU的处理速度),然后检查 cache 是否命中,如果命中则直接返回数据;如果没有命中,则需要继续从内存中获取数据。这个过程会占用大量的 CPU 时间,尤其是在大量数据传输的情况下。
DMA,全称 Direct Memory Access,即直接存储器访问。它是一种高速数据传输操作,能在 DMA 控制器的控制下实现存储器与外设、外设与外设之间的直接数据交换(如磁盘与网卡),整个过程中不需要通过 CPU。
DMA技术的诞生是为了解决 CPU 在数据传输过程中的瓶颈问题。传统的 IO 工作方式中,从硬盘读取数据,然后再通过网卡向外发送,需要进行多次上下文切换和数据拷贝,其中至少两次是由 CPU 完成的。这种方式大大降低了数据传输的效率。为了解决这个问题,DMA 技术应运而生,它让实际的数据传输工作由 DMA 控制器来完成,从而释放了 CPU 的资源。
具体来说,DMA 控制器是一种硬件电路,它可以在 CPU 的主程序执行过程中,接受外设发出的中断请求,暂时停止主程序的执行,转而去执行与数据传输相关的处理程序,从而实现数据的快速传输。例如,在零拷贝技术中,就利用了 DMA 技术来提高文件传输的性能。在这个过程中,只有一个 sendfile 系统调用导致的2次用户态与内核态的上下文切换,只进行了2次数据拷贝(磁盘——>内核缓冲区——>网卡),全程没有通过 CPU 来搬运数据,所有的数据都是通过 DMA 来进行传输的。
文章探讨了非零拷贝与零拷贝技术的区别,前者涉及三次数据拷贝,后者仅两次,通过DMA减少CPU干预。DMA技术通过直接存储器访问优化数据传输,尤其在大容量文件传输中显著提高效率。零拷贝技术在sendfile系统调用中实现,只进行两次数据拷贝,显著降低上下文切换和CPU负载。
1769

被折叠的 条评论
为什么被折叠?



