🖥️ I/O管理

I/O控制方式 · 缓冲技术 · SPOOLing假脱机 · I/O软件层次
I/O控制 缓冲技术 SPOOLing I/O层次
🎮 I/O控制方式
从轮询到通道,CPU干预越来越少,I/O效率越来越高
① 程序直接控制(轮询)
CPU不断查询I/O设备状态寄存器。
缺点:CPU全程干预,利用率极低。
❌ 已淘汰
② 中断驱动I/O
I/O完成后设备发中断信号,CPU处理中断。
优点:CPU无需轮询,可做其他事。
✅ 主流方式
③ DMA直接内存访问
数据直接在设备←→内存传输,每次传完一块发中断。
优点:CPU只需干预块传输的开始/结束。
✅ 高速设备主流
④ I/O通道(Channel)
专用I/O处理器执行通道程序,完全独立CPU。
优点:CPU几乎不干预I/O,效率最高。
✅ 大型机/服务器
控制方式CPU干预频率数据传输单位中断次数适用设备
程序直接控制最高(每次字节)字节无(轮询)慢速设备
中断驱动高(每次字节)字节每次字节传输慢速/中速
DMA低(每块一次)数据块每块一次高速设备
I/O通道极低(每次I/O)一组数据块每次I/O一次高速/大批量
🔄 缓冲技术
解决CPU与I/O设备速度不匹配问题
为什么需要缓冲?
· CPU速度与I/O设备速度相差几个数量级
· 减少对CPU的中断频率
· 提高CPU与I/O设备的并行性
· 支持"畅清水":写操作先缓存,CPU可继续

缓冲级数越多,并行性越好,但延迟越大。
四种缓冲方式对比
方式特点适用
单缓冲一块缓冲区简单场景
双缓冲两块交替使用生产-消费模型
循环缓冲多个缓冲区环路持续性数据流
缓冲池多个缓冲区统一管理通用OS
点击按钮演示缓冲过程
🖨️ SPOOLing 假脱机技术
将独占设备(如打印机)改造为共享设备的魔法
SPOOLing(Simultaneous Peripheral Operation On-line):

脱机技术:利用磁盘作为中转,让I/O操作与CPU计算真正并行

核心组成:
· 输入井/输出井:磁盘上的缓冲区,暂存I/O数据
· 输入缓冲区/输出缓冲区:内存中的缓冲区
· 输入进程/输出进程:将设备数据传输到井(或反之)

效果:多个进程可以把打印任务"同时"提交给SPOOLing系统, 实际由输出进程串行输出到打印机(逻辑上共享,物理上串行的结合)。
上图:三个进程"同时"提交打印任务 → SPOOLing输出进程排队输出到打印机
📚 I/O软件层次结构
自底向上:中断处理 → 设备驱动 → 设备无关 → 用户层
⚙️
用户层I/O软件
库函数(printf/fread)→ 系统调用接口
🔌
设备无关I/O软件
命名/保护/缓冲/错误处理 — 与设备无关的通用处理
💾
设备驱动程序
具体设备的控制代码 — 知晓硬件细节,转换抽象I/O为硬件命令
中断处理程序
I/O完成后的中断服务 —— 唤醒等待进程、标记完成
↑ 层次越高越抽象 ↑    ↓ 层次越低越接近硬件 ↓
🔑 设备独立性(设备无关性):
用户程序不直接使用物理设备名(如/dev/sda1),而是使用逻辑设备名
优点:① 设备分配更灵活 ② 程序可移植(换设备不需改代码)

📝 408考点:I/O软件各层次的职责要能区分,尤其是"设备驱动程序"和"设备无关软件"的边界。
🔧 I/O控制器结构(设备控制器)
CPU不直接控制设备,而是通过I/O控制器(设备控制器)来间接控制
📖 为什么需要I/O控制器?
CPU的指令集不直接控制I/O设备(设备细节太复杂)。I/O控制器是CPU和设备之间的桥梁,它接收CPU的指令,然后控制设备完成操作。

⚡ I/O控制器的组成:
· 控制寄存器:CPU写入命令(如:读/写/配置)
· 状态寄存器:CPU读取设备状态(如:忙/就绪/错误)
· 数据寄存器:CPU与设备之间传输数据(低速方式)
· 数据缓冲区:DMA方式下的数据传输区
▲ I/O控制器结构:CPU ←→ 控制器 ←→ I/O设备
I/O地址的两种编址方式(408选择题考点)
① 内存映射I/O(Memory-Mapped I/O):I/O控制器的寄存器映射到内存地址空间,CPU用普通内存读写指令访问I/O
  · ✅ 优点:不需要专用I/O指令,可以用任意内存指令操作I/O
  · ❌ 缺点:占用了部分内存地址空间

