零拷贝的概念
零拷贝:CPU不执行拷贝数据的任务
优点:
- 减少不必要的cpu拷贝
- 减少内存带宽的使用
- 减少系统态用户态的切换
传统IO
四次用户态系统态的切换
四次数据拷贝(两次DMA拷贝,两次cpu拷贝)
- 硬盘到内核空间
- 内核空间到用户空间(cpu)
- 用户空间到socket buffer(cpu)
- socket buffer到协议引擎
基于SendFile实现的零拷贝
两次用户态系统态的切换
三次数据拷贝,两次DMA拷贝,一次cpu拷贝
- 硬盘到内核空间缓冲区
- 内核空间缓冲区到socket buffer(cpu)
- socket buffer到协议引擎
带DMA的sendFile零拷贝
两次系统态用户态的切换,两次DMA拷贝
- 硬盘到内核空间
描述信息拷贝到socket buffer,a)kernel buffer的内存地址;b)kernel buffer的偏移量 - 内核空间缓冲区拷贝到协议引擎
基于mmap实现的零拷贝
四次用户态系统态的切换,两次DMA拷贝,一次cpu拷贝。
- 硬盘到内核空间缓冲区
- 内核空间缓冲区到socket buffer
- socket buffer到协议引擎
FileChannel的tranfromTo是零拷贝的实现。