传统IO拷贝与零拷贝技术比较

Posted z-qinfeng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了传统IO拷贝与零拷贝技术比较相关的知识,希望对你有一定的参考价值。

1. 传统IO

技术图片

由上面图知,传统io需要经过4次copy, 3次状态切换

第一次: 从硬盘 经过 DMA 拷贝 到 kernel buffer (内核buferr)

第二次: 从kernel buffer 经过cpu 拷贝到 user buffer ,比如拷贝到应用程序

第三次: 从user buffer 拷贝到 socket buffer 

第四次: 从socket buffer 拷贝到 protocol engine 协议栈

 

第一次状态切换: 用户态---》 内核状 (或者叫着 用户上下文----》 内核上下文)

第二次状态切换: 内核状---》 用户状

第三次状态切换: 用户状---》 内核状

 

DMA : direct memory access  直接内存拷贝

 

2. mmap优化

技术图片

 

mmap : 通过内存映射 ,将文件映射到内核缓冲区,同时用户空间可以共享内核空间的数据。这样在网络传输时就减少了内核空间到用户空间的拷贝次数

 

第一次拷贝: DMA拷贝,从硬件拷贝到内核空间

因为user buffer 与kernel buffer共享数据 ,所以不需要将数据从kernel buffer 拷贝到 user buffer , 数据可以直接在内核空间修改

第二次拷贝: kernel buffer 中的数据经过 cpu 拷贝到 socket buffer 

第三次拷贝: socket buffer 过DMA拷贝到protocol engine 

 

所以 mmp优化之后,拷贝共需要3次, 但是状态 切换还是3次

 

3. sendFile优化

Linux2.4 提供的sendFile实现了真正的零拷贝

技术图片

 

第一次拷贝: DMA拷贝,将数据从硬盘拷贝到kernel buffer 

第二次拷贝: DMA拷贝,将数据从kernel buffer拷贝到protocol engine

没有经过cpu拷贝,也就是操作系统级别的拷贝,实现了真正的零拷贝

 

注意: sendFile技术还是有少量的数据(例如数据的大小,偏移量等)使用了cpu拷贝,从kernel buffer 拷贝到 socket buffer ,但是数据量很少,可忽略 

 

 

 

 

 

 

 

 

 

以上是关于传统IO拷贝与零拷贝技术比较的主要内容,如果未能解决你的问题,请参考以下文章

mmap(内存映射)sendfile() 与零拷贝技术

7. NIO与零拷贝

Linux系统I/O操作与零拷贝

DMA 与零拷贝技术

5.NIO零拷贝与传统IO的文件传输性能比较

Day467&468&469.JavaBIO&NIO编程&AIO&NIO与零拷贝&对比 -netty