第七章:输入输出(I/O)管理
7.1 I/O设备分类
I/O设备种类繁多,从不同角度分类:
按传输速率:
- 低速:键盘、鼠标(每秒几十字节)
- 中速:打印机、扫描仪(每秒几千到几万字节)
- 高速:磁盘、显示器(每秒几兆到几十兆字节)
按信息交换单位:
- 块设备:以数据块为单位传输(如磁盘),可寻址,支持随机访问。
- 字符设备:以字符流为单位传输(如键盘、打印机),不可寻址,只能顺序访问。
按共享属性:
- 独占设备:一次只能给一个进程用(如打印机)。
- 共享设备:可同时给多个进程用(如磁盘)。
- 虚拟设备:通过SPOOLing技术把独占设备变成可共享的逻辑设备。
7.2 I/O控制器
I/O控制器是CPU和设备之间的"翻译官"——CPU通过I/O控制器间接操作设备。
I/O控制器的组成:
- 状态/控制寄存器:记录设备状态(忙/空闲)和发送命令。
- 数据寄存器:暂存CPU和设备之间的数据。
- I/O逻辑:与CPU通信(通过地址线、数据线、控制线)。
I/O端口地址:
- 独立编址:I/O端口和内存地址分开(如x86的IN/OUT指令)。
- 内存映射I/O:I/O端口映射到内存地址空间(用普通内存访问指令操作设备)。
7.3 I/O控制方式
| 方式 | 基本过程 | CPU介入 | 数据流向 | 特点 |
|---|---|---|---|---|
| 程序直接控制(轮询) | CPU不断查询设备状态 | 一直占用 | CPU→设备 | CPU利用率极低(99%时间在等待) |
| 中断驱动方式 | 设备完成后主动通知CPU | 每次I/O中断 | CPU→设备 | 多道程序可交替 |
| DMA方式 | DMA控制器直接管理数据传输 | 只在开始和结束 | 内存↔设备(不经CPU) | 高效,块传输 |
| 通道控制 | 专门的I/O处理器执行通道程序 | 最少 | 内存↔设备 | 最强大,适合大型机 |
7.3.1 程序直接控制方式(轮询)
CPU循环检查设备状态寄存器的"完成位"——设备忙就继续查,设备完成就读写数据。
- 优点:实现简单。
- 缺点:CPU效率极低(忙等)。
7.3.2 中断驱动方式
进程发起I/O后阻塞,CPU调度其他进程。设备完成时触发中断,CPU处理中断后唤醒等待的进程。
- 优点:CPU和设备并行工作(CPU利用率大幅提高)。
- 缺点:每次传输一个字就触发一次中断,对高速设备(如磁盘)来说中断太频繁。
📌 408考点提示:中断处理过程是重点——中断响应(硬件自动完成:关中断、保存断点、找中断向量)→ 中断处理(软件:保存现场、执行中断服务程序、恢复现场、开中断、返回)。
7.3.3 DMA方式
DMA(直接存储器访问)通过DMA控制器在不经过CPU的情况下直接在内存和设备间传输数据。
DMA与中断驱动的对比:
| 对比 | 中断驱动 | DMA |
|---|---|---|
| 传输单位 | 字(byte/word) | 块 |
| 中断频率 | 每个字中断一次 | 整块传输完中断一次 |
| 数据路径 | CPU→设备 | 内存↔设备(直接) |
| CPU介入 | 全程介入每次传输 | 只在开始和结束介入 |
DMA控制器的组成:
- 内存地址寄存器:存放数据在内存中的地址。
- 字计数器:还需要传输的字数。
- 数据缓冲区:暂存数据。
- 控制/状态逻辑:控制DMA传输过程。
DMA传输过程:
- CPU设置DMA控制器(内存地址、传输长度、方向等)。
- DMA控制器接管总线,开始传输。
- 传输完成后,DMA控制器发送中断通知CPU。
⚠️ 易错点:DMA期间CPU仍然可以执行(包括访问Cache和不需要总线的操作),但是DMA会窃取总线周期(cycle stealing)——当CPU和DMA同时需要访问内存时,DMA优先级更高(因为I/O速度慢,等不起)。
7.3.4 通道控制方式
通道是一个专门的I/O处理器,有自己的指令集(通道程序),可以执行复杂的I/O操作序列。
- CPU只需发起一个I/O请求(告诉通道要做什么),通道独立完成整个I/O过程。
- 适合大型机/高性能系统。
- 比DMA更智能(可以执行通道程序,不仅仅是数据传输)。
7.4 中断处理过程
中断是OS中最基本的异步事件处理机制,完整流程如下:
中断响应阶段(硬件自动完成):
- 关中断:CPU自动屏蔽其他中断(保证中断处理的原子性)。
- 保存断点:将当前PC(程序计数器)和PSW压入系统栈。
- 中断源识别:查找中断向量表,找到中断服务程序的入口地址。
中断处理阶段(软件——中断服务程序): 4. 保存现场:保存CPU寄存器(通用寄存器等)到内核栈。 5. 执行中断服务程序:真正的中断处理逻辑——如从设备数据寄存器读数据。 6. 恢复现场:从内核栈恢复保存的寄存器。 7. 开中断:允许新中断。 8. 中断返回:执行IRET指令,恢复PC和PSW,回到被中断的程序。
💡 记忆技巧:中断处理八步曲——关保存→找入口→保现场→做服务→恢复场→开中断→返回。
7.5 设备驱动程序
设备驱动程序是OS与设备控制器之间的接口,负责将OS的通用I/O请求转换为设备控制器的具体指令。
特点:
- 每个设备类型需要自己的驱动程序。
- 驱动程序工作在内核态(或部分在用户态,取决于OS设计)。
- 提供统一的上层接口(如read/write系统调用)。
7.6 缓冲技术
缓冲的主要目的是协调CPU和I/O设备的速度不匹配,以及减少中断频率。
7.6.1 单缓冲
OS在主存中分配一个缓冲区。设备将数据送入缓冲区,CPU从缓冲区取数据。
- 处理时间 ≈ max(C, T) + M(C=CPU处理时间,T=输入时间,M=缓冲区传送时间)
- 通常T > C,所以 ≈ T + M
7.6.2 双缓冲
使用两个缓冲区:设备填满缓冲区A时,CPU处理缓冲区B,设备同时填充缓冲区A。
- 处理时间 ≈ max(C, T) + M
- 如果T > C,则 ≈ T + M(每个块的等效处理时间)
- 如果C > T(CPU快),则 ≈ C + M(CPU更快溢出)
7.6.3 循环缓冲
多个缓冲区组成环形,输入指针和输出指针循环移动——适合生产-消费模式。
7.6.4 缓冲池
OS管理一组缓冲区(缓冲池),分为空缓冲队列、输入队列、输出队列。系统根据需要动态分配缓冲区给进程。
缓冲技术的计算(408考点):
- 单缓冲:每块处理时间 = max(C, T) + M
- 双缓冲:每块处理时间 = max(C, T) + M(但连续处理时并行度更高)
📌 408考点提示:缓冲区计算——给定时T、CPU处理时间C、缓冲区传送时间M,计算处理n块数据的总时间。
7.7 SPOOLing技术(假脱机)
SPOOLing(Simultaneous Peripheral Operation On-Line)是把独占设备变成共享设备的关键技术。
SPOOLing系统的组成:
- 输入/输出进程:管理输入/输出井。
- 输入/输出井(磁盘中的两个区域):输入井暂存输入数据,输出井暂存输出数据。
- 输入/输出缓冲区:内存中的缓冲区。
SPOOLing的工作原理(以打印机为例):
- 用户进程要打印时,不是直接使用打印机,而是将打印数据写入磁盘的输出井。
- 打印守护进程从输出井取数据,逐个发送到打印机。
- 对用户进程来说,感觉自己在"独占"打印机——实际上多个进程的打印任务在输出井中排队。
SPOOLing的优点:
- 将独占设备变为虚拟设备(虚拟设备技术)。
- 提高了I/O速度和设备利用率。
- 实现了设备的共享。
📌 408考点提示:SPOOLing原理是常考知识点——理解"把数据先写到磁盘,再由守护进程发送到设备"这个核心思想。注意SPOOLing需要独占设备(如打印机)和共享设备(如磁盘)配合实现。
7.8 设备分配
7.8.1 数据结构
| 数据结构 | 含义 |
|---|---|
| DCT(设备控制表) | 每个设备一张,记录设备状态、类型、等待队列等 |
| COCT(控制器控制表) | 每个控制器一张 |
| CHCT(通道控制表) | 每个通道一张 |
| SDT(系统设备表) | 系统范围内所有设备的信息 |
7.8.2 分配策略
| 策略 | 特点 |
|---|---|
| 静态分配 | 进程运行前一次性分配所有需要的设备,用完后归还。不会死锁但利用率低 |
| 动态分配 | 运行过程中按需申请,用完后立即释放。利用率高但可能死锁 |
7.8.3 设备分配中的安全问题
分配设备时考虑死锁问题(类似资源分配)——需要配合死锁避免机制。
示例题
示例1(缓冲区计算):假设某计算机的I/O传输速率T=80μs/块,CPU处理一块数据需要C=50μs,缓冲区传送时间M=10μs。采用单缓冲和双缓冲,分别计算处理100块数据的总时间。
单缓冲: 每块处理时间 = max(T, C) + M = max(80, 50) + 10 = 80 + 10 = 90μs 总时间 ≈ 第一块启动时间 + (n-1) × 每块处理时间 + 最后处理收尾 更精确:第一块时间为 T + M + C = 80 + 10 + 50 = 140μs 之后每块:max(T, C) + M = 90μs(最后一块不需再加?详见下文严谨计算)
严谨的单缓冲连续处理:
设输入到缓冲区时间=T,从缓冲区取到用户区时间=M,CPU处理时间=C。
时间线分析: t=0: 开始输入第一块到缓冲区(耗时T=80) t=80: 第一块输入完成,传送缓冲区到用户区(耗时M=10)→同时开始输入第二块(并行) t=90: 第一块传送完成,CPU开始处理(耗时C=50) 第二块输入到t=80+80=160完成,但缓冲区在t=90-160期间被第一块传送占用...
更简单的近似公式(输入时间T远大于处理时间C时): 总时间 ≈ T × n + M + C(输入所有块的时间 + 第一次传送 + 第一次处理)
更准确: 单缓冲连续处理n块的总时间 ≈ n × T + (n-1) × max(C, T) + M + C... 实际上408考试中通常使用简化公式:
- 单缓冲:总时间 = n × T + M + min(C, T) ≈ n × T + M + C(当T > C时)= 100×80 + 10 + 50 = 8060μs
更常用的408公式: 单缓冲:处理n块的总时间 = n × T + M + C(其中T > C)= 8000 + 60 = 8060μs
双缓冲: 处理n块的总时间 = n × T + M + C(当T > C时,实际上双缓冲可以让CPU和输入更充分地并行)
实际上双缓冲情况下可近似为: 总时间 = n × T + M + C = 8060μs(同样,因为瓶颈在T)
但用更精确的双缓冲公式: 双缓冲每块处理时间 = max(C, T) + M = 90μs/块 总时间 ≈ (n-1) × max(C, T) + (T + M + C) = 99 × 80 + (80+10+50) = 7920 + 140 = 8060μs
结果一样,因为T是瓶颈。
示例2(SPOOLing分析):某系统使用SPOOLing技术管理打印机。进程A、B、C几乎同时发出打印请求,分别要打印50行、100行、80行数据。请说明SPOOLing系统如何处理这些请求。
解:
- 三个进程分别将打印数据写入磁盘输出井(不同的文件或区域)。
- 每个进程的"打印任务"进入打印请求队列。
- 打印守护进程按FCFS依次从输出井取数据发给打印机: 先打印A的50行,再打印B的100行,最后打印C的80行。
- 对三个进程来说,它们都没有直接等待打印机——写完输出井后就可以继续执行,感觉"独占了打印机"。
示例3(中断与DMA对比):说明用中断方式从磁盘读取一个4KB的数据块(块大小512B)和用DMA方式的区别。
解: 中断方式:磁盘每准备好512B,触发一次中断。4KB需要8个扇区,触发8次中断。CPU每次中断都要保存/恢复现场,8次中断开销很大。
DMA方式:CPU设置好DMA控制器参数(内存地址、块数4KB对应8个扇区),DMA控制器独立完成从磁盘到内存的8次传输,传输完毕只触发一次中断。CPU在这期间可以执行其他程序(除了DMA窃取总线周期时可能略有延迟)。
本章小结
I/O管理是OS与硬件交互的接口。重点掌握:四种I/O控制方式的对比(特别是中断驱动与DMA的区别)、中断处理的完整流程、SPOOLing技术的原理(把独占变共享)、缓冲技术的计算(单缓冲和双缓冲)。408考试中I/O管理与前述章节相比占比略少,但中断处理、SPOOLing原理、DMA方式等是高频考点。