输入输出管理

考点定位

  • 大纲章节:I/O 管理基础(I/O 设备分类、I/O 控制方式、I/O 软件层次结构);设备独立性软件(I/O 调度、设备分配、缓冲区管理、SPOOLing);设备驱动与中断处理
  • 常见题型:选择题(层次归属判断、缓冲/SPOOLing 概念辨析)+ 计算小题(单/双缓冲处理一块数据的时间)——缓冲时间计算是本章唯一稳定计算考点
  • 考查频率:中高(层次结构与缓冲几乎隔年考选择;SPOOLing 是高频概念题;大题偶与设备分配结合出)
  • 工程师读者注意:你写过 epoll、ioctl,但考试考的是层次结构的教科书切分(某功能属于哪一层是必考填空式判断)与缓冲时间的流水线计算——别按 Linux 内核的层次答,按本站表格答
  • 前置知识:操作系统概述(内核态/中断/系统调用);进程与线程(阻塞与唤醒是 I/O 流程的主线);硬件基础见计算机组成原理 输入输出系统(I/O 接口、三种控制方式程序查询/中断/DMA 的硬件视角,本章是其 OS 软件侧)

一、I/O 系统的层次结构

1.1 为什么分层

I/O 硬件千差万别(键盘、磁盘、网卡),而用户程序希望用统一接口读写。OS 在硬件与应用之间切出多层,每层只依赖下一层的抽象接口——这与网络协议栈、文件系统 VFS 的分层动机完全同构。"某个功能属于哪一层"是 408 高频选择/判断题,按下表背死。

1.2 I/O 软件层次结构与各层职责(必背表)

自上而下(用户→硬件):

层次主要职责典型内容/关键词
用户层 I/O 软件实现与用户交互的 I/O库函数(如 C 的 printf/fopen)、SPOOLing(假脱机)、用户直接使用系统调用
设备独立性软件(设备无关软件)实现与设备无关的功能统一命名(逻辑设备名)、保护、逻辑块与设备号映射、缓冲管理、设备分配与回收、差错处理、独立于设备的逻辑操作(read/write/seek)
设备驱动程序把上层抽象请求翻译为具体硬件操作向设备控制器寄存器写命令/参数;每类设备一个驱动;是唯一知道控制器细节的层
中断处理程序保存现场→处理→恢复现场I/O 完成后唤醒等待进程;保存/恢复寄存器,与计组中断流程衔接
硬件执行物理 I/O设备与设备控制器(含数据/状态/控制寄存器)

判断技巧(选择题救命):"翻译成硬件指令、直接操作控制器寄存器"→驱动程序;"缓冲、分配、按逻辑名找设备"→设备独立性软件;"假脱机、库函数"→用户层;"保存断点与现场"→中断处理。系统调用的处理由内核各层配合完成,库函数本身属于用户层。

1.3 设备独立性(设备无关性)

定义:应用程序使用的逻辑设备名(如"打印机")与物理设备无关,由 OS 在运行时映射到具体物理设备(物理设备名)。好处:应用不绑定具体设备、设备更换/故障时只改映射、便于共享与重定向(Unix 把设备映射为 /dev/ 下的特殊文件,见文件管理的文件分类)。

二、设备控制器与 I/O 端口

2.1 设备控制器

设备不直接连 CPU,而是通过设备控制器(I/O 控制器,常集成在主控芯片/扩展卡上)接入。控制器是 CPU 与设备之间的翻译官:

  • 接收并识别 CPU 命令:内有控制寄存器,存放 CPU 写入的命令与参数
  • 数据交换:内有数据缓冲寄存器,设备慢速数据与 CPU 之间缓冲
  • 报告设备状态:内有状态寄存器(忙/闲、错误、就绪),CPU 可查询
  • 地址识别:识别 CPU 访问的是哪个寄存器/端口
  • 数据格式与信号转换:串并转换、电平/编码转换等

控制器内部组成三件套(与计组 I/O 接口一致):数据寄存器(DR)、控制寄存器(CR)、状态寄存器(SR),多个设备的控制器还可经通道(专用 I/O 处理机)级联管理,通道进一步分字节多路/数组选择/数组多路通道——硬件细节见计算机组成原理 输入输出系统。

