目录
背景
零拷贝定义
传统I/O执行流程
背景
零拷贝算是一个老生常谈的问题啦,很多顶级框架都用到了零拷贝来提升性能,比如我们经常接触到的Kafka 、RocketMQ、Netty 。
零拷贝定义
- “拷贝”:就是指数据从一个存储区域转移到另一个存储区域.
- “零”: 表示次数为 0,它表示拷贝数据的次数为 0。
计算机执行 I/O 操作时,CPU 不需要将数据从一个存储区域复制到另一个存储区域,从而可以减少上下文切换以及 CPU 的拷贝时间。它是一种 I/0 操作优化技术。
传统I/O执行流程
以【文件下载】功能为例,前端发起请求后,服务端的任务就是:将主机磁盘中的文件通过已连接的Socket发出。
关键代码如下:
while((n = read(diskfd,buf,BUF SIZE)) > 0)
write(sockfd,buf ,n);
传统的IO流程,包括read和write两个过程。
read:把数据从【磁盘】--读取到-->【内核缓冲区】--读取到-->【用户缓冲区】
write:把数据写入【socket缓冲区】--写入到-->【网卡设备】
流程图如下:
- 用户应用进程调用 read 函数,向操作系统发起 I/O 调用,上下文从用户态转为内核态(切换 1)
- DMA 控制器把数据从磁盘中,读取到内CPU 把内核缓冲区
- CPU 把内核缓冲区数据,拷贝到用户应用缓冲区,上下文从内核态转为用户态 (切换 2),read 函数返回
- 用户应用进程通过 write 函数,发起 1O 调用,上下文从用户态转为内核态 (切换 3)
- CPU 将应用缓冲区中的数据,拷贝到污贝到网下叹宙,工下文从内核态切换回用户态 (切换4),DMA 控制器把数据从 socket 缓冲区write 函数返回