I/O 控制方式

I/O 控制方式讨论的是:CPU、控制器、主存和设备之间,究竟由谁等待、谁搬数据、谁发出下一步控制信号。

同一件 I/O 读写任务可以有不同控制方式。越往后,CPU 直接参与越少,硬件控制越多,并行性越强。

1000

程序查询方式

程序查询方式也叫程序直接控制方式,关键词是轮询

读操作的大致流程:

  1. CPU 向控制器发出读命令,控制器启动设备。
  2. 控制器把状态寄存器置为“未就绪”或“忙”。
  3. CPU 反复读取状态寄存器,检查设备是否准备好。
  4. 设备把数据送入控制器的数据寄存器,并把状态改为“就绪”。
  5. CPU 发现就绪后,从数据寄存器读入一个字或字符。
  6. CPU 把数据写入主存。
  7. 若还要继续输入,CPU 再发下一次读命令。

这种方式实现简单,但 CPU 在等待期间一直忙等,无法有效利用处理器时间。

项目 程序查询方式
CPU 干预频率 极高,启动、等待、每次传送都要 CPU 参与
传输单位 通常每次一个字或字符
读数据流向 设备 $\rightarrow$ 控制器 $\rightarrow$ CPU $\rightarrow$ 主存
写数据流向 主存 $\rightarrow$ CPU $\rightarrow$ 控制器 $\rightarrow$ 设备
主要优点 控制简单,硬件要求低
主要缺点 CPU 与设备串行工作,CPU 长时间忙等

中断驱动方式

中断驱动方式的关键词是设备完成后主动通知 CPU

CPU 发出 I/O 命令后,不再反复轮询状态寄存器,而是去执行其他程序。设备准备好数据或完成一次传输后,控制器向 CPU 发出中断请求。CPU 响应中断后转入操作系统内核中的中断服务程序,由服务程序完成数据搬运和后续处理。

中断驱动读操作的大致流程:

  1. CPU 向控制器发读命令,等待该 I/O 的进程可被阻塞。
  2. CPU 切换去执行其他程序。
  3. 设备准备好一个字或字符后,控制器提出中断请求。
  4. CPU 在合适时机响应中断,转入内核中断服务程序。
  5. 中断服务程序从控制器数据寄存器取数据,再送入主存缓冲区。
  6. 服务程序更新 I/O 状态,必要时唤醒等待进程。

中断方式解决了查询方式的忙等问题,但每个字或字符仍要经过 CPU。若高速设备频繁中断,CPU 会把大量时间花在中断响应、保护现场、恢复现场和服务程序上。

Note

中断响应和处理流程见 Exception-And-Interrupt-Handling。这里关心的是 I/O 控制方式:中断使 CPU 不必一直轮询,但数据搬运仍由 CPU 参与。

| 项目 | 中断驱动方式 | | --- | --- | | CPU 干预频率 | 高,启动 I/O 和每次数据就绪后都要介入 | | 传输单位 | 通常每次一个字或字符 | | 读数据流向 | 设备 $\rightarrow$ 控制器 $\rightarrow$ CPU $\rightarrow$ 主存 | | 写数据流向 | 主存 $\rightarrow$ CPU $\rightarrow$ 控制器 $\rightarrow$ 设备 | | 主要优点 | CPU 不必忙等,CPU 与设备可并行工作 | | 主要缺点 | 数据仍经过 CPU,频繁中断有明显开销 |

DMA 方式

DMA 是 Direct Memory Access,直接存储器存取。它适合高速块设备。

DMA 的关键变化是:主存与 I/O 设备之间的数据传送不再经过 CPU,而由 DMA 控制器控制。CPU 只在传输开始前做预处理,在传输结束后通过中断做后处理。

1000

DMA 能工作,是因为 DMA 控制器可以临时成为总线主设备。它向 CPU 或总线仲裁逻辑申请总线使用权,获得授权后发出主存地址、读写控制信号,并通过数据线完成设备与主存之间的传送。总线事务本身仍然遵守 总线传输周期总线定时 的约束。

DMA 控制器常见部件:

部件 作用
数据寄存器 DR 暂存每次在设备与主存之间传送的数据
主存地址寄存器 MAR 或地址寄存器 AR 保存当前要访问的主存地址,传送后自动修改
数据计数器 DC 或字计数器 WC 记录还要传送多少数据,计数结束表示块传送完成
命令 / 状态寄存器 CR 保存 CPU 发来的命令、传输方向和设备状态
控制与时序逻辑 协调 DMA 请求、总线请求、读写控制、计数和中断

以数据输入为例,DMA 传送过程可以分成三段:

  1. 传送前预处理:CPU 向 DMA 控制器写入传输方向、主存起始地址、设备地址或端口、传送长度,然后启动设备和 DMA 控制器。
  2. 传送中硬件控制:设备准备好数据后向 DMA 控制器发 DMA 请求;DMA 控制器申请总线,取得总线控制权后,在设备与主存之间传送一个字或一个总线宽度的数据,并自动修改地址和计数。
  3. 传送后中断通知:一整块数据传完后,DMA 控制器向 CPU 发中断请求。CPU 转入内核做后处理,例如检查状态、释放缓冲区、唤醒等待进程。
项目 DMA 方式
CPU 干预频率 中,开始前设置参数,整块传完后处理中断
传输单位 通常按块,块内每次总线传一个字或若干字节
读数据流向 设备 $\rightarrow$ DMA 控制器 $\rightarrow$ 主存
写数据流向 主存 $\rightarrow$ DMA 控制器 $\rightarrow$ 设备
主要优点 数据不经过 CPU,适合高速块设备,CPU 与设备并行性高
主要缺点 需要 DMA 控制器;离散块或多缓冲区可能需要多次设置和中断

CPU 与 DMA 的访存冲突

DMA 传送要访问主存,CPU 执行程序也可能访问主存。两者同时访问主存时会发生冲突,需要规定主存使用方式。

1000

方式 做法 特点
停止 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 处理器。

1000

通道控制方式的大致流程:

  1. CPU 编制或指定主存中的通道程序。
  2. CPU 执行 I/O 指令,告诉通道:通道程序在哪里、要操作哪个设备。
  3. CPU 去执行其他程序。
  4. 通道执行通道程序,控制一个或多个控制器、设备完成一组 I/O 操作。
  5. 通道完成任务后向 CPU 发中断。
  6. 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$ 主存 大量设备、大型系统