【重难点总结】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方式将磁盘数据读取到内核缓冲区,通过内存映射,使用户缓冲区和内核读缓冲区的内存地址为同一内存地址

posted @ 2022-01-26 18:02  哥们要飞  阅读(193)  评论(0编辑  收藏  举报