传统的文件传输(读/写)要求通过多个上下文开关最终将文件写入套接字(read ) file、tmp_buf和len )。
write (套接字,tmp_buf,len );
传统的文件读写过程
1、调用read函数,将文件数据复制到内核缓冲区。
2、read函数从内核缓冲区取出文件数据,复制到用户缓冲区。
3、写函数将文件数据从用户缓冲区复制到套接字相关缓冲区。
4、将数据从套接字缓冲区复制到协议引擎。
传统的网络传输过程进行了四次复制操作。
磁盘内核缓冲区-用户缓冲区socket协议引擎相关缓冲区
sendfile操作文件进程sendfile (套接字,文件,len );
1、调用sendfile,将文件数据复制到内核缓冲区。
2、从内核缓冲区复制到套接字缓冲区。
3、从套接字缓冲区复制到协议引擎。
与传统方法相比,sendfile更容易减少文件复制过程内核2.4中的sendfile。
2.1和2.4的区别
如果在2.4中将文件数据复制到内核缓冲区,则数据不再复制到套接字缓冲区,而只记录套接字缓存的位置和长度。 数据将直接发送到DMA协议引擎,减少复制操作,支持的数据不应超过2G。