第七章 输入/输出系统
4 分钟阅读1,622 字21 个小节
第七章 输入/输出系统
7.1 I/O设备分类
| 分类方式 | 类型 | 示例 |
|---|---|---|
| 按使用特性 | 存储设备 / 输入设备 / 输出设备 / 交互式设备 | 磁盘 / 键盘 / 打印机 / 显示器 |
| 按传输速率 | 低速 / 中速 / 高速 | 键盘 / 打印机 / 磁盘 |
| 按共享属性 | 独占设备 / 共享设备 / 虚拟设备 | 打印机 / 磁盘 / SPOOLing |
| 按传输单位 | 块设备 / 字符设备 | 磁盘 / 键盘 |
7.2 设备控制器
设备控制器的组成
- 设备控制器与CPU的接口:数据线+地址线+控制线,含数据寄存器、控制/状态寄存器
- 设备控制器与设备的接口:数据/控制/状态信号
- I/O逻辑:对命令译码,选择设备
CPU与控制器通信方式
- 特定I/O指令形式:专门的I/O指令(如
io-store) - 内存映像I/O:把设备寄存器地址映射到内存地址空间,用普通存取指令访问
7.3 I/O通道
| 通道类型 | 工作方式 | 适用设备 | 特点 |
|---|---|---|---|
| 字节多路通道 | 按字节交叉 | 低速设备 | 含多个非分配型子通道,轮流使用 |
| 数组选择通道 | 按数据块,独占 | 高速设备 | 一次只服务一个设备,利用率低 |
| 数组多路通道 | 按数据块,多路 | 高/中速设备 | 既高速又高利用率 |
瓶颈问题解决:增加通路(一个设备连多个控制器,一个控制器连多个通道)
7.4 I/O控制方式(⭐⭐⭐)
| 方式 | 数据传送单位 | CPU干预程度 | 特点 |
|---|---|---|---|
| 程序直接控制(轮询) | 字节 | 极高(忙等) | CPU与设备串行,CPU利用率极低 |
| 中断驱动 | 字节 | 每字节中断一次 | CPU与设备可并行,但高速设备中断太频繁 |
| DMA | 数据块 | 每块中断一次 | 4个寄存器:CR/MAR/DR/DC;数据直接内存↔设备 |
| 通道 | 一组数据块 | 仅启动和完成时干预 | 执行通道程序,CPU/通道/设备三者并行 |
DMA控制器4个寄存器
- CR(命令寄存器):存放CPU命令
- MAR(内存地址寄存器):数据在内存的起始地址
- DR(数据寄存器):暂存传送数据
- DC(数据计数器):本次传送的字节数
7.5 I/O软件层次
从低到高:
- 中断处理程序:最底层,直接与硬件交互
- 设备驱动程序:抽象I/O请求→具体设备命令
- 与设备无关的I/O软件:设备命名、保护、分配、缓冲
- 用户层I/O软件:库函数、SPOOLing
7.6 设备分配
设备分配相关数据结构
- DCT(设备控制表):每个设备一张
- COCT(控制器控制表):每个控制器一张
- CHCT(通道控制表):每个通道一张
- SDT(系统设备表):全系统一张,记录所有设备
SPOOLing(假脱机技术)⭐
- 将物理上的独占设备改造为逻辑上的共享设备
- 组成:输入井+输出井(在磁盘上)+ 输入缓冲区+输出缓冲区(在内存中)+ 输入/输出进程
- 典型应用:共享打印机(多个进程的打印请求放入磁盘输出井排队,由守护进程依次打印)
7.7 缓冲区管理⭐
缓冲引入原因
- 缓和CPU与I/O设备间的速度不匹配
- 减少I/O中断次数
- 解决基本数据单元大小不匹配
传输时间计算⭐
设 = 设备传送一块数据时间, = 将缓冲区数据传入用户区时间, = CPU处理一块数据时间
| 缓冲类型 | 每块平均处理时间 |
|---|---|
| 单缓冲 | |
| 双缓冲 |
缓冲池
- 4种缓冲区:收容输入(hin)、提取输入(sin)、收容输出(hout)、提取输出(sout)
7.8 磁盘
磁盘访问时间⭐
- (寻道时间):磁头移到目标磁道
- (旋转延迟):等转到目标扇区。平均 (为转速)
- (传输时间):(为字节数,为每磁道字节数)
磁盘调度算法⭐⭐⭐
| 算法 | 策略 | 优缺点 |
|---|---|---|
| FCFS | 先来先服务 | 公平但效率低 |
| SSTF | 最短寻道时间优先 | 性能好但可能饥饿 |
| SCAN(电梯) | 单方向扫到头再折返 | 消除饥饿,对中间磁道有利 |
| LOOK | 单方向扫描到该方向最远请求即折返 | 避免无效扫到端点,平均寻道更优 |
| C-SCAN(循环扫描) | 单方向扫到头,快速返回起点重新扫 | 更均匀的等待时间 |
| C-LOOK | 单方向扫描到最远请求后,快速回到最小请求再扫 | 比C-SCAN更少无效移动 |
| N-Step-SCAN | 将请求队列分段,段内SCAN | 避免磁臂粘着 |
| FSCAN | 两个子队列,一个当前服务,新请求入另一个 | 避免磁臂粘着 |
磁盘调度手工计算示例(⭐⭐ 高频选择/大题)
题目:磁盘请求队列为 ,当前磁头在 53 号磁道,磁头正向磁道号增大方向移动。分别用 FCFS、SSTF、SCAN 计算总移动磁道数。
FCFS(按请求到达顺序): 移动量 =
SSTF(每次选最近磁道): 移动量 =
SCAN(电梯算法,先向大方向扫到最远请求再折返): 移动量 =
⚠️ LOOK vs SCAN:LOOK 扫到该方向最远请求(183)即折返;SCAN 扫到磁盘端点(如199)才折返。题目需看清"SCAN"还是"LOOK"。
🎯 本章真题锚点与最短模板
- 高频题号(2009-2025):2009Q32、2010Q32、2011Q26/Q32、2012Q24/Q26、2017Q32、2022Q30、2025Q23
- 优质例题:比较程序直接控制/中断/DMA三种方式下CPU参与程度,并计算DMA每秒CPU占用比。
- 最短解题模板:
- 先判传输粒度:程序/中断=字节,DMA=块。
- CPU开销 = 次数 × 每次处理时间。
- CPU占比 = CPU开销 / 总时间。
⚡ 秒杀版口令卡(10秒回忆)
- 口令:轮询最忙,中断次之,DMA最省CPU。
- 口令:DMA传块,CPU只管前后处理。
- 口令:占比=总CPU开销/总时长。