zero-copy transfer
平时写 http server 会接触到传输文件的问题。最简单的版本大概是这样子的。1
2
3
4
5
6
7
8for {
n, _ := file.Read(buf)
if n > 0 {
w.Write(buf[:n])
}else{
break
}
}
对于一般的程序来说是没有问题的,但是如果需要频繁地传输大文件,那么这种办法效率不够高。因为这里不断地调用两个系统调用,read()
和 write()
。对操作系统稍微熟悉的都会知道系统调用是在内核态执行而用户程序是跑在用户态。
读取文件就会先从磁盘文件读到内核缓冲区然后再拷贝到用户空间缓冲区,写操作也要先写到内核缓冲区然后再发送。
系统调用 sendfile()
就是用来解决这个底性能问题的。文件可以直接送到socket上,不需要经过用户空间。