程序查询方式(Programmed I/O / Polling)是最简单的 I/O 控制方式。CPU 主动查询设备状态,等待设备就绪后进行数据传输,整个 I/O 过程中 CPU 被占用。
1. CPU 向设备发命令(启动设备)
2. 不断读取状态寄存器(轮询)
3. 检查 Ready 位:
- Ready=0 → 回步骤2继续查询
- Ready=1 → 设备进行数据传输
4. 读/写数据
5. 未完成 → 回步骤2;完成 → 结束
// 输入操作(伪代码)
void input_polling() {
out(CONTROL, START_CMD);
while (1) {
status = in(STATUS);
if (status & READY_BIT) { data = in(DATA); break; }
}
}
CPU 利用率 = 1 - R × (Tquery + Ttransfer) / Ttotal
例:设备每 100ms 传 1 字节,每次查询 1μs
CPU 用于查询 ≈ 100ms → 利用率极低
CPU 按固定顺序循环查询各设备。问题:响应延迟不均、高优先级设备得不到及时服务。
可按优先级查询(先查高优先级设备)缓解,但仍是串行、不能真正并发。
| 特性 | 程序查询 | 程序中断 | DMA |
|---|---|---|---|
| CPU 占用 | 高(等待) | 中(处理) | 低 |
| 硬件复杂度 | 低 | 中 | 高 |
| 传输单位 | 字/字节 | 字/字节 | 数据块 |
| CPU 利用率 | 低 | 中 | 高 |
| 适用场景 | 低速设备 | 中速设备 | 高速设备 |
| 并发能力 | 无 | 有限 | 强 |
最大响应延迟:最坏情况 CPU 刚查完某设备后它才就绪,需等一个完整查询周期。
查询周期 = Σ(每个设备的查询时间)
最大响应延迟 = 查询周期 - 当前设备查询时间
平均响应延迟 ≈ 查询周期 / 2
↑ 以上为站内 HTML 相对链接(纯网页可浏览);本页右上「在 Obsidian 中打开」跳回源笔记。