2.2 I/O 端口及其编址

I/O 端口 = 控制器中的寄存器。CPU 如何访问端口(两种编址方式,408 常考对比):

独立编址(专用 I/O 指令方式)统一编址(内存映射 I/O,MMIO)
端口地址空间与内存地址空间分离占用内存地址空间的一段
访问指令专用 I/O 指令(如 x86 的 in/out)普通访存指令即可(mov)
优点地址空间利用率高、程序易区分 I/O 与访存无需专用指令与控制信号,访问手段丰富(可用全部访存寻址方式)
缺点需要专用指令、控制复杂占用内存空间、程序中 I/O 不直观

三、I/O 核心子系统

OS 内核中与 I/O 相关的服务统称 I/O 核心子系统(I/O 子系统),运行于内核态,包括:I/O 调度、缓冲与高速缓存、设备分配、设备保护、差错处理、SPOOLing。本节覆盖考点密集的四个:调度、分配、缓冲、SPOOLing。

3.1 I/O 调度

I/O 调度:确定服务 I/O 请求的先后顺序,改善整体性能(公平性与效率的折中)。典型例子:磁盘调度(见文件管理第六节);OS 还可为目标设备维护请求队列,或按优先级重排。I/O 调度常通过缓冲 + 重排请求实现。

3.2 设备分配(四表结构,大题可考推演)

设备分配的总原则:充分提高利用率、避免死锁(参考进程与线程死锁一节)、按用户逻辑设备名映射到物理设备(设备独立性)。分配方式:静态分配(独占式,用前分配用完释放,不会死锁但利用率低)与动态分配(进程用设备时申请)。安全性分配:发出 I/O 请求即阻塞本进程,则"请求和保持"不成立,不会死锁但并发度低;不安全分配反之。

四张数据结构(必背,考"哪个表含哪个字段"):

表全称关键内容
DCT 设备控制表Device Control Table每台设备一张:设备类型、标识符、状态(忙/闲/故障)、等待该设备的进程队列指针、与设备相连的 COCT 指针、重复执行次数等
COCT 控制器控制表Controller Control Table每个控制器一张:控制器标识符、状态、等待队列、相连通道 CHCT 指针
CHCT 通道控制表Channel Control Table每个通道一张:通道标识符、状态、等待队列、指向 COCT
SDT 系统设备表System Device Table整个系统一张,每个设备一个表项:设备类型、标识符、指向 DCT 的指针、驱动程序入口

分配流程(含通道的系统,三层逐步"找到并占用"):

设备、控制器、通道三者全部分配成功才能启动 I/O;任一层忙则挂到该层等待队列(体现"逐层排队")。

3.3 缓冲区管理(必考计算)

为什么缓冲:① 缓和 CPU 与 I/O 设备速度不匹配的矛盾;② 减少对 CPU 的中断频率(一次搬一大块,而不是一字节一中断);③ 解决数据粒度不匹配(设备按字节/块产出,进程按记录消费);④ 提高 CPU 与设备间的并行性。缓冲的实体在内存:"缓冲区"是暂存数据的内存区域,"工作区"是进程直接使用的数据区。

硬件缓冲 vs 软件缓冲:用寄存器实现叫硬件缓冲,通常说的缓冲是内存软件缓冲。

形式结构特点
单缓冲设备 → 缓冲区 → 工作区,一条流水每块数据经历"输入到缓冲区 T → 缓冲区搬到工作区 M → CPU 处理 C",设备与 CPU 可在"上一块的 C"与"下一块的 T"上并行
双缓冲两个缓冲区交替:设备填一个的同时 CPU 取另一个设备与 CPU 更充分并行;通信场景即"收发各一个缓冲"
循环缓冲多个缓冲区组成环,in/out 指针缓和生产消费速度差,缓冲区个数 ≥ 2
缓冲池公用缓冲队列(空缓冲队列 emq、输入队列 inq、输出队列 outq 等三种队列四种缓冲区)全系统共享,按需申请归还,提高利用率(供多个进程的收容输入/提取输入/收容输出/提取输出四种用途)

