DMA控制器

前言

大家好,我是jiantaoyab,这是我作为学习笔记的25篇,本篇文章给大家介绍DMA。

无论 I/O 速度如何提升,比起 CPU,总还是太慢。如果我们对于 I/O 的操作,都是由 CPU 发出对应的指令,然后等待 I/O 设备完成操作之后返回,那 CPU 有大量的时间其实都是在等待 I/O 设备完成操作。

但是,这个 CPU 的等待,在很多时候,其实并没有太多的实际意义。我们对于 I/O 设备的大量操作,其实都只是把内存里面的数据,传输到 I/O 设备而已,特别是当传输的数据量比较大的时候,比如进行大文件复制,如果所有数据都要经过 CPU,实在是有点儿太浪费时间了。

因此,计算机工程师们,就发明了 DMA 技术,也就是直接内存访问(Direct Memory Access)技术,来减少 CPU 等待的时间。

理解 DMA,一个协处理器

DMA 技术就是在主板上放一块独立的芯片。在进行内存和 I/O 设备的数据传输的时候,不再通过 CPU 来控制数据传输,而直接通过DMA 控制器(DMA Controller,简称 DMAC)。这块芯片,我们可以认为它其实就是一个协处理器(Co-Processor)。

DMAC 最有价值的地方体现在,当我们要传输的数据特别大、速度特别快,或者传输的数据特别小、速度特别慢的时候。

比如说,我们用千兆网卡或者硬盘传输大量数据的时候,如果都用 CPU 来搬运的话,肯定忙不过来,所以可以选择 DMAC。而当数据传输很慢的时候,DMAC 可以等数据到齐了,再发送信号,给到 CPU 去处理,而不是让 CPU 在那里等待。

DMAC 是在“协助”CPU,完成对应的数据传输工作。在 DMAC 控制数据传输的过程中,我们还是需要 CPU 的。

除此之外,DMAC 其实也是一个特殊的 I/O 设备,它和 CPU 以及其他 I/O 设备一样,通过连接到总线来进行实际的数据传输。

总线上的设备,其实有两种类型。一种我们称之为主设备(Master),另外一种,我们称之为从设备(Slave)。

想要主动发起数据传输,必须要是一个主设备才可以,CPU 就是主设备。而从设备(比如硬盘)只能接受数据传输。

所以,如果通过 CPU 来传输数据,要么是 CPU 从 I/O 设备读数据,要么是 CPU 向 I/O 设备写数据。

那 I/O 设备不能向主设备发起请求么?可以是可以,不过这个发送的不是数据内容,而是控制信号。I/O 设备可以告诉 CPU,我这里有数据要传输给你,但是实际数据是 CPU 从拉走的,而不是 I/O 设备推给 CPU 的。

image-20240325220400315

不过DMAC 它既是一个主设备,又是一个从设备。对于 CPU 来说,它是一个从设备;对于硬盘这样的 IO 设备来说呢,它又变成了一个主设备。

那使用 DMAC 进行数据传输的过程究竟是什么样的呢?下面我们来具体看看。

  1. 首先,CPU 还是作为一个主设备,向 DMAC 设备发起请求。这个请求,其实就是在 DMAC 里面修改配置寄存器。
  2. CPU 修改 DMAC 的配置的时候,会告诉 DMAC 这样几个信息:
  • 首先是源地址的初始值以及传输时候的地址增减方式
    所谓源地址,就是数据要从哪里传输过来。如果我们要从内存里面写入数据到硬盘上,那么就是要读取的数据在内存里面的地址。如果是从硬盘读取数据到内存里,那就是硬盘的 I/O 接口的地址。I/O 的地址可以是一个内存地址,也可以是一个端口地址。而地址的增减方式就是说,数据是从大的地址向小的地址传输,还是从小的地址往大的地址传输。
  • 其次是目标地址初始值和传输时候的地址增减方式。目标地址自然就是和源地址对应的设备,也就是我们数据传输的目的地。
  • 第三个自然是要传输的数据长度,也就是我们一共要传输多少数据。
  1. 设置完这些信息之后,DMAC 就会变成一个空闲的状态(Idle)。

  2. 如果我们要从硬盘上往内存里面加载数据,这个时候,硬盘就会向 DMAC 发起一个数据传输请求。这个请求并不是通过总线,而是通过一个额外的连线。

  3. 然后,我们的 DMAC 需要再通过一个额外的连线响应这个申请。

  4. 于是,DMAC 这个芯片,就向硬盘的接口发起要总线读的传输请求。数据就从硬盘里面,读到了 DMAC 的控制器里面。

  5. 然后,DMAC 再向我们的内存发起总线写的数据传输请求,把数据写入到内存里面。

  6. DMAC 会反复进行上面第 6、7 步的操作,直到 DMAC 的寄存器里面设置的数据长度传输完成。

  7. 数据传输完成之后,DMAC 重新回到第 3 步的空闲状态。

