零拷贝原理
日期: 2019-12-30 分类: 个人收藏 388次阅读
传统的IO操作需要在内核缓冲区和用户缓冲区之间利用CPU进行数据拷贝。
零拷贝:可以在某种程度上减少甚至完全避免不必要的CPU数据拷贝操作。
换而言之,在数据拷贝的通知,允许CPU去干其他活。
目标:
数据拷贝:
1、避免操作系统内核缓冲区之间进行数据拷贝操作。
2、避免操作系统内核和用户应用程序之间进行数据拷贝操作。
3、用户应用程序可以避开操作系统直接访问硬件存储。
4、数据传输尽量让DMA来做。
多种操作:
1、避免不必要的系统调用和上下文切换。
2、需要拷贝的数据可以先被缓存起来。
3、对数据进行处理尽量让硬件来做。
零拷贝原理:
IO读写方式:
1、中断(中断次数取决于缓冲寄存器的大小)
1、用户进程发起数据读取请求
2、系统调度为该进程分配CPU
3、CPU向IO控制器(IDE,SCSI)发出IO请求
4、用户进程等待IO完成,让出CPU
5、系统调度CPU执行其他任务
6、数据写入至IO控制器的缓冲寄存器
7、缓冲寄存器满了向CPU发出中断信号
8、CPU读取数据至内存
2、DMA:直接内存存取
1、用户进程发起数据读取请求
2、系统调度为该进程分配CPU
3、CPU向DMA发送IO请求
4、用户进程等待IO完成,让出CPU
5、系统调度CPU去执行其他任务
6、数据写入至IO控制器的缓冲寄存器
7、DMA不断获取缓冲寄存器中的数据
8、传输至内存
9、所需的全部数据获取完毕后向CPU发出中断信号
3、数据拷贝
下面展示了传统方式读取数据后并通过网络发送所发生的数据拷贝
1、一个read系统调用后,DMA执行了一次数据拷贝,从磁盘到内核空间
2、read结束后,发生第二次数据拷贝,由CPU将数据从内核空间拷贝至用户空间
3、send系统调用,CPU发生第三次数据拷贝,由CPU将数据从用户空间拷贝至内核空间(Socket缓冲区)
4、另外,这四个过程,每个过程都发生一次上下文切换
除特别声明,本站所有文章均为原创,如需转载请以超级链接形式注明出处:SmartCat's Blog
精华推荐