零拷贝zero copy

零拷贝的概念


零拷贝:CPU不执行拷贝数据的任务

优点:

  • 减少不必要的cpu拷贝
  • 减少内存带宽的使用
  • 减少系统态用户态的切换

传统IO


在这里插入图片描述
四次用户态系统态的切换
四次数据拷贝(两次DMA拷贝,两次cpu拷贝)

  1. 硬盘到内核空间
  2. 内核空间到用户空间(cpu)
  3. 用户空间到socket buffer(cpu)
  4. socket buffer到协议引擎

基于SendFile实现的零拷贝


在这里插入图片描述
两次用户态系统态的切换
三次数据拷贝,两次DMA拷贝,一次cpu拷贝

  1. 硬盘到内核空间缓冲区
  2. 内核空间缓冲区到socket buffer(cpu)
  3. socket buffer到协议引擎

带DMA的sendFile零拷贝


在这里插入图片描述
两次系统态用户态的切换,两次DMA拷贝

  1. 硬盘到内核空间
    描述信息拷贝到socket buffer,a)kernel buffer的内存地址;b)kernel buffer的偏移量
  2. 内核空间缓冲区拷贝到协议引擎

基于mmap实现的零拷贝


在这里插入图片描述
四次用户态系统态的切换,两次DMA拷贝,一次cpu拷贝。

  1. 硬盘到内核空间缓冲区
  2. 内核空间缓冲区到socket buffer
  3. socket buffer到协议引擎

FileChannel的tranfromTo是零拷贝的实现。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面我来为您图解一下Linux DMA拷贝数据到用户态的零拷贝Zero-Copy)技术。 首先,我们需要了解什么是DMA(Direct Memory Access,直接内存访问)技术。DMA是一种数据传输技术,它允许外设直接访问系统内存,而无需CPU的干预,从而提高数据传输效率。 在Linux中,当我们需要将数据从内核态传输到用户态时,通常情况下需要经过两次数据拷贝。第一次是将数据从设备驱动程序复制到内核缓冲区,第二次是将数据从内核缓冲区复制到用户空间缓冲区。这两次数据拷贝会消耗大量CPU资源,影响系统性能。 为了解决这个问题,Linux内核引入了零拷贝技术。零拷贝技术是指数据传输时,数据不需要经过CPU的拷贝,而是直接从内核空间传输到用户空间。这样可以减少CPU的负担,提高系统性能。 下面是零拷贝技术的流程图: ![DMA零拷贝技术流程图](https://img-blog.csdn.net/20180908100849451?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2JhY2tpbmcyMDE4/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/q/50) 1. 应用程序发起读取请求。 2. 系统调用将请求传递给驱动程序。 3. 驱动程序将请求转换为DMA请求,并向DMA控制器发出请求。 4. DMA控制器将数据从设备读入内核缓冲区中。 5. DMA控制器将数据从内核缓冲区中直接传输到用户空间缓冲区,无需经过CPU。 6. DMA控制器传输完成后,向驱动程序发送通知。 7. 驱动程序将传输完成的数据返回给应用程序。 通过零拷贝技术,可以减少CPU的拷贝次数,提高数据传输效率,从而提高系统性能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值