OS层面的零拷贝和Netty零拷贝
OS层面的零拷贝
1.普通应用程序读写
DMA copy指的是直接内存存取,即不使用CPU拷贝数据到内存,而是DMA引擎传输数据到内存,用于解放CPU。
kernel buffer即内核缓冲区,从利用DMA copy直接从硬盘读到了内核的读缓冲区。
可以看到需要四次内核态和用户态的切换,4次拷贝。
2.mmap优化
mmap通过内存映射,将文件映射到内核缓冲区,用户空间可以共享内核空间的数据。数据不用从kernel buffer拷贝到user buffer了。减少了一次拷贝。
3.sendFile
sendFile系统调用时,数据被DMA引擎从文件复制到内核缓冲区,然后调write方法时,从内核缓冲区直接进入到Socket,这是没有进行态切换的。