零拷贝(zerocopy)三张图

核心概念:linux

用户空间+内核空间+磁盘硬件网络

1.最原始的BIO场景下IO操做流程。并发

读取磁盘上的文件,而后通过网络,将文件发送到另一个磁盘的过程。4次上下文切换,2次文件复制。操作系统

一、JVM发出read() 系统调用。
二、OS上下文切换到内核模式(第一次上下文切换)并将数据读取到内核空间缓冲区。(第一次拷贝:hardware ----> kernel buffer)
三、OS内核而后将数据复制到用户空间缓冲区(第二次拷贝: kernel buffer --> user buffer),而后read系统调用返回。而系统调用的返回又会致使一次内核空间到用户空间的上下文切换(第二次上下文切换)。
四、JVM处理代码逻辑并发送write()系统调用。
五、OS上下文切换到内核模式(第三次上下文切换)并从用户空间缓冲区复制数据到内核空间缓冲区(第三次拷贝: user buffer ——> kernel buffer)。
六、write系统调用返回,致使内核空间到用户空间的再次上下文切换(第四次上下文切换)。将内核空间缓冲区中的数据写到hardware(第四次拷贝: kernel buffer ——> hardware)。blog

  • 总的来讲,传统的I/O操做进行了4次用户空间与内核空间的上下文切换,以及4次数据拷贝。显然在这个用例中,从内核空间到用户空间内存的复制是彻底没必要要的,由于除了将数据转储到不一样的buffer以外,咱们没有作任何其余的事情。因此,咱们能不能直接从hardware读取数据到kernel buffer后,再从kernel buffer写到目标地点不就行了。为了解决这种没必要要的数据复制,操做系统出现了零拷贝的概念。注意,不一样的操做系统对零拷贝的实现各不相同。在这里咱们介绍linux下的零拷贝实现。

2.除去了用户空间和内核空间的文件复制。内存

 

3.DMAit

相关文章
相关标签/搜索