IO Control Methods
I/O 控制方式
I/O 控制方式讨论的是:CPU、控制器、主存和设备之间,究竟由谁等待、谁搬数据、谁发出下一步控制信号。
同一件 I/O 读写任务可以有不同控制方式。越往后,CPU 直接参与越少,硬件控制越多,并行性越强。
程序查询方式
程序查询方式也叫程序直接控制方式,关键词是轮询。
读操作的大致流程:
- CPU 向控制器发出读命令,控制器启动设备。
- 控制器把状态寄存器置为“未就绪”或“忙”。
- CPU 反复读取状态寄存器,检查设备是否准备好。
- 设备把数据送入控制器的数据寄存器,并把状态改为“就绪”。
- CPU 发现就绪后,从数据寄存器读入一个字或字符。
- CPU 把数据写入主存。
- 若还要继续输入,CPU 再发下一次读命令。
这种方式实现简单,但 CPU 在等待期间一直忙等,无法有效利用处理器时间。
| 项目 | 程序查询方式 |
|---|---|
| CPU 干预频率 | 极高,启动、等待、每次传送都要 CPU 参与 |
| 传输单位 | 通常每次一个字或字符 |
| 读数据流向 | 设备 $\rightarrow$ 控制器 $\rightarrow$ CPU $\rightarrow$ 主存 |
| 写数据流向 | 主存 $\rightarrow$ CPU $\rightarrow$ 控制器 $\rightarrow$ 设备 |
| 主要优点 | 控制简单,硬件要求低 |
| 主要缺点 | CPU 与设备串行工作,CPU 长时间忙等 |
中断驱动方式
中断驱动方式的关键词是设备完成后主动通知 CPU。
CPU 发出 I/O 命令后,不再反复轮询状态寄存器,而是去执行其他程序。设备准备好数据或完成一次传输后,控制器向 CPU 发出中断请求。CPU 响应中断后转入操作系统内核中的中断服务程序,由服务程序完成数据搬运和后续处理。
中断驱动读操作的大致流程:
- CPU 向控制器发读命令,等待该 I/O 的进程可被阻塞。
- CPU 切换去执行其他程序。
- 设备准备好一个字或字符后,控制器提出中断请求。
- CPU 在合适时机响应中断,转入内核中断服务程序。
- 中断服务程序从控制器数据寄存器取数据,再送入主存缓冲区。
- 服务程序更新 I/O 状态,必要时唤醒等待进程。
中断方式解决了查询方式的忙等问题,但每个字或字符仍要经过 CPU。若高速设备频繁中断,CPU 会把大量时间花在中断响应、保护现场、恢复现场和服务程序上。
中断响应和处理流程见 Exception-And-Interrupt-Handling。这里关心的是 I/O 控制方式:中断使 CPU 不必一直轮询,但数据搬运仍由 CPU 参与。
DMA 方式
DMA 是 Direct Memory Access,直接存储器存取。它适合高速块设备。
DMA 的关键变化是:主存与 I/O 设备之间的数据传送不再经过 CPU,而由 DMA 控制器控制。CPU 只在传输开始前做预处理,在传输结束后通过中断做后处理。
DMA 能工作,是因为 DMA 控制器可以临时成为总线主设备。它向 CPU 或总线仲裁逻辑申请总线使用权,获得授权后发出主存地址、读写控制信号,并通过数据线完成设备与主存之间的传送。总线事务本身仍然遵守 总线传输周期 和 总线定时 的约束。
DMA 控制器常见部件:
| 部件 | 作用 |
|---|---|
数据寄存器 DR |
暂存每次在设备与主存之间传送的数据 |
主存地址寄存器 MAR 或地址寄存器 AR |
保存当前要访问的主存地址,传送后自动修改 |
数据计数器 DC 或字计数器 WC |
记录还要传送多少数据,计数结束表示块传送完成 |
命令 / 状态寄存器 CR |
保存 CPU 发来的命令、传输方向和设备状态 |
| 控制与时序逻辑 | 协调 DMA 请求、总线请求、读写控制、计数和中断 |
以数据输入为例,DMA 传送过程可以分成三段:
- 传送前预处理:CPU 向 DMA 控制器写入传输方向、主存起始地址、设备地址或端口、传送长度,然后启动设备和 DMA 控制器。
- 传送中硬件控制:设备准备好数据后向 DMA 控制器发 DMA 请求;DMA 控制器申请总线,取得总线控制权后,在设备与主存之间传送一个字或一个总线宽度的数据,并自动修改地址和计数。
- 传送后中断通知:一整块数据传完后,DMA 控制器向 CPU 发中断请求。CPU 转入内核做后处理,例如检查状态、释放缓冲区、唤醒等待进程。
| 项目 | DMA 方式 |
|---|---|
| CPU 干预频率 | 中,开始前设置参数,整块传完后处理中断 |
| 传输单位 | 通常按块,块内每次总线传一个字或若干字节 |
| 读数据流向 | 设备 $\rightarrow$ DMA 控制器 $\rightarrow$ 主存 |
| 写数据流向 | 主存 $\rightarrow$ DMA 控制器 $\rightarrow$ 设备 |
| 主要优点 | 数据不经过 CPU,适合高速块设备,CPU 与设备并行性高 |
| 主要缺点 | 需要 DMA 控制器;离散块或多缓冲区可能需要多次设置和中断 |
CPU 与 DMA 的访存冲突
DMA 传送要访问主存,CPU 执行程序也可能访问主存。两者同时访问主存时会发生冲突,需要规定主存使用方式。
| 方式 | 做法 | 特点 |
|---|---|---|
| 停止 CPU 访问主存 | DMA 传送期间 CPU 暂停访存 | 控制简单,但 CPU 利用率低 |
| DMA 与 CPU 交替访存 | 把存取周期分给 CPU 和 DMA,例如 C1 给 DMA,C2 给 CPU | 不需要复杂的总线申请/归还,但硬件时序安排更复杂 |
| 周期挪用,也叫周期窃取 | DMA 需要访存时临时占用一个或几个存取周期 | 常见且灵活;CPU 只在被挪用的周期受影响 |
周期挪用下有三种情况:
- CPU 此时不访问主存:DMA 直接使用主存周期。
- CPU 正在访问主存:等当前存取周期结束后,DMA 挪用后续周期。
- CPU 与 DMA 同时请求主存:通常 DMA 优先,因为设备缓冲区可能溢出或欠载。
这类冲突本质上是总线和主存端口的占用冲突。DMA 提高了块设备吞吐量,但不是绕开了总线;它只是把数据搬运的控制者从 CPU 换成 DMA 控制器。传输完成后,DMA 仍要通过中断让 CPU 进入内核做结束处理,处理流程见 I/O 中断处理程序。
DMA 与中断方式的区别
| 对比项 | 中断驱动方式 | DMA 方式 |
|---|---|---|
| 数据传送控制 | CPU 执行中断服务程序控制 | DMA 控制器硬件控制 |
| 数据是否经过 CPU | 经过 CPU | 不经过 CPU |
| 中断请求时机 | 每个字或字符就绪时可能中断 | 一整块传送完成后中断 |
| CPU 响应时机 | 通常在指令执行周期结束后响应 | DMA 请求可在存取周期结束或总线空闲时响应 |
| 优先级倾向 | 低于 DMA 请求 | 通常高于普通中断请求 |
| 异常处理能力 | 中断服务程序可处理异常事件 | DMA 主要负责数据搬运,异常仍需 CPU 后处理 |
通道控制方式
通道是一种专门管理 I/O 的硬件部件,可以执行通道指令。可以把它理解为功能受限的 I/O 处理器。
通道控制方式的大致流程:
- CPU 编制或指定主存中的通道程序。
- CPU 执行 I/O 指令,告诉通道:通道程序在哪里、要操作哪个设备。
- CPU 去执行其他程序。
- 通道执行通道程序,控制一个或多个控制器、设备完成一组 I/O 操作。
- 通道完成任务后向 CPU 发中断。
- CPU 做结束处理。
| 项目 | 通道控制方式 |
|---|---|
| CPU 干预频率 | 低,一组 I/O 任务开始和结束时介入 |
| 传输单位 | 一组块或一组 I/O 操作 |
| 数据流向 | 在通道控制下,设备与主存之间传送 |
| 主要优点 | CPU、通道、设备并行工作,适合大量设备统一管理 |
| 主要缺点 | 需要专门通道硬件,系统复杂 |
四种方式总表
| 控制方式 | 完成过程 | CPU 干预频率 | 传输单位 | 数据流向 | 典型适用 |
|---|---|---|---|---|---|
| 程序查询 | CPU 发命令后轮询状态,设备就绪后 CPU 搬数据 | 极高 | 字 / 字符 | 设备 $\leftrightarrow$ CPU $\leftrightarrow$ 主存 | 简单低速设备 |
| 中断驱动 | CPU 发命令后去做别的事,设备完成后中断 CPU,CPU 搬数据 | 高 | 字 / 字符 | 设备 $\leftrightarrow$ CPU $\leftrightarrow$ 主存 | 低速或少量数据设备 |
| DMA | CPU 设置参数,DMA 控制器搬运一整块,完成后中断 CPU | 中 | 块 | 设备 $\leftrightarrow$ 主存 | 高速块设备 |
| 通道 | CPU 启动通道程序,通道控制一组 I/O 操作,完成后中断 CPU | 低 | 一组块 / 一组操作 | 设备 $\leftrightarrow$ 主存 | 大量设备、大型系统 |