第七章:输入输出(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传输过程:

  1. CPU设置DMA控制器(内存地址、传输长度、方向等)。
  2. DMA控制器接管总线,开始传输。
  3. 传输完成后,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中最基本的异步事件处理机制,完整流程如下:

中断响应阶段(硬件自动完成):

  1. 关中断:CPU自动屏蔽其他中断(保证中断处理的原子性)。
  2. 保存断点:将当前PC(程序计数器)和PSW压入系统栈。
  3. 中断源识别:查找中断向量表,找到中断服务程序的入口地址。

中断处理阶段(软件——中断服务程序): 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的工作原理(以打印机为例):

  1. 用户进程要打印时,不是直接使用打印机,而是将打印数据写入磁盘的输出井。
  2. 打印守护进程从输出井取数据,逐个发送到打印机。
  3. 对用户进程来说,感觉自己在"独占"打印机——实际上多个进程的打印任务在输出井中排队。

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系统如何处理这些请求。

解:

  1. 三个进程分别将打印数据写入磁盘输出井(不同的文件或区域)。
  2. 每个进程的"打印任务"进入打印请求队列。
  3. 打印守护进程按FCFS依次从输出井取数据发给打印机: 先打印A的50行,再打印B的100行,最后打印C的80行。
  4. 对三个进程来说,它们都没有直接等待打印机——写完输出井后就可以继续执行,感觉"独占了打印机"。

示例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方式等是高频考点。