【重难点总结】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方式将磁盘数据读取到内核缓冲区,通过内存映射,使用户缓冲区和内核读缓冲区的内存地址为同一内存地址
本文来自博客园,作者:哥们要飞,转载请注明原文链接:https://www.cnblogs.com/liujinhui/p/15847633.html