有必要了解一下Linux中零拷贝原理
零拷贝」描述的是计算机操作系统当中,CPU不执行将数据从一个内存区域,拷贝到另外一个内存区域的任务。通过网络传输文件时,这样通常可以节省 CPU 周期和内存带宽。 从描述中已经了解到零拷贝技术给我们带来的好处: 1、节省了 CPU 周期,空出的 CPU 可以完成更多其他的任务 2、减少了内存区域之间数据拷贝,节省内存带宽 3、减少用户态和内核态之间数据拷贝,提升数据传输效率 4、应用零拷贝技术,减少用户态和内核态之间的上下文切换 传统 IO 数据拷贝原理
在正式分析零拷贝机制原理之前,我们先来看下传统 IO 在数据拷贝的基本原理,从数据拷贝 (I/O 拷贝) 的次数以及上下文切换的次 2、通过 DMA 引擎建数据从磁盘拷贝到内核态空间的输入的 socket 缓冲区中(第一次拷贝) 3、将内核态空间缓冲区的数据原封不动的拷贝到用户态空间的缓存区中(第二次拷贝),同时内核态空间切换到用户态空间(第二次上下文切换),read() 系统调用结束 4、JVM 进程内业务逻辑代码执行 5、JVM 进程内发起 write() 系统调用 6、操作系统由用户态空间切换到内核态空间(第三次上下文切换),将用户态空间的缓存区数据原封不动的拷贝到内核态空间输出的 socket 缓存区中(第三次拷贝) 7、write() 系统调用返回,操作系统由内核态空间切换到用户态空间(第四次上下文切换),通过 DMA 引擎将数据从内核态空间的 socket 缓存区数据拷贝到协议引擎中(第四次拷贝) 传统 IO 方式,一共在用户态空间与内核态空间之间发生了 4 次上下文的切换,4 次数据的拷贝过程,其中包括 2 次 DMA 拷贝和 2 次 I/O 拷贝(内核态与用户应用程序之间发生的拷贝)。 内核空间缓冲区的一大用处是为了减少磁盘I/O操作,因为它会从磁盘中预读更多的数据到缓冲区中。而使用 BufferedInputStream 的用处是减少 「系统调用」。 什么是DMA
DMA(Direct Memory Access)—直接内存访问 : 2、通过 DMA 引擎建数据从磁盘拷贝到内核态空间的输入的 socket 缓冲区中(第一次拷贝) 3、将内核态空间缓冲区的数据原封不动的拷贝到用户态空间的缓存区中(第二次拷贝),同时内核态空间切换到用户态空间(第二次上下文切换),read() 系统调用结束 4、JVM 进程内业务逻辑代码执行 5、JVM 进程内发起 write() 系统调用 6、操作系统由用户态空间切换到内核态空间(第三次上下文切换),将用户态空间的缓存区数据原封不动的拷贝到内核态空间输出的 socket 缓存区中(第三次拷贝) 7、write() 系统调用返回,操作系统由内核态空间切换到用户态空间(第四次上下文切换),通过 DMA 引擎将数据从内核态空间的 socket 缓存区数据拷贝到协议引擎中(第四次拷贝) 传统 IO 方式,一共在用户态空间与内核态空间之间发生了 4 次上下文的切换,4 次数据的拷贝过程,其中包括 2 次 DMA 拷贝和 2 次 I/O 拷贝(内核态与用户应用程序之间发生的拷贝)。 内核空间缓冲区的一大用处是为了减少磁盘I/O操作,因为它会从磁盘中预读更多的数据到缓冲区中。而使用 BufferedInputStream 的用处是减少 「系统调用」。 什么是DMA DMA(Direct Memory Access)—直接内存访问 : (编辑:新余站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |