零拷贝,主要是指内核态数据和用户态数据的拷贝过程。
一、拷贝方式
1. CPU拷贝
在 DMA 技术出现之前,应用程序与磁盘之间的 I/O 操作都是通过 CPU 的中断完成的。每次用户进程读取磁盘数据时,都需要 CPU 中断将数 据读进暂存器,然后发起 I/O 请求等待数据读取和拷贝完成,然后写进其它地方,每次的 I/O 中断都导致 CPU 的上下文切换。
2. DMA拷贝
DMA(Direct Memory Access,直接存储器访问) ,在DMA之前的CPU复制,需要CPU将数据读进暂存器(区别于寄存器),然后写进其它地方,这个过程中,CPU被挤占,而DMA在拷贝时不影响CPU去运行其他任务。
具体流程:CPU对DMA控制器初始化,向I/O接口发出操作命令,I/O接口提出DMA请求。DMA控制器对DMA请求判别优先级及屏蔽,向总线裁决逻辑提出总线请求。当CPU执行完当前总线周期即可释放总线控制权。此时,总线裁决逻辑输出总线应答,表示DMA已经响应,通过DMA控制器通知I/O接口开始DMA传输。
二、计算机处理的任务类类型
1、CPU密集型
CPU密集型就是计算、逻辑判断量非常大而且集中的类型,因为主要占用cpu资源所以又叫cpu密集型,而且当计算任务数等于cpu核心数的时候,是cpu运行效率最高的时候。
特点:消耗cpu
2、 IO密集型
IO密集型就是磁盘的读取数据和输出数据非常大的时候就是属于IO密集型
由于IO操作的运行时间远远大于cpu、内存运行时间,所以任务的大部分时间都是在等待IO操作完成,IO的特点是cpu消耗小。
例如:用户请求获取服务器中一张图片。
read()过程:用户空间(user buffer)-->内核空间(kernel buffer)-->硬盘(Hardware)
图片信息从硬盘加载到内核空间 发生了一次copy过程、 内核空间到用户空间
又发生了一次copy过程。
write()过程:用户空间-->内核空间(socket buffer)-->网卡
图片信息从用户空间加载到内核空间 发生了一次copy过程、内核空间到网卡
又发生了一次copy过程。
整个过程发生了四次copy。数据本身没有改变
三、read()函数交互时序图
那么就有优化空间了,优化数据拷贝会有以下三个方向:
1. 数据没有改变,用户空间和内核空间是不是可以省略数据的copy可以建立映射
2. 数据只在内核态中处理完成。
3. 数据不经内核态处理。