零拷贝
什么是零拷贝?
零拷贝技术,就是避免将数据从一块存储拷贝到另外一块存储的技术,从而节省拷贝带来的CPU开销,零拷贝并不是将拷贝操作完全消除掉。
- 传统拷贝:这个没什么说的,就是平时我们一般都会用到的拷贝方式;
- MMAP方式的拷贝:当应用程序不需要对数据进行访问时,则可以避免将数据从内核空间拷贝到用户空间;
- SendFile方式的拷贝:写时拷贝技术,数据不需要提前拷贝,而是当需要修改的时候再进行部分拷贝。
传统拷贝
传统的Linux系统中,标准的I/O接口(例如read,write)都是基于数据拷贝操作的,即是I/O操作会导致数据在内核地址空间的缓冲区和用户地址空间的缓冲区之间进行拷贝,所以标准I/O也被称作缓存I/O。这样做的好处是,如果所请求的数据已经存放在内核的高速缓冲存储器中,那么就可以减少实际的I/O操作,但坏处就是数据拷贝的过程,会导致CPU开销。
DMA(Direct Memory Access):直接存储器访问。DMA是一种无需CPU的参与,让外设和系统内存之间进行双向数据传输的硬件机制。当DMA完成数据的传送之后,使用系统中断提醒CPU,然后CPU就可以高效的处理数据。使用DMA可以使系统CPU从实际的I/O数据传输过程中摆脱出来,从而大大提高系统的吞吐率。