② 独立编址(Isolated I/O):I/O控制器的寄存器有独立的I/O地址空间,CPU用专用I/O指令(如IN/OUT)访问
  · ✅ 优点:不占用内存地址空间
  · ❌ 缺点:需要专用I/O指令(导致指令集复杂)
💾 DMA(直接内存访问)详细流程
DMA控制器独立完成数据传送,只需在传送开始和结束时中断CPU
📖 DMA的工作流程(408标准答案版):
Step 1:CPU把内存起始地址磁盘地址传送字节数写入DMA控制器的寄存器
Step 2:CPU发出"启动DMA"命令,然后去做其他事(进程切换,执行其他进程)
Step 3:DMA控制器获得系统总线控制权(cycle stealing,周期窃取)
Step 4:DMA控制器把磁盘数据逐字/逐块传送到内存(不需要CPU干预)
Step 5:传送完一整块数据后,DMA控制器向CPU发一个中断
Step 6:CPU在中断处理程序中确认传送完成,然后唤醒等待I/O的进程
▲ DMA工作流程(点击步进观看)
📝 408高频考点:
① "DMA方式和中断方式的主要区别?" → 中断方式:每个字节都中断CPU;DMA方式:每块数据只中断一次
② "DMA传送过程中,CPU还能执行程序吗?" → (DMA使用周期窃取,CPU在DMA不占用总线时仍能执行)
③ "DMA控制器和I/O控制器的区别?" → I/O控制器负责设备控制;DMA控制器负责数据传送(通常DMA是I/O控制器的子模块)
🔗 设备分配数据结构(UNIX/Linux方式)
设备→控制器→通道 的链式组织结构,实现设备独立性
📖 设备分配需要考虑的问题:
设备独立性(设备无关性):用户程序不直接指定物理设备名,而是使用逻辑设备名
避免死锁:多个进程申请设备时,需要按一定顺序分配(类似银行家算法)
设备利用率:尽量让设备忙起来(但需要避免进程饥饿)

⚡ UNIX的设备分配数据结构(408经典考点):
▲ 设备分配数据结构链:SDT → DCT → COCT → CHCT
SDT(系统设备表)
整个系统一张,记录所有设备的信息。

内容:设备类型、设备标识符、设备状态(忙/闲)、指向DCT的指针
DCT(设备控制表)
每个设备一张,记录该设备的详细信息。

内容:设备类型、设备标识符、设备状态、等待队列头指针、指向COCT的指针
COCT(控制器控制块)
每个控制器一张,记录该控制器的信息。

内容:控制器标识符、控制器状态、等待队列、指向CHCT的指针
CHCT(通道控制块)
每个通道一张,记录该通道的信息。

内容:通道标识符、通道状态、等待队列
📝 408综合题考点:
① "设备分配时,按什么顺序查找数据结构?" → SDT → DCT → COCT → CHCT(先找设备,再找其控制器,再找其通道)
② "为什么需要这么多层的数据结构?" → 实现设备独立性、支持通道(大型机I/O处理器)
③ "设备分配算法?" → 通常"first-fit"(第一个空闲设备),但要考虑安全性(避免死锁)
🏊 缓冲池(Buffer Pool)
多个缓冲区组织成池,由池管理器统一管理 —— 提高I/O和CPU的并行度
📖 为什么需要缓冲池?
单个缓冲区(如单缓冲区)在I/O和CPU之间只能存放一个单位的数据。而缓冲池有多个缓冲区,可以:
并行I/O:I/O设备可以连续写入多个缓冲区,不必等CPU读完
并行计算:CPU可以连续读多个缓冲区,不必等I/O写完
支持多种用途:输入缓冲、输出缓冲、收发缓冲可以共享池
▲ 缓冲池工作原理(点击播放动画)
缓冲池的三种工作状态(408考点)
① 空缓冲:还没有被使用的缓冲区(初始状态)
② 输入缓冲:I/O设备正在往里写数据(装满后变成"装满输入")
③ 输出缓冲:CPU正在往里写数据(装满后变成"装满输出")
④ 装满输入:I/O设备已写完,CPU可以开始读
⑤ 装满输出:CPU已写完,I/O设备可以开始读

⚡ 关键:缓冲区在这种状态之间动态转换,由缓冲池管理器负责调度。
📝 408考点:"缓冲技术和Cache的区别?" → 缓冲解决速度不匹配问题(I/O vs CPU);Cache解决访问时间不匹配问题(CPU vs 内存)。缓冲通常是先进先出,Cache通常是最近最少使用