Young87

当前位置:首页 >个人收藏

零拷贝原理

传统的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

上一篇: 第三十三篇,Django的Auth认证系统之扩展User模型

下一篇: 谈谈自定义注解及相关开发实践

精华推荐