零拷贝(ZeroCopy),又称零复制,是一种计算机操作技术,是指计算机执行操作时,CPU不需要先将数据从某处内存复制到另一个特定区域。 或者可以这么理解:与传统的read/write模式相比,零拷贝技术在数据发送的过程中,不需要在用户态为数据申请buffer,也就是不会产生用户态、内核态之间的数据拷贝,可以有效提高读写性能。 其主要目的在于减少或者消除CPU在数据复制操作中的参与度,从而提高系统运行性能。 下面将从核心概念、主要实现方式、优势和应用场景等方面阐述一下零拷贝技术。 1、核心概念 我们先来看看传统的数据拷贝: 在这种拷贝操作中,数据从磁盘到网络一般需要经过很多次拷贝过程,比如: 磁盘 → 内核缓冲区; 内核缓冲区 → 用户空间缓冲区; 用户空间缓冲区 → 内核socket缓冲区; socket缓冲区 → 网卡。 通过上面的执行流程可以看出,传统的操作总共发生了4次拷贝。 再来看看零拷贝技术: 零拷贝技术消除了这些不必要的拷贝过程,通常使用以下方式执行拷贝: 让数据直接从存储设备传输到网络; 在内核空间内部传输,避免用户空间参与。 2、主要实现方式 零拷贝的主要实现方式包括: mmap + write: mmap是Linux提供的一种内存映射文件的机制,它实现了将内核中读缓冲区地址与用户空间缓冲区地址进行映射,从而实现内核缓冲区与用户缓冲区的共享。 使用内存映射文件,将内核缓冲区映射到用户空间,减少一次从内核空间到用户空间的拷贝。 sendfile函数: 使用sendfile函数将数据通过socket发送到对端; Linux系统调用,允许数据在内核空间直接传输,完全避免了用户空间的参与。 DMA (Direct Memory Access,直接存储器访问技术): 允许硬件设备直接访问内存,无需CPU介入,也常用于MCU的技术。 splice: splice是Linux2.6内核中新增的零拷贝数据发送函数,主要用于将数据发送到管道或从管道中接收数据。 另一个Linux系统调用,可以在两个文件描述符之间移动数据。 3、优势 零拷贝技术主要包括以下4个方面的优势: 减少CPU使用率:消除不必要的拷贝操作; 降低内存带宽压力:减少内存间的数据传输; 提高吞吐量:数据传输更加高效; 减少上下文切换:某些实现避免了用户态和内核态的切换。 4、应用场景 零拷贝技术的应用领域包括但不限于以下方面: 文件服务器; 网络代理; 数据库系统; 视频流媒体服务; 大数据处理框架。
综上所述,零拷贝技术是现代高性能计算和网络编程中的重要优化手段,特别是在处理大量数据传输的场景中效果会更加显著。
|