sendfile¶一次sendfile()有三次内存拷贝:
磁盘 -> kernel buffer
kernel buffer -> socket发送缓冲区
socket发送缓冲区 -> NIC
先比read()和write()的方式, 少了一次内存拷贝, 两次上下文切换.
如果是Scatter-Gatther NIC, 那么os缓存区会直接拷贝到网卡, 少两次内存拷贝. (TCP Segmentation Offloading)
splice¶和sendfile的区别是:
磁盘 -> kernel buffer
kernel buffer – pipe –> socket buffer
socket buffer -> NIC
这里的pipe不做拷贝,只是建立一个引用(指针).
splice() moves data between two file descriptors without copying between kernel address space and user address space.
http://man7.org/linux/man-pages/man2/splice.2.html
preformance review https://pdfs.semanticscholar.org/6a35/60046cb8d3258669c86072a7cab05e1d2300.pdf
https://www.linuxjournal.com/article/6345