在Linux kernel2.2 版本之后出现了一种叫做 "零拷贝(zero-copy)" 系统调用机制,目前很多应用服务器如 apache、nginx都支持,此机制很好的提高了服务器的性能
"零拷贝"是由 sendfile 系统调用实现的
"零拷贝"出现之前,读写数据基本都是使用 read系统调用 和 write系调用
以web服务来说,一个请求建立,从磁盘文件到网络连接之间,会通过 硬件 -> 内核层 -> 用户层 多次读写系统来完成文件数据的复制传输
从内核层用 read系统调用 读到用户层,再从用户层用 write系统调用 写到内核层,每一次用户层到内核层都进行一次上下文转换,这种代价是非常昂贵的,如果web服务器接受大量并发请求,这种系统调用就会非常频繁,服务器的性能就会下降
而"零拷贝" 跳过“用户缓冲区”的拷贝,建立一个磁盘空间和内存的直接映射,数据不再复制到“用户态缓冲区”
Web服务器在支持了sendfile系统调用后,避免了内核层与用户层的上线文切换(content swith)工作,大大减少了系统性能的开销,这种方式,不仅节省了内存,而且还有CPU的开销