关于零拷贝技术的理解

零拷贝技术

场景:

  • 在分析零拷贝技术之前,先设置一个场景:服务端从磁盘文件中读取数据,然后将读取到的数据通过网络传输给客户端。

传统IO

  • 过程:首先服务端会调用read() 函数读取磁盘文件,此时会发生一次系统调用一次系统调用会伴随着两次上下文切换(也就是从用户态到内核态,从内核态到用户态),然后CPU会对DMA(直接内存获取)控制器发起一次对应的IO请求。当磁盘缓冲区准备好数据之后,会向DMA发起一个中断(告知DMA数据已经准备就绪),此时DMA需要将数据从磁盘缓冲区读取到内核缓冲区(此过程是不需要CPU参与的)。只有当DMA读取到足够多的数据后才会向CPU发起一个中断,此时CPU会停止手头上的工作,将内核缓冲区中的数据拷贝到用户缓冲区。将数据发送给客户端的过程时服务端会调用write() 函数通过CPU将用户缓冲区中的数据拷贝到内核Socket缓冲区又一次系统调用。进而通过DMA拷贝到网卡设备,完成数据的传输。
  • 缺陷传统IO一共是会发生四次上下文切换、两次DMA拷贝和两次CPU拷贝。其中系统调用和拷贝是及其浪费性能的。下面的技术会从这两个方面改善传输过程。

mmap + write

  • 改善过程:通过上面的流程可以得知,内核缓冲区拷贝到用户缓冲区,用户缓冲区拷贝到内核缓冲区这两个过程是可以去掉的。mmap这个系统调用函数就是从这个方面完善,当通过DMA技术将磁盘缓冲区中的数据拷贝到内核缓冲区是,使得用户进程和操作系统共享这块内核缓冲区。当再次调用write函数时,直接通过CPU拷贝将内核缓冲区中的数据拷贝到Socket缓冲区中。通过mmap+write将会发生四次上下文切换,两次DMA拷贝和一次CPU拷贝

sendfile

  • 改善过程:其改善系统调用,将mmap+write两步合成一步前提是不会改变数据只会发生一次系统调用, 两次DMA拷贝和一次CPU拷贝

sendfile + SG-DMA

  • 如果网卡支持SG-DMA技术,sendfile将会进一步得到改善,实现真正的零拷贝。优化体现为直接通过SG-DMA拷贝 将内核缓冲区中的数据拷贝到网卡中,省略了CPU拷贝到Sokcet缓冲区的过程。该过程发生一次系统调用和两次DMA拷贝
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值