代码语言:java复制
DMA(Direct Memory Access,直接内存存取,即不使用 CPU 拷贝数据到内存,而是 DMA 引擎传输数据到内存,用于解放 CPU)
零拷贝技术实现的方式通常有 2 种:
1、mmap write
2、sendfile
mmap 和 sendFile 的区别:
1、mmap 适合小数据量读写,sendFile 适合大文件传输。
2、mmap 需要 4 次上下文切换,3 次数据拷贝;sendFile 需要 2 次上下文切换,最少 2 次数据拷贝。
3、sendFile 可以利用 DMA 方式,减少 CPU 拷贝,mmap 则不能(必须从内核拷贝到 Socket 缓冲区)。
特性
1、mmap 用于文件共享,很少用于socket操作.sendfile用于发送文件.
2、mmap 是共享一个文件,共享内存是共享一段内存。mmap还可以写回到file.
3、mmap 缺点,每次读入都是1页即4k,所以少于4k会造成大量内存碎片. 但是通过read,write也是这样哈,所以没有更优化的情况?
1、mmap 适用场景,是取代read,write 文件.
2、mmap的本质,就是进程可以访问内核态的页缓存,减少了一次内核态到用户态的拷贝.
3、sendfile的本质,是网络DMA直接读取内核页缓存,减少了一次内核页缓存到socket 缓冲区的拷贝