时间计算公式(考试标准模型):设 TT = 设备把一块数据输入缓冲区的时间,MM = 缓冲区传送到工作区的时间,CC = CPU 处理一块数据的时间。稳态下每处理一块的平均耗时:

单缓冲: max⁡(C, T)+M\text{单缓冲}:\ \max(C,\ T) + M

双缓冲: max⁡(C+M, T)\text{双缓冲}:\ \max(C + M,\ T)

理解(不要死背):单缓冲时设备与 CPU 只能占用同一个缓冲区,二者中耗时长的串行占满一个周期,MM(缓冲区→工作区)期间设备无法开始装下一块,必须串行追加;双缓冲时设备总有空缓冲可用,瓶颈只剩"设备侧周期 TT"与"CPU 侧周期 C+MC+M"取大者。

例题(模拟题,完整推演):设备每输入一块数据到缓冲区需 T=100T = 100 ms,缓冲区数据传送到工作区需 M=10M = 10 ms,CPU 处理一块需 C=50C = 50 ms。求单缓冲与双缓冲下连续处理 10 块数据的总时间。

  • 单缓冲:每块 max⁡(50,100)+10=110\max(50, 100) + 10 = 110 ms,总时间 110×10=1100110 \times 10 = 1100 ms
  • 双缓冲:每块 max⁡(50+10,100)=100\max(50 + 10, 100) = 100 ms,总时间 100×10=1000100 \times 10 = 1000 ms
  • 验证流水线:双缓冲时设备全程不停(每 100 ms 产出一块),CPU 每块忙 60 ms 还有 40 ms 空闲,瓶颈是设备

注意模型假设:数据必须先到缓冲区再到工作区(两次搬移)、一块为单位处理。若题目"CPU 直接从缓冲区处理"(无 M),单缓冲公式退化为 max⁡(C,T)\max(C,T) 加上搬运安排,以题干描述为准,先画时间线再套公式。

3.4 假脱机 SPOOLing(高频概念题)

脱机技术的由来:早期用外围专门机器(卫星机)脱机完成慢速 I/O,主机只与快速的磁带打交道。SPOOLing(Simultaneous Peripheral Operations On-Line,外围设备联机操作)用一道程序模拟脱机时的卫星机,把独占设备改造成共享设备——核心是"用空间(磁盘井)换并行"。

SPOOLing 系统的组成(三件套,必背):

  1. 输入井与输出井:磁盘上开辟的两个存储区域,模拟脱机时的磁带;输入井暂存设备输入数据,输出井暂存待输出数据
  2. 输入缓冲区与输出缓冲区:内存中,中转:设备 ↔ 内存缓冲区 ↔ 磁盘井
  3. 输入进程 SPi 与输出进程 SPo:模拟脱机时的卫星机;SPi 把设备数据经输入缓冲区转存输入井,SPo 把输出井数据经输出缓冲区送设备

共享打印机实例(必考):打印机是典型独占设备,直接分配则一个进程打印期间其他进程全部阻塞等待。SPOOLing 化之后:

  1. 打印请求到达,假脱机管理进程在输出井中申请空闲盘块,将打印数据写入,并插入请求队列
  2. 进程立即返回继续干别的(对用户而言"打印瞬间完成")
  3. 打印机空闲时,SPo 从队列取出第一个请求,输出井数据经输出缓冲区送打印机打印

效果:独占设备被改造成共享设备(宏观上多进程同时"打印"),请求形式上是"虚拟设备"——每个进程都觉得自己有一台打印机。代价:占磁盘空间、有排队延迟。同理还有共享网卡、批处理任务队列。判断题口径:SPOOLing 系统必须有磁盘(井)且必须有并行的 CPU 处理,才能边计算边假脱机。

四、设备驱动与中断处理

4.1 设备驱动程序

