网络专题
- 文件传输
- mmap+write
- send file
- 大文件传输过程
文件传输
传统的文件传输过程
在这个过程中发生了4次用户态与内核态之间的切换,4次数据拷贝分别是
- read系统调用陷入内核,read完成返回
- write调用陷入内核,write返回
4次数据拷贝分别是
磁盘->内核缓冲区->用户缓冲区->socket缓冲区->网卡缓冲区
显然有些拷贝的开销是没有必要承受的,有如下两种解决方案
mmap+write
使用mmap将文件映射到内存中,然后write mmap中的内容即可,整个操作如下图
这样减少了一次数据拷贝的过程
send file
为了解决这一个问题,内核提供了一个新的系统调用,sendfile,并且根据系统是否支持SG-DMA,有如下两种情况
不支持的情况如下
这不是真正的零拷贝,真正的零拷贝在支持SG-DMA的情况下发生
大文件传输过程
前面的文件传输过程第一步都是将磁盘文件拷贝到内核缓冲区(Page Cache),但是大文件传输因为文件较大,会造成Page Cache缓冲直接失效,反而影响效率,这个时候的解决方案是异步 + 直接IO