零拷贝和多路复用模型
1.零拷贝
1.1 零拷贝简介
零拷贝指的是从一个存储区域到另一个存储区域的 copy 任务没有 CPU 参与.
通常用于网络文件传输, 以减少 CPU 消耗 和 内存带宽占用, 减少 用户空间 与 CPU 内核空间 的拷贝过程, 减少 用户上下文 与 CPU 内核上下文间的切换, 提高系统效率.
零拷贝需要 DMA 控制器 的协助. Direct Memory Access, 直接内存存取, 是 CPU 的组成部分, 其可以在 CPU 内核 (算术逻辑运算器 ALU 等) 不参与运算的情况下将数据从一个地址空间拷贝到另一个地址空间.
1.2 传统拷贝
场景 将一个硬盘中的文件通过网络发送出去
![](https://img-blog.csdnimg.cn/960e2348e9be4133b6ccd4906e4c4a34.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA54aK5a2p5a2Q5p2l5ZWm,size_18,color_FFFFFF,t_70,g_se,x_16)
4 次用户空间与内核空间的上下文切换,以及 4 次数据拷贝
存在问题
应用程序的作用仅仅就是一个数据传输的中介, 最后将 kernel buffer
中的数据传递到了 socket buffer
1.3 零拷贝实现
通过 sendfile
系统调用实现的
![](https://img-blog.csdnimg.cn/2fab78e80a79442eb4dc6ef0119b28be.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA54aK5a2p5a2Q5p2l5ZWm,size_18,color_FFFFFF,t_70,g_se,x_16)
kernel buffer
与 sock