5.1 I/O 管理基础
5.1.1 I/O 管理基本概念
I/O 管理:操作系统对主机外部硬件进行管理,完成主机与外设之间的信息传输。
常见 I/O 设备:鼠标、键盘、打印机、硬盘、固态硬盘。
5.1.2 I/O 设备的分类
按设备特性分类
存储设备:硬盘、SSD,用于持久化保存数据
输入输出设备:键盘、鼠标、打印机,完成信息输入输出
按传输速率分类
低速设备:鼠标、键盘
中速设备:打印机、传真机
高速设备:磁盘、固态硬盘
按信息交换单位分类
字符设备:以字符为单位交换,传输速率低,多采用中断驱动;例:鼠标、键盘
块设备:以数据块为单位交换,属于有结构设备,支持随机寻址访问;例:磁盘、固态硬盘
按设备共享属性分类
独占设备:同一时刻仅允许一个进程使用,属于临界资源;例:打印机、传真机
共享设备:同一时刻允许多个进程访问;例:磁盘、固态硬盘
虚拟设备:借助 Spooling(假脱机)技术,将物理独占设备改造为逻辑上的共享设备,一台物理设备映射为多台逻辑设备。
5.1.3 I/O 接口(设备控制器)
I/O 设备分为机械部件、电子部件;其中电子部件即为 I/O 接口(I/O 控制器、设备控制器),是主机与外设之间信息交换的逻辑桥梁。
主机侧(内部接口):连接系统总线,数据并行传输
外设侧(外部接口):通过 USB、电缆连接外设,可串行 / 并行传输
I/O 接口四大功能
数据缓冲:解决 CPU、主存与外设速度不匹配,接口内部设置缓冲区域暂存数据。
数据格式转换:完成串‑并转换、数模 / 模数转换,匹配主机与外设的数据格式。
控制与定时:接收总线控制定时信号,协调外设动作时序,管控数据通信流程。
错误与状态检测:设置状态寄存器,CPU 读取寄存器,获取外设工作状态与出错信息。
I/O 接口内部寄存器
数据缓冲寄存器:暂存 CPU / 内存交互的数据。
状态寄存器:记录接口、外设工作状态。
控制寄存器:存放 CPU 下发给外设的控制命令。
状态、控制寄存器分时工作、数据流向相反,硬件上可以合并为状态‑控制寄存器。
I/O 接口的分类
按数据传送方式
并行接口:字节 / 字全部位同时传输
串行接口:数据一位一位依次传输
按主机访问设备的控制方式:程序查询接口、程序中断接口、DMA 接口
按可编程性
可编程接口:可通过程序修改接口功能与工作方式
不可编程接口:接口功能硬件固定,无法由程序修改
5.1.4 I/O 端口与编址方式
I/O 端口:CPU 可以直接访问的接口内部寄存器。
数据端口:存放传输的数据,可读可写
控制端口:存放 CPU 下发的控制命令,CPU 只写
状态端口:存放外设状态,CPU 只读
每一个端口拥有独立地址,一个 I/O 接口可以包含多个端口,对应多个端口地址。
两种编址方式:
独立编址(I/O 独立编址)I/O 端口地址与内存地址相互隔离;需要专门的 I/O 读写指令,不会占用主存地址空间。
统一编址(内存映射 I/O/ 存储器映射 I/O)将一部分主存地址划分给 I/O 端口;使用普通访存指令访问端口,不需要专门 I/O 指令;缺点是占用主存地址,减少可用主存范围。
5.1.5 I/O 的三种控制方式
1)程序查询方式
CPU 通过程序循环查询外设状态,控制主机与外设数据交换。每次读写前 CPU 检查外设是否就绪。
定时查询:CPU 周期性读取状态寄存器,其余时间可以执行其他任务。
缺点:存在忙等,CPU 与外设串行工作,CPU 利用率低。
2)程序中断方式
CPU 启动外设之后,不需要原地等待;将 I/O 进程挂起,调度其他进程运行,实现 CPU 与外设并行工作。 外设完成 I/O 操作后,向 CPU 发送 I/O 中断请求。CPU 响应中断,保存现场,执行中断服务程序完成一次数据传送;传送结束恢复现场,回到原来被打断的进程继续运行。
工作流程
CPU 下发读写命令,启动外设,CPU 执行其他任务
外设完成操作,发出中断请求
CPU 响应中断,转入中断服务程序
读取控制器状态,就绪则执行数据传送,否则做错误处理
完成一次字的读写;判断任务是否结束,未结束则再次启动外设。
优点:CPU 与外设并行工作。
缺点:一次中断仅传送一个字;频繁中断会带来开销,降低 CPU 利用率。
3)DMA 方式(直接存储器存取)
依靠 DMA 控制器硬件,在外设和内存之间建立直接数据通路;数据传输阶段不需要 CPU 参与,适合磁盘等高速设备成批数据传输。
三个阶段:
预处理:CPU 向设备发命令,初始化 DMA 控制器。
数据传送:DMA 控制器申请总线控制权,完成外设与主存之间批量数据传输。
后处理:传输完成,DMA 向 CPU 发送中断,CPU 执行中断服务程序完成善后工作。
特点:
以数据块为单位传输;
数据传输阶段无需 CPU 干预;预处理、后处理需要 CPU;
相比中断方式进一步提升 CPU 与 I/O 并行度。
对比:中断方式的数据传送由 CPU 中转完成;DMA 直接在外设‑内存之间搬运数据。
5.2 I/O 软件层次结构
I/O 软件采用分层结构,从上到下层次:用户层 I/O 软件 → 设备独立性软件(设备无关软件) → 设备驱动程序 → 中断处理程序 → 硬件。
下层屏蔽硬件细节;上层调用下层提供的服务,向上层提供抽象接口。
5.2.1 中断处理程序
中断处理程序底层负责识别中断类型,完成中断处理。 中断工作过程:
检测未响应的中断信号;收回 CPU 使用权,交给中断处理程序。
保存被中断进程 CPU 现场环境。
转入对应中断服务程序执行处理。
中断处理完成,恢复被中断进程 CPU 环境,退出中断。
硬件先完成一部分现场保存,再交给中断服务程序处理。
5.2.2 设备驱动程序
每一类设备对应一套驱动程序。 功能:将上层抽象 I/O 请求转换为设备硬件可识别的操作指令,屏蔽硬件差异。 例:将逻辑簇号转换为磁盘物理地址。
工作流程:
接收上层下发 I/O 请求
检查 I/O 请求合法性,读取设备状态
设备就绪则向设备控制器寄存器写入参数、数据
启动 I/O 设备,完成硬件操作。
5.2.3 设备独立性软件(设备无关软件)
驱动程序不直接接收用户请求,由设备独立性软件接收。 引入逻辑设备、物理设备概念:用户使用逻辑设备名访问设备,软件完成逻辑设备名到物理设备名映射。
主要功能:
缓冲区管理,缓解 CPU 与 I/O 速度差异;
设备分配与回收,分配设备、控制器、通道;
虚拟设备,依托 Spooling 技术实现独占设备虚拟共享;
为驱动程序提供统一接口,更换硬件不需要修改上层 I/O 软件。
5.2.4 用户层 I/O 软件
面向用户的交互接口。
系统调用 vs 库函数
系统调用:运行于内核态,调用操作系统内核服务,面向硬件。
库函数:运行于用户态,封装系统调用,面向编程开发,方便程序员使用。
5.2.5 设备接口分类
字符设备接口(流设备接口)以字符为单位交换数据,按流访问,先进先出;大多采用中断驱动。
块设备接口以数据块为单位交换,支持寻址、随机读写;磁盘、SSD 属于块设备。 功能:将磁盘二维地址(柱面、盘面、扇区)映射为一维逻辑块号;把上层
read/write抽象命令转为底层硬件操作。
核心区别:是否支持随机访问。
5.2.6 阻塞 I/O 与非阻塞 I/O
阻塞 I/O进程发起 I/O 系统调用之后,进程从运行队列移入阻塞队列;I/O 完成后进入就绪队列;调度回 CPU 之后获取返回结果。
非阻塞 I/O发起 I/O 调用,如果内核缓冲区没有就绪数据,直接返回错误,进程不会阻塞。
优点:进程不被挂起。
缺点:需要轮询内核状态,消耗 CPU 资源。
5.2.7 缓冲区管理
缓冲是数据的中转站。
硬件缓冲:寄存器硬件实现
软件缓冲:操作系统在内存开辟存储区域。
单缓冲进程发出 I/O 请求,分配一个内存缓冲区。 块设备输入:磁盘→缓冲区→用户区。 设磁盘输入缓冲区时间 T,缓冲区拷贝到用户区 M,CPU 处理 C;除第一块、最后一块,平均处理时间:$$\max(C,T)+$$。 单缓冲同一时刻只能单向传输,输入输出不能同时进行。
双缓冲分配两个缓冲区,交替使用。分别设置发送、接收缓冲区,可以同时收发。 提升并行度,但如果设备速度差距过大,改善有限。
循环缓冲多个大小相等缓冲区连成循环队列,属于专用缓冲,为特定输入输出设置。 缺点:内存利用率低,大量开辟会浪费内存。
缓冲池缓冲池是操作系统为解决单/双缓冲、循环缓冲的缺陷,在内存中统一开辟的一组公用、可复用的缓冲区集合,是多进程共享的通用缓冲机制,不再局限于单一输入或输出任务。
其核心工作原理为:通过三类队列管理空闲、已输入、待输出缓冲区,搭配四类专属工作缓冲区,实现缓冲区的动态分配、复用与回收,全程衔接外设、内存与进程数据交互,避免缓冲区闲置浪费,适配多进程并发I/O场景。
核心运行规则:所有缓冲区初始均挂载在空白缓冲队列;仅被进程调用时,从对应队列摘下作为工作缓冲区使用;任务完成后,缓冲区归队复用,永久循环利用,无需重复开辟内存。
输入工作完整流程(外设→缓冲池→进程)① 收容输入:当外设产生输入数据时,系统从空白缓冲队列队首摘取一个空闲缓冲区,作为「收容输入工作缓冲区」,接收外设传输的原始数据,缓冲区填满后,将其挂载至输入队列末尾; ② 提取输入:用户/计算进程需要读取数据时,从输入队列队首摘取装满数据的缓冲区,作为「提取输入工作缓冲区」,将缓冲区数据拷贝至进程用户内存区;数据读取完毕后,清空该缓冲区,将其归还至空白缓冲队列,等待复用。
输出工作完整流程(进程→缓冲池→外设)① 收容输出:当进程需要向外设输出数据时,系统从空白缓冲队列队首摘取空闲缓冲区,作为「收容输出工作缓冲区」,接收进程用户内存区的待输出数据,缓冲区填满后,挂载至输出队列末尾; ② 提取输出:外设空闲时,系统从输出队列队首摘取装满数据的缓冲区,作为「提取输出工作缓冲区」,将缓冲区数据传输至外设;传输完成后,缓冲区清空,归还至空白缓冲队列。
5.2.8 设备分配与回收
通道:独立于 CPU 的 I/O 专用处理器,实现内存与外设直接数据交换。 设备分配任务:按照策略分配设备、控制器、通道,保障通信。
设备分配核心数据结构:
设备控制表 DCT:系统为每一个物理设备配置一张 字段:设备类型、设备标识符(物理设备名)、设备忙 / 空闲状态标志、指向控制器表的指针、重复执行次数、设备请求队列队首指针(等待该设备的进程 PCB 链表)。
系统设备表 SDT:整个系统仅有一张,记录系统全部 I/O 设备信息,每个设备占一个表项。
5.2.9 Spooling 假脱机技术
脱机 I/O:使用外围控制机完成低速 I/O 设备与高速磁盘之间的数据传输。
Spooling(假脱机,联机):用内存中的 I/O 进程模拟外围控制机,核心本质为空间换时间。系统在高速磁盘上开辟输入井、输出井两块专属存储空间,利用高速磁盘空间缓存低速外设的IO数据,以此抵消CPU与低速外设的速度差。
无Spooling时:CPU必须低速等待外设完成IO传输,CPU与外设串行工作,大量时间浪费在忙等; 有Spooling时:CPU只需高速完成内存与磁盘井的数据交互,无需等待慢速外设,后续外设与磁盘的数据传输由后台进程异步完成。
输入:低速外设 → 内存输入缓冲区 → 高速磁盘输入井;CPU 需要数据直接读磁盘。
输出:CPU 数据 → 内存输出缓冲区 →高速磁盘输出井;再由磁盘后台同步输出到低速外设。
外围 I/O 操作和 CPU 处理可以并行,用磁盘存储空间的开销,换取CPU大量空闲时间,大幅提升系统并发与整体效率。
Spooling 特点:
缓解 CPU 与低速 I/O 设备速度不匹配;
将独占设备改造为虚拟共享设备;
一台物理设备虚拟为多台逻辑设备。
5.3 外存管理
磁盘属于块设备,以块为单位访问;主存以字节 / 字访问。
5.3.1 磁盘物理结构
磁盘三要素:柱面、盘面、扇区。 磁盘总容量 = 盘面数 × 每个盘面柱面数 × 每个磁道扇区数 × 每个扇区字节数。
扇区错位编号:磁头读完一个扇区,CPU 处理需要时间,磁盘持续旋转;错位编号可以减少旋转延迟。
磁盘格式化、分区
低级格式化(物理格式化):磁盘出厂默认完成,属于硬件级格式化。对整块物理磁盘划分磁道、柱面、扇区,标记坏扇区、初始化磁盘硬件底层参数,建立磁盘物理存储架构。
磁盘分区:把一块物理磁盘划分为多个逻辑独立分区;可以指定活动分区用于系统引导;不同分区可以使用不同文件系统。分区仅划分磁盘空间边界,不创建文件系统、不格式化扇区。
高级格式化(逻辑格式化):针对单个磁盘分区的软件级格式化,日常电脑格式化均为该操作。核心作用是为分区创建文件系统,初始化根目录、位示图、空闲分区表等文件管理数据结构,让操作系统能够识别、读写该分区。特点:仅清空分区文件管理信息,不重新划分磁盘物理扇区,速度快、无硬件损伤。
新买的空白硬盘,厂商出厂做低级格式化,打好磁盘物理基础;我们装机时把硬盘分成C盘、D盘是磁盘分区;重装系统、右键格式化D盘,是对单个分区做高级格式化。
区分:低级格式化针对整块磁盘;高级格式化针对分区。
引导块:每个分区都包含引导块,存放操作系统引导代码。
坏块:损坏无法正常读写的扇区,只能屏蔽,不能修复。
5.3.2 磁盘访问时间
磁盘读写总时间 = 寻道时间 + 旋转延迟时间 + 数据传输时间。
5.3.3 磁盘调度算法
FCFS 先来先服务:按照请求到达顺序访问。公平,不会饥饿;寻道开销大。
SSTF 最短寻道时间优先:每次选择距离当前磁头最近的磁道。会产生进程饥饿。
SCAN 电梯算法:磁头沿一个方向移动,沿途处理请求,到达端点反向。
C‑SCAN 循环扫描算法:磁头单向服务,到达端点直接跳转到另一端起点,继续单向处理请求。
LOOK、C‑LOOK 算法:SCAN、C‑SCAN 改进版本;磁头只移动到最远的请求位置就折返,不需要走到磁盘物理末端磁道。
5.3.4 SSD 固态硬盘
SSD 由 NAND 闪存组成。
NAND 闪存特性:不支持原地覆盖写入;要改写已有页,必须先执行块擦除操作。 闪存块擦写次数存在上限。
磨损均衡:平衡各个闪存块擦写次数,延长 SSD 寿命。
动态磨损均衡:记录每个块擦写次数;分配空闲擦写次数最少的块进行写入。
静态磨损均衡:把长期不修改的冷数据,迁移到擦写次数高的块;新数据写入擦写次数少的空闲块,均衡整体磨损。