所以,整个数据传输的过程中,不是通过 CPU 来搬运数据,而是由 DMAC 这个芯片来搬运数据。但是 CPU 在这个过程中也是必不可少的。因为传输什么数据,从哪里传输到哪里,其实还是由 CPU 来设置的。这也是为什么,DMAC 被叫作“协处理器”。

image-20240325220704317

最早,计算机里是没有 DMAC 的,所有数据都是由 CPU 来搬运的。

随着对于数据传输的需求越来越多,先是出现了主板上独立的 DMAC 控制器。到了今天,各种 I/O 设备越来越多,数据传输的需求越来越复杂,使用的场景各不相同。加之显示器、网卡、硬盘对于数据传输的需求都不一样,所以各个设备里面都有自己的 DMAC 芯片了。

Kafka 的实现原理

过去几年的大数据浪潮里面有一个开源项目很好地利用了 DMA 的数据传输方式,通过 DMA 的方式实现了非常大的性能提升。这个项目就是Kafka

Kafka 是一个用来处理实时数据的管道,我们常常用它来做一个消息队列,或者用来收集和落地海量的日志。作为一个处理实时数据和日志的管道,瓶颈自然也在 I/O 层面。

Kafka 里面会有两种常见的海量数据传输的情况。一种是从网络中接收上游的数据,然后需要落地到本地的磁盘上,确保数据不丢失。另一种情况则是从本地磁盘上读取出来,通过网络发送出去。

我们来看一看后一种情况,从磁盘读数据发送到网络上去。如果我们自己写一个简单的程序,最直观的办法,自然是用一个文件读操作,从磁盘上把数据读到内存里面来,然后再用一个 Socket,把这些数据发送到网络上去。

在这个过程中,数据一共发生了四次传输的过程。其中两次是 DMA 的传输,另外两次,则是通过 CPU 控制的传输。下面我们来具体看看这个过程。

第一次传输,是从硬盘上,读到操作系统内核的缓冲区里。这个传输是通过 DMA 搬运的。

第二次传输,需要从内核缓冲区里面的数据,复制到我们应用分配的内存里面。这个传输是通过 CPU 搬运的。

第三次传输,要从我们应用的内存里面,再写到操作系统的 Socket 的缓冲区里面去。这个传输,还是由 CPU 搬运的。

最后一次传输,需要再从 Socket 的缓冲区里面,写到网卡的缓冲区里面去。这个传输又是通过 DMA 搬运的。

image-20240325220928619

我们只是要“搬运”一份数据,结果却整整搬运了四次。而且这里面,从内核的读缓冲区传输到应用的内存里,再从应用的内存里传输到 Socket 的缓冲区里,其实都是把同一份数据在内存里面搬运来搬运去,特别没有效率。

像 Kafka 这样的应用场景,其实大部分最终利用到的硬件资源,其实又都是在干这个搬运数据的事儿。所以,我们就需要尽可能地减少数据搬运的需求。

Kafka 做的事情就是,把这个数据搬运的次数,从上面的四次,变成了两次,并且只有 DMA 来进行数据搬运,而不需要 CPU。

Kafka 的代码调用了 Java NIO 库,具体是 FileChannel 里面的 transferTo 方法。数据并没有读到中间的应用内存里面,而是直接通过 Channel,写入到对应的网络设备里。并且,对于 Socket 的操作,也不是写入到 Socket 的 Buffer 里面,而是直接根据描述符(Descriptor)写入到网卡的缓冲区里面。于是,在这个过程之中,我们只进行了两次数据传输。

image-20240325221044727

第一次,是通过 DMA,从硬盘直接读到操作系统内核的读缓冲区里面。

第二次,则是根据 Socket 的描述符信息,直接从读缓冲区里面,写入到网卡的缓冲区里面,同一份数据传输的次数从四次变成了两次,并且没有通过 CPU 来进行数据搬运,所有的数据都是通过 DMA 来进行传输的。

在这个方法里面,我们没有在内存层面去“复制(Copy)”数据,所以这个方法,也被称之为零拷贝(Zero-Copy)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/770304.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

带气压高度的三点法MATLAB定位函数(基于加权最小二乘法WLS)

函数作用 输入气压高度值、待定位节点与各个锚节点的距离、锚节点位置、权重(可选),输出待测点位置 程序源码 function [p_out] triposition_weight_Ver2(dairheight,R_calcu,baseP,varargin) % airghight 由气压高度计算的锚节点-待测节…

【数据结构】线性表的定义与基本操作

🎈个人主页:豌豆射手^ 🎉欢迎 👍点赞✍评论⭐收藏 🤗收录专栏:数据结构 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进…

用户态和内核态:操作系统权限与运行模式解析

在现代计算机操作系统中,用户态(User Mode)和内核态(Kernel Mode)是两种重要的运行模式,用于区分用户程序与操作系统核心之间的权限和特权级别。深入理解这两种模式对于理解操作系统的工作原理至关重要。 …

关于vector的size,unsigned int类型

平时写代码很少注意溢出&#xff0c;这次被遇上了。 题目&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; class Solution { public:bool containsNearbyDuplicate(vector<int>& nums, int k) {//超时,O(n2)// for(int i0;i<nums.size();i)// {// fo…

学习次模函数-第2章 定义

纵观本专著&#xff0c;我们认为及其幂集&#xff08;即&#xff0c; 所有子集的集合&#xff09;&#xff0c;其基数为。我们也考虑一个实值集函数&#xff0c;使得。 与凸函数的一般约定相反&#xff08;见附录A&#xff09;&#xff0c;我们不允许函数有无穷大的值。 次模分…

ssm004新生报到系统+jsp

新生报到系统的设计与实现 摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对新生报到信息管理混乱&#xff0c;出错率…

虚拟线圈法的车辆统计_3.12

目标 车流量统计的方法实现车流量检测 基于虚拟线圈法的车辆统计是一种利用计算机视觉技术模拟传统物理线圈检测原理&#xff0c;对交通视频流中的车辆进行计数的方法。在传统交通监控系统中&#xff0c;物理线圈是通过感应车辆经过时产生的电磁场变化来记录车辆流量。这种方式…

基于深度学习的图像分类方法

基于深度学习的图像分类方法已经成为计算机视觉领域的重要组成部分。这类方法通常涉及使用深度神经网络&#xff0c;特别是卷积神经网络&#xff08;CNNs&#xff09;来识别和分类图像中的对象。以下是基于深度学习的图像分类方法的一些关键要点&#xff1a; 卷积神经网络&…

数据库ER图和ER图转换关系模式

ER图&#xff08;Entity-Relationship Diagram&#xff09;是一种用于描述实体&#xff08;Entity&#xff09;之间关系的图形化工具。ER图是由实体、属性和关系组成的。 实体&#xff08;Entity&#xff09;指的是现实世界中的一个对象或概念&#xff0c;如人、物、事件等。每…

安全问题

信息安全具有不可证明的特性&#xff0c;只能说在某些已知攻击下是安全的&#xff0c;对于将来新的攻击是否安全仍然很难断言。 信息系统不安全的主要因素有程序设计漏洞、用户操作不当和外部攻击。外部攻击形式主要有计算机病毒、恶意软件、黑客攻击等。目前计算机系统在理论…

模型怎么处理不同尺寸的输入图像

1.有全连接层的的CNN模型 卷积能够处理不同尺寸的输入图像&#xff0c;但全连接层不行&#xff0c;因此在送入全连接层之前需将卷积层提取的特征转换为一个固定长度的特征向量。 那么如何转换&#xff1f; 1.1 GAP(Global Average Pooling)全局平均池化 直接代码举例&#…

MySQL数据库备份及恢复

一、数据库备份的分类 1.1 从物理与逻辑的角度 从物理与逻辑的角度&#xff0c;备份可分为物理备份、逻辑备份 物理备份:对数据库操作系统的物理文件(如数据文件日志文件等)的备份 物理备份方法 冷备份(脱机备份)是在关闭数据库的时候进行的 热备份(联机备份):数…

大数据基础:Linux基础详解

课程介绍 本课程主要通过对linux基础课程的详细讲解&#xff0c;让大家熟练虚拟机的安装使用&#xff0c;Linux系统的安装配置&#xff0c;学习掌握linux系统常用命令的使用&#xff0c;常用的软件安装方法&#xff0c;制作快照&#xff0c;克隆&#xff0c;完成免密登录&…

校园跑腿大学生创业平台

校园跑腿大学生创业是一个充满挑战与机遇的领域。随着大学生消费能力的提升和校园生活的多样化&#xff0c;校园跑腿服务的需求日益旺盛&#xff0c;这为有志于创业的大学生提供了良好的市场机遇。 首先&#xff0c;创业成本低是校园跑腿大学生创业的一大优势。校园跑腿服务通常…

异常处理篇

文章目录 1. try 和 except2. 多个 except 块3. else 块4. finally 块5. raise 语句6. 自定义异常7. 异常链 1. try 和 except try 块包含可能引发异常的代码&#xff0c;而 except 块则包含处理这些异常的代码。 try:# 尝试执行可能会引发异常的代码result 10 / 0 # 这将引…

【Unity】uDD插件抓屏文字显示不清晰怎么办?

【背景】 之前介绍过用一款简称uDD&#xff08;uDesktopDuplication&#xff09;的开源插件抓取电脑桌面。整体效果不错&#xff0c;看电影很流畅。但是当切换到文档&#xff0c;或者仔细看任何UI的文字部分时&#xff0c;发现就模糊了。 【分析】 由于是依托于Canvas上的Te…

后端开发辅助

maven仓库手动添加jar命令 mvn install:install-file -DfileD:\\spire.xls-4.6.5.jar -DgroupIde-iceblue -DartifactIdspire.xls -Dversion4.6.5 -Dpackagingjaroracle调用存储过程示例 DECLAREPO_ERRCODE VARCHAR2(100);PO_ERRMSG VARCHAR2(100);BEGIN-- Call the procedure…

一个程序员老兵的自白~

听人劝、吃饱饭,不要订阅该文所属专栏。 想要挑战一下自己的小伙伴可扫文末名片! 作者:哈哥撩编程(视频号、抖音、公众号同名) 新星计划全栈领域优秀创作者博客专家全国博客之星第四名超级个体COC上海社区主理人特约讲师谷歌亚马逊演讲嘉宾科技博主极星会首批签约作者�…

vue学习日记10:综合案例-购物车

一、需求说明 1.渲染功能 &#xff08;1&#xff09;代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><meta name&quo…

2024年软件测试面试题大全【含答案】

一、面试基础题 简述测试流程: 1、阅读相关技术文档&#xff08;如产品PRD、UI设计、产品流程图等&#xff09;。 2、参加需求评审会议。 3、根据最终确定的需求文档编写测试计划。 4、编写测试用例&#xff08;等价类划分法、边界值分析法等&#xff09;。 5、用例评审(…