【重难点总结】DMA与kafka零拷贝机制之间的关系

一、DMA介绍

1、概念

DMA(Direct Memory Access,直接存储器访问) 是一种内存访问技术,独立于CPU, 直接读、写系统存储器、外设等

主存与I/0设备之间使用DMA控制器控制一个数据通路(专用数据总线)进行数据传输,无需依赖于CPU进行中断

I/O设备(字符设备和块设备):硬盘、USB、打印机

CPU除了在数据传输开始和结束时做一点处理外(开始和结束时候要做中断处理),在传输过程中CPU可以进行其他的工作。

2、不使用DMA方式时

CPU:将数据复制到CPU的暂存器,再写回到新位置,此时CPU无法使用

3、应用场景

主存与I/O设备之间进行数据交互

例如:运行一个程序,调用一段数据

二、零拷贝机制

1、解决的问题

从磁盘读取一个文件通过网络输出到一个客户端

步骤:从磁盘读取文件,将文件写入到socket(套接字,网卡驱动)

2、传统的传输方式-也需要经过DMA传输

(1)过程描述-4次拷贝

数据从磁盘复制到内核缓冲区

从内核缓冲区复制到用户空间缓冲区【内存】(需要切换到用户态空间)

用户缓冲区复制到内核的socket缓冲区
从socket缓冲区复制到协议引擎(这里是网卡驱动)

(2)kafka图解

硬盘-内存-socket缓冲区-网卡驱动

 2、零拷贝方式-使用Linux内核中sendfile的系统调用(合并缓冲区-内存-socket)

(1)过程描述

从磁盘读取文件内容到内核缓冲区
直接从内核缓冲区复制数据到socket缓冲区(原来:缓冲区-内存/用户空间,内存-socket)
从socket缓冲区复制到协议引擎(这里是网卡驱动)

(2)kafka过程图解

3、零拷贝机制与DMA的关系

无需经过CPU拷贝数据到内存中,直接将读缓冲区的地址写入socket

网卡根据 Socket 的描述符信息,直接从读缓冲区,写入到网卡驱动

应用程序通过调用mmap(),将不同的虚拟地址映射到了同一物理地址,即内核缓冲区,使程序在用户态可以直接读取并操作内核空间的数据

使用DMA方式将磁盘数据读取到内核缓冲区,通过内存映射,使用户缓冲区和内核读缓冲区的内存地址为同一内存地址

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值