设备驱动程序是上层抽象命令到硬件操作的翻译层:收到设备独立性软件传来的抽象请求(read/write/block number),把它翻译成对具体控制器寄存器的写操作序列(写命令寄存器、置 DMA 参数等),必要时阻塞自己等待完成。驱动与硬件紧密相关,每类设备一个;不同 OS、不同型号设备的驱动互不兼容。驱动程序通常运行在内核态(也有用户态驱动设计,408 口径按内核态)。

4.2 中断处理流程(与计组衔接)

以"进程请求读磁盘"为例的完整时序(大题按此叙述):

  1. 用户进程调用库函数 → 系统调用陷入内核,进入设备独立性软件:校验、申请设备与缓冲
  2. 设备驱动程序把请求翻译成控制器命令,写入控制器寄存器启动设备;CPU 可切换去运行其他进程(原进程阻塞,参考进程与线程的运行→阻塞)
  3. 磁盘控制器完成操作,向 CPU 发I/O 完成中断
  4. CPU 响应中断(前提:指令周期结束、开中断),执行中断处理程序:保存现场 → 检查状态/传输数据 → 唤醒等待该 I/O 的进程 → 恢复现场、中断返回
  5. 被唤醒进程转为就绪态,调度后从缓冲区取数据继续

中断隐指令、中断向量、多重中断与屏蔽等硬件视角在计算机组成原理 输入输出系统统一讲;本章掌握"OS 侧:谁阻塞、谁唤醒、哪层做什么"。

常见坑

  1. 层次归属:SPOOLing 在用户层软件(假脱机管理进程模拟脱机);缓冲管理在设备独立性软件;"向控制器寄存器写命令"是驱动程序;三个最容易互相搬家
  2. 缓冲公式别背反:单缓冲 max⁡(C,T)+M\max(C,T)+M;双缓冲 max⁡(C+M, T)\max(C+M,\ T)。双缓冲不是简单减半;当 TT 远大于 C+MC+M 时双缓冲每块耗时就是 TT(设备是瓶颈)
  3. "缓冲区"与"工作区"是两段内存:题目问"处理一块数据需要几步搬移"时,设备→缓冲区→工作区共两跳,MM 只算第二跳
  4. SPOOLing 前提:没有磁盘井就没有 SPOOLing;SPOOLing 把独占设备改造为共享(虚拟)设备,不是提高设备本身速度——"提高了 I/O 速度"这类说法要按"宏观并行/减少等待"理解
  5. 设备分配四表名字别混:DCT 挂等待队列、SDT 全系统一张且含驱动入口、CHCT 指向通道——题目爱考"每台设备一张/全系统一张"
  6. 统一编址 vs 独立编址:统一编址"占内存空间、无需专用指令";独立编址"专用 I/O 指令、空间独立"——两两互为对方缺点,按对称背

自测

  1. "把逻辑块号转换为物理盘块号、并管理缓冲区"属于 I/O 层次结构中的哪一层?
  2. 设备分配的四张表中,全系统只有一张的是哪张?其中每个表项包含指向哪张表的指针?
  3. 单缓冲:T=90T = 90 ms,M=6M = 6 ms,C=60C = 60 ms,处理一块平均多少 ms?双缓冲呢?
  4. 判断:SPOOLing 技术将独占设备改造为共享设备,其实现必须依赖磁盘作为"井"。( )
  5. CPU 响应 I/O 完成中断后,由中断处理程序完成的、与进程管理直接相关的关键动作是什么?

自测答案

  1. 设备独立性软件(设备无关软件)。逻辑块映射与缓冲管理是其职责;具体寄存器操作才属于驱动程序。
  2. SDT(系统设备表);每个表项含指向该设备 DCT(设备控制表)的指针(以及设备类型、标识符、驱动程序入口)。
  3. 单缓冲 max⁡(60,90)+6=96\max(60,90)+6 = 96 ms;双缓冲 max⁡(60+6,90)=90\max(60+6, 90) = 90 ms。
  4. 对。井在磁盘上,没有磁盘(及井)无法实现假脱机;改造目标是共享/虚拟设备。
  5. 唤醒因等待该 I/O 而阻塞的进程(阻塞→就绪),随后恢复现场、中断返回。