7.3 DMA 方式
DMA 方式的特点;DMA 控制器的组成与功能;DMA 的传送过程(预处理、数据传送、后处理)与三种传送方式(停止 CPU 访存、周期挪用、交替访存);DMA 方式与中断方式的比较;通道控制方式与 I/O 处理机;各种 I/O 方式下 CPU 时间占用率的计算。
DMA 方式的特点
在中断方式下,每传送一个字(或字节)都要 CPU 执行一次中断服务程序,对磁盘、网卡这类高速、成批传送数据的设备来说开销太大。DMA(Direct Memory Access,直接存储器存取)方式在主存与外设之间开辟一条直接的数据通路,数据传送完全由硬件(DMA 控制器)控制,不经过 CPU,也不需要保护和恢复 CPU 的现场。
- 主存与 CPU 的固定联系脱钩,主存既可以被 CPU 访问,也可以被外设直接访问;
- 数据块传送时,主存地址的确定、传送字数的计数等都由硬件电路直接实现;
- 主存中要开辟专用的缓冲区,及时供给和接收外设的数据;
- 传送速度快,CPU 与外设并行工作,提高了系统效率;
- 传送开始前要通过程序进行预处理,结束后要通过中断方式进行后处理。
DMA 控制器的组成
| 部件 | 作用 |
|---|---|
| 主存地址计数器 AR | 存放要交换数据的主存地址,每传送一个字自动加 1 |
| 传送长度计数器 WC | 记录传送数据的长度(字数),每传送一个字减 1,计数到 0(溢出)时表示数据块传送完毕,自动发出中断请求 |
| 数据缓冲寄存器 DR | 暂存每次传送的数据 |
| DMA 请求触发器 | 设备准备好数据后使它置位,向控制/状态逻辑发出 DMA 请求 |
| 控制/状态逻辑 | 指定传送方向、修改传送参数,协调 DMA 请求信号与 CPU 响应信号 |
| 中断机构 | 数据块传送完毕后向 CPU 提出中断请求 |
DMA 控制器的主要功能:接受外设发出的 DMA 请求,并向 CPU 发出总线请求;CPU 响应后发出总线响应信号,DMA 控制器接管总线控制权;确定传送数据的主存地址及长度,并能自动修改;规定传送方向,发出读写控制信号,执行数据传送;向 CPU 报告 DMA 操作的结束。
DMA 的传送过程
DMA 的数据传送分为三个阶段:
- 预处理:由 CPU 执行几条 I/O 指令完成。测试设备状态,向 DMA 控制器写入主存起始地址、传送字数、传送方向等参数,启动设备。然后 CPU 继续执行原来的程序。
- 数据传送:设备准备好数据后向 DMA 控制器发出 DMA 请求,DMA 控制器再向 CPU 申请总线。获得总线后由 DMA 控制器控制数据在主存与外设之间传送。以数据块为单位传送时,这一循环也是由 DMA 控制器(硬件) 实现的,而不是由 CPU 执行程序实现的。
- 后处理:数据块传送完毕后,DMA 控制器向 CPU 发出中断请求,CPU 执行中断服务程序做结束处理:校验送入主存的数据是否正确、测试传送过程是否出错、决定是否继续用 DMA 传送其他数据块等。
DMA 的传送方式
DMA 传送数据不经过 CPU,但当外设与 CPU 同时要访问主存时就会发生冲突。DMA 控制器与 CPU 通常采用以下三种方式分享主存:
- 停止 CPU 访存:DMA 控制器向 CPU 发出停止信号,CPU 脱离总线、停止访存,直到一整块数据传送结束才把总线交还给 CPU。控制简单,适合数据传输率很高的设备成组传送;但 DMA 访存期间 CPU 基本处于不工作状态,CPU 的效能没有充分发挥。
- 周期挪用(周期窃取):外设每传送一个数据,就挪用一个(或几个)存储周期,传送完立即释放总线。若外设请求访存时 CPU 不在访存,二者不冲突;若 CPU 正在访存,要等当前存储周期结束后 CPU 才让出总线;若二者同时请求访存,I/O 访存的优先级高于 CPU,因为外设不立即访存就可能丢失数据。周期挪用既实现了 I/O 传送,又较好地发挥了主存与 CPU 的效率,是最常用的方式;但每挪用一个周期,DMA 接口都要申请、建立和归还总线控制权。适用于外设读写周期大于主存存取周期的情况。
- DMA 与 CPU 交替访存:适用于 CPU 的工作周期比主存存取周期长的情况,例如 CPU 工作周期为 1.2 μs、主存存取周期小于 0.6 μs,就可以把一个 CPU 周期分为 C1、C2 两半,C1 专供 DMA 访存,C2 专供 CPU 访存。这种方式不需要申请、建立和归还总线使用权,总线使用权由 C1、C2 分时控制;但硬件逻辑更复杂。
DMA 方式与中断方式的比较
| 中断方式 | DMA 方式 | |
|---|---|---|
| 数据传送 | 由程序控制(CPU 执行中断服务程序) | 由硬件控制(DMA 控制器) |
| 请求的是 | CPU 的处理时间 | 总线的使用权 |
| 响应时机 | 一条指令执行结束后 | 一个**总线周期(存储周期)**结束后,指令执行过程中也可以响应 |
| 是否中断现行程序 | 是,要保护和恢复现场 | 否,CPU 只是让出总线,不需要保护现场 |
| 中断请求的用途 | 传送数据 | 数据块传送结束后的后处理 |
| 优先级 | 低于 DMA 请求 | 高于中断请求 |
| CPU 与外设的并行 | 外设准备数据时并行,传送数据时 CPU 参与 | 传送数据时 CPU 也可以并行工作(仅访存冲突时暂停) |
| 适用场合 | 所有设备,特别是低速设备;还能处理异常事件 | 高速设备的成批数据传送 |
通道控制方式与 I/O 处理机
DMA 方式进一步发展,就是通道和 I/O 处理机方式,CPU 对 I/O 的干预更少。
通道是一个具有特殊功能的处理器,它有自己的指令(通道指令)和程序(通道程序),通过执行通道程序来控制数据的传送。与 DMA 控制器相比:DMA 控制器用专门设计的硬件逻辑控制数据传送,通常只能控制一台或少数几台同类设备;通道则通过执行通道程序进行控制,一个通道可以同时控制许多台同类或不同类的设备,独立处理 I/O 的能力更强,还能用指令灵活地改变传送的顺序。
通道完成一次数据传输的过程分为三步:
- 用户程序用访管指令进入操作系统的管理程序,由 CPU 通过管理程序组织一个通道程序,并启动通道;
- 通道执行 CPU 为它组织的通道程序,完成指定的数据输入/输出工作,期间 CPU 可以执行其他程序;
- 通道程序结束后向 CPU 发出中断请求,CPU 响应后再次调用管理程序进行处理。
按数据传送方式,通道分为字节多路通道(多台低速设备以字节为单位交叉传送)、选择通道(一段时间内只为一台高速设备服务,以数据块为单位传送)和数组多路通道(多台高速设备以数据块为单位交叉传送)。
I/O 处理机(外围处理机)的结构更接近一般的处理机,甚至就是一台小型通用计算机。它不仅能完成通道的 I/O 控制,还能完成码制变换、格式处理、数据块的检错与纠错等操作,进一步减轻了 CPU 的负担。
计算 CPU 用于 I/O 的时间
三种方式下 CPU 用于 I/O 的时间占比都可以这样计算:
区别在于 CPU 介入的频率:查询和中断方式每传送一个数据单位就介入一次,DMA 方式每传送一个数据块才介入一次。
| 方式 | 每秒 CPU 介入次数 | 每次开销(时钟) | 每秒占用时钟 | 占 CPU 时间 |
|---|---|---|---|---|
| 程序查询 | 125 K次 | 100 | 12.5 M | 2.5% |
| 程序中断 | 125 K次 | 100 | 12.5 M | 2.5% |
| DMA | 100 次 | 500 | 50 K | 0.01% |
- 程序查询:为不丢失数据,每秒至少查询 125 K次(每次 4 B)
- 程序中断:每传送 4 B 中断一次,每次 (18 + 2) × 5 = 100 个时钟
- DMA:每传送 5000 B(一个数据块)CPU 只参与一次预处理和后处理
某计算机的 CPU 主频为 500 MHz,CPI 为 5。假定某外设的数据传输率为 0.5 MB/s,采用中断方式与主机进行数据传送,以 32 位为传输单位,对应的中断服务程序包含 18 条指令,中断服务的其他开销相当于 2 条指令的执行时间。(1)在中断方式下,CPU 用于该外设 I/O 的时间占整个 CPU 时间的百分比是多少?(2)当该外设的数据传输率达到 5 MB/s 时,改用 DMA 方式传送数据。假定每次 DMA 传送块大小为 5000 B,且 DMA 预处理和后处理的总开销为 500 个时钟周期,则 CPU 用于该外设 I/O 的时间占整个 CPU 时间的百分比是多少?(假设 DMA 与 CPU 之间没有访存冲突)
查看解答
(1)每秒中断 0.5 MB / 4 B = 1.25 × 10⁵ 次;每次中断需 (18 + 2) × 5 = 100 个时钟周期;占比 = 1.25 × 10⁵ × 100 / (500 × 10⁶) = 2.5%。
(2)每秒 DMA 传送 5 MB / 5000 B = 1000 次;占比 = 1000 × 500 / (500 × 10⁶) = 0.1%。
在上面的计算器中输入这些参数即可验证。
即时练习
- 1下列关于中断 I/O 方式和 DMA 方式比较的叙述中,错误的是( )。
- 2下列关于 DMA 方式的叙述中,正确的是( )。
Ⅰ. DMA 传送前由设备驱动程序设置传送参数 Ⅱ. 数据传送前由 DMA 控制器请求总线使用权 Ⅲ. 数据传送由 DMA 控制器直接控制总线完成 Ⅳ. DMA 传送结束后的处理由中断服务程序完成 - 3在 DMA 传送方式中,「周期挪用」是指( )。
- 4DMA 控制器与 CPU 同时请求访问主存时,通常( )。
- 5下列关于 DMA 方式的叙述中,错误的是( )。
标记完成后,侧栏会显示进度。进度仅保存在本浏览器中。