| 方式 | CPU 参与度 | 数据传输单位 | 效率 |
|---|---|---|---|
| 程序查询方式 | 最高 | 字/字节 | 最低 |
| 程序中断方式 | 高 | 字/字节 | 较低 |
| DMA 方式 | 低 | 数据块 | 较高 |
| 通道方式 | 最低 | 一组块 | 最高 |
CPU 主动轮询 I/O 设备状态寄存器,检测是否准备好。
while (设备未准备好) { 读取状态寄存器; }
从数据寄存器读取数据;
CPU 发出 I/O 命令后继续执行其他程序,设备准备好后主动发中断通知 CPU。
CPU:发送IO命令 → 继续执行其他程序
← 中断!→ 保存现场 → 读取数据 → 恢复现场 → 继续
中断频率:$f_{中断}=B$(设备速率 $B$ 字节/秒,每字节中断一次),CPU 用于 IO 比例 $\eta = B \times t$。
CPU 将 I/O 控制权交给 DMA 控制器,DMA 直接在 I/O 设备与主存间传输,不经过 CPU。
CPU:设置 DMA(方向,地址,字节数) → 继续执行
DMA:自行控制传输 → 完毕 → 发中断通知 CPU
DMA 控制器:MAR(内存地址)、WC(字计数)、DR(数据缓冲)、控制/状态寄存器、中断逻辑。三种总线使用方式:停止 CPU 访存 / 周期挪用 / 交替访问。
通道是专用的 I/O 处理器,有自己的指令系统(通道指令),可独立执行 I/O 程序。
| 类型 | 传输单位 | 复杂度 | 并发性 |
|---|---|---|---|
| 字节多路通道 | 字节 | 低 | 多个低速设备并行 |
| 数组多路通道 | 数据块 | 中 | 多个高速设备交替 |
| 选择通道 | 数据块 | 高 | 一次只服务一个设备 |
每次查询 = 100/500MHz = 200ns
每秒查询 10^6 次 → CPU 占用 10^6 × 200ns = 20%
每秒 10^6 次中断 × 5μs = 500% → 不可行!需 DMA 或缓冲
每秒 256 块 × 20μs = 5.12ms/s = 0.51% CPU 占用
1024 次挪用 × 2ns = 2.048μs 延迟
CPU 被延迟比例 ≈ 20%
| 对比项 | 程序查询 | 程序中断 | DMA | 通道 |
|---|---|---|---|---|
| CPU 参与 | 全程 | 每字 | 开始+结束 | 启动+完成 |
| 传输单位 | 字节 | 字节 | 数据块 | 一组块 |
| 并行性 | 无 | 有 | 有 | 有 |
| CPU 效率 | 最低 | 低 | 高 | 最高 |
| 硬件复杂度 | 最低 | 低 | 中 | 高 |
| 适用设备 | 低速 | 低速 | 高速 | 各类 |
| 灵活性 | 最高 | 高 | 中 | 最高 |
↑ 以上为站内 HTML 相对链接(纯网页可浏览);本页右上「在 Obsidian 中打开」跳回源笔记。