设备管理负责管理计算机的 I/O 设备,提供统一、高效的设备访问接口。核心任务包括 I/O 控制方式的选择(程序直接控制、中断、DMA、通道)、设备驱动程序层次设计、缓冲与 SPOOLing 技术、磁盘调度算法以及 RAID 冗余存储,目标是屏蔽设备异构性、提高 I/O 效率并保证数据传输的可靠性。
I/O 控制方式
IO控制方式
设备管理的目标和功能
- 提高 CPU 与 I/O 设备之间的并行操作程度
- 为用户提供方便统一的界面
重点 四种 I/O 控制方式
方式 特点 CPU 参与程度 适用场景 程序控制方式(轮询) CPU 不断检查设备状态,忙等 全程参与,效率低 简单/低速设备 中断驱动方式 设备完成 I/O 后发中断通知 CPU 仅启动和完成时参与,但逐字节传输仍占用 CPU 中速设备 DMA 方式(直接存储器访问) DMA 控制器直接完成内存与设备间的数据传输 仅初始化参与,传输由 DMA 控制器完成 高速块设备(磁盘) 通道控制方式 I/O 处理器独立执行通道程序 几乎不参与,通道自主管理 I/O 大型系统、多设备场景 程序控制方式(Programmed I/O)
- CPU 循环检查设备状态寄存器,判断设备是否就绪
- 若设备未就绪,CPU 忙等(busy-wait),浪费大量 CPU 时间
- CPU 负责数据的逐字/逐字节传输(从设备到寄存器,再从寄存器到内存)
- 优点:实现简单,无需额外硬件支持
- 缺点:CPU 利用率极低,CPU 和 I/O 串行工作
中断驱动方式(Interrupt-driven I/O)
- CPU 发起 I/O 操作后可以执行其他任务
- I/O 设备完成操作后通过中断信号通知 CPU
- CPU 响应 中断与异常,保存现场,执行中断处理程序
- 数据仍由 CPU 逐字节传输(CPU 在中断处理中完成数据搬运)
- 优点:提高了 CPU 与 I/O 的并行度,CPU 利用率明显提升
- 缺点:频繁中断对于高速设备开销过大,数据仍需 CPU 中转
重点 DMA 方式(Direct Memory Access)
- DMA 控制器接管总线,直接在外设和内存之间传输数据
- 工作流程:CPU 设置 DMA 控制器(传输方向、内存地址、字节数)→ DMA 控制器控制总线传输 → 传输完成后发中断通知 CPU
- 数据传输无需 CPU 干预,CPU 只需处理起始设置和结束中断
- 适用于高速块设备(磁盘、显卡等)
- 优点:CPU 和 I/O 高度并行,适合大批量数据传输
- 缺点:DMA 控制器价格较高,DMA 传输占用总线(周期窃取)
通道控制方式(I/O Channel)
指向原始笔记的链接
- 通道是一个独立的、专门处理 I/O 操作的处理器(I/O 处理器)
- 拥有自己的指令系统,可执行通道程序
- CPU 只需向通道发送 I/O 指令,通道自主完成整个 I/O 过程
- 进一步减少 CPU 负担,适合大型计算机系统
- 通道分为:字节多路通道(连接多个低速设备)、数组选择通道(连接高速设备)、数组多路通道(同时服务多个高速设备)
设备使用方法
设备使用方法
重点 三种设备使用方法
方法 描述 应用场景 独占使用 独占设备一次只分配给一个进程 打印机、磁带机 共享使用 可同时被多个进程使用,通过调度交替访问 磁盘(通过文件系统) 虚拟使用(SPOOLing) 用共享设备模拟独占设备,将独占设备转化为共享设备 共享打印机 独占设备
- 分配给一个进程后,其他进程不能使用,直到释放
- 典型的独享设备:打印机、扫描仪、磁带机
- 需要设备分配和释放机制
- 可能导致死锁(进程 A 占用打印机等进程 B 的扫描仪,进程 B 占用扫描仪等进程 A 的打印机)
- 分配方式:静态分配(进程运行前分配)和动态分配(运行时按需申请)
共享设备
- 多个进程交替访问同一个设备
- 通过设备驱动和调度实现并发访问
- 典型的共享设备:磁盘
- 进程请求交错执行,由磁盘调度算法决定服务顺序
- 特点:设备利用率高,无死锁风险
重点 SPOOLing 技术(虚拟设备技术)
指向原始笔记的链接
- Simultaneous Peripheral Operations On-Line(联机同时外设操作)
- 核心思想:用磁盘等共享设备模拟独占设备
- 组成:
- 输入井:磁盘上模拟输入设备的缓冲区
- 输出井:磁盘上模拟输出设备的缓冲区
- 输入进程:负责将数据从物理输入设备读入输入井
- 输出进程:负责将数据从输出井写到物理输出设备
- 工作流程:
- 进程请求独占设备时,系统在磁盘上分配缓冲区(输入井/输出井)
- 进程与缓冲区交互,感觉自己在独占设备
- SPOOLing 后台进程实际与物理设备交互
- 典型应用:共享打印机
- 多个进程同时提交打印任务
- 各进程的输出写入磁盘输出井(各自独占输出井)
- SPOOLing 输出进程按顺序将输出井内容打印到物理打印机
- 用户感知:每个进程都有一台专用打印机(虚拟化)
- 优点:
- 将独占设备转化为共享设备,提高设备利用率
- 消除了设备分配中的死锁问题
- 通过磁盘缓冲平滑 I/O 速度差异
I/O 软件层次
IO软件层次
基本思想
- 按层次构建,较低层软件为较高层软件服务
- 使较高层软件独立于硬件
- 为用户提供统一接口
重点 I/O 软件层次结构
用户级 I/O(库函数,stdio) ↓ 设备无关操作系统层(命名、保护、缓冲、分配、错误处理) ↓ 设备驱动程序(设备特定操作、设备寄存器、中断处理) ↓ 中断处理程序(保存/恢复现场,处理中断) ↓ 硬件设备各层详解
用户级 I/O(User-level I/O)
- 提供标准库函数(如 C 语言的
printf、scanf、fread、fwrite)- 将格式化数据转换为系统调用
- 对用户屏蔽底层细节
设备无关操作系统层(Device-independent OS Layer)
- 设备命名:统一的逻辑设备名,独立于物理设备
- 设备保护:权限检查,防止未授权访问
- 缓冲处理:提供单缓冲、双缓冲等机制
- 设备分配与释放:管理独占/共享设备
- 错误处理:处理设备错误(重试、报告等)
- 提供统一的 I/O 系统调用接口
设备驱动程序(Device Driver)
- 设备特定的代码,每种设备类型对应一个驱动程序
- 负责操作设备寄存器,发送命令
- 实现中断处理例程
- 向上层提供标准接口,对下层封装硬件差异
- 通常以内核模块形式加载
中断处理程序(Interrupt Handler)
- 保存被中断进程的上下文(CPU 寄存器、程序计数器等)
- 识别中断源(通过中断向量表)
- 执行相应中断服务程序
- 恢复上下文,返回被中断进程
I/O 请求处理流程(用户→硬件)
用户进程调用 read/write(库函数) ↓ 用户态 → 内核态(系统调用) ↓ 设备无关层:参数校验、权限检查、缓冲管理 ↓ 设备驱动层:构造命令、操作设备寄存器、启动 I/O ↓ 中断处理程序:硬件完成 I/O 后触发中断,传输数据、唤醒等待进程 ↓ 返回用户态,数据就绪I/O 交通管制程序
- 负责各 I/O 设备之间的协调工作
- 管理 I/O 请求队列
I/O 调度程序
- 负责设备的分配和调度
- 决定请求的执行顺序(如磁盘调度算法)
I/O 设备处理程序(驱动程序)
指向原始笔记的链接
- 负责每类设备的具体操作
- 直接与硬件通信
缓冲技术
缓冲技术
目的
- 缓和 CPU 与 I/O 设备速度不匹配的矛盾
- 减少对 CPU 的中断频率
- 实现数据流的平滑和暂存
- 允许 CPU 和设备在数据传送速率上解耦
缓冲类型
类型 描述 处理时间公式 单缓冲 一个缓冲区,CPU 和 I/O 交替使用 双缓冲 两个缓冲区,CPU 和 I/O 可同时工作 (可重叠) 循环缓冲 多个缓冲区组成环形队列,生产者-消费者模式 适合连续数据流 缓冲池 系统统一管理多个缓冲区,动态分配 全局共享,利用率高 工作原理
单缓冲(Single Buffer)
- 系统在内存中分配一个缓冲区
- 输入:设备 → 缓冲区 → CPU(交替进行)
- CPU 处理缓冲区数据时,设备不能向缓冲区写入新数据
- CPU 处理时间 和 I/O 传输时间 串行重叠
- 处理 块数据的总时间:
- 适用于 CPU 和设备速率接近的场景
双缓冲(Double Buffering)
- 两个缓冲区交替使用:缓冲区 1 和缓冲区 2
- 设备填充缓冲区 1 的同时,CPU 处理缓冲区 2
- 设备填充缓冲区 2 的同时,CPU 处理缓冲区 1
- CPU 和 I/O 可并行工作(缓冲区大小设置合理时)
- 处理 块数据的总时间:
- 适用于 CPU 和设备速率相当且数据块较大的场景
循环缓冲(Circular Buffer)
- 多个缓冲区组成环形队列
- 典型的生产者-消费者模式
- 输入:设备(生产者)向空缓冲区填入数据
- 输出:CPU(消费者)从满缓冲区取走数据
- 使用指针/索引管理缓冲区状态(空/满)
- 解决多缓冲区的组织管理问题
- 适用于持续数据流(如音频、视频播放)
缓冲池(Buffer Pool)
- 系统维护一组大小相同的缓冲区
- 支持三种队列:空缓冲队列、装满输入数据的缓冲队列、装满输出数据的缓冲队列
- 按需从缓冲池获取和释放缓冲区
- 优点:全局统一管理,缓冲区利用率高,灵活性好
- 现代操作系统普遍采用
数据流向
指向原始笔记的链接
- 输入:I/O 设备 → 缓冲区 → CPU
- 输出:CPU → 缓冲区 → I/O 设备
- 缓冲区在内存中实现数据的暂存和速度匹配
磁盘调度
磁盘调度
磁盘结构
- 盘片(Platter):磁盘的物理盘片,双面均可记录数据
- 磁道(Track):盘片上的同心圆数据轨道
- 扇区(Sector):磁道上的最小存储单元,通常 512B
- 柱面(Cylinder):所有盘片上相同半径的磁道集合
- 磁盘容量 = 每扇区字节数 × 每磁道扇区数 × 每面磁道数 × 面数
磁盘访问时间组成
- 寻道时间(Seek Time):磁头移动到目标柱面所花费的时间,访问时间的主要部分
- 旋转延迟(Rotational Latency):目标扇区旋转到磁头下方的时间,平均为转半圈的时间
- 传输时间(Transfer Time):数据读写的时间
- 总访问时间 = 寻道时间 + 旋转延迟 + 传输时间
重点 磁盘调度算法
算法 策略 平均寻道 特点 FCFS 按请求顺序服务 ~55.3 简单公平,平均寻道长 SSTF(最短寻道时间优先) 选离当前磁头最近的请求 ~27.5 效率高,可能发生饥饿(磁壁粘着) SCAN(电梯算法) 单向移动,沿途服务,到端头反向 中等 请求等待时间较均匀 C-SCAN(循环扫描) 单向服务,另一端直接返回不服务 中等 响应时间更均匀 N-step SCAN 请求分 N 个子队列,逐队列 SCAN 较好 防止磁壁粘着 FSCAN 两个队列交替 SCAN,简化的 N-step 较好 减少粘着、实现简单 LOOK / C-LOOK SCAN 变种,磁头只走到最后一个请求位置 更好 不到达磁盘端头,减少无效移动 FCFS(先来先服务)
- 按请求到达的顺序依次服务
- 优点:实现简单,公平无饥饿
- 缺点:平均寻道时间长,磁头在磁盘上来回移动,效率低
- 平均寻道距离约 55.3(典型请求序列)
SSTF(最短寻道时间优先,Shortest Seek Time First)
- 每次选择离当前磁头位置最近的请求服务
- 优点:平均寻道时间减少,约 27.5
- 缺点:靠近中间磁道的请求可能被不断推迟,产生饥饿;极端情况下出现磁壁粘着(magnetic wall adhesion),即磁头长时间停留在某区域服务最近的请求,远处请求无限期等待
SCAN(电梯算法,Elevator Algorithm)
- 磁头从一端向另一端移动,沿途服务经过的请求
- 到达磁盘端头后反向继续服务
- 优点:不会饥饿,等待时间较为均匀
- 缺点:两端磁道的请求等待时间比中间长
C-SCAN(循环扫描,Circular SCAN)
- 磁头只在一个方向上服务请求
- 到达端头后直接快速返回另一端(返回路径不服务)
- 优点:各磁道请求的等待时间更加均匀
- 缺点:每次扫描服务请求数比 SCAN 少
N-step SCAN
- 将请求队列分成 N 个子队列
- 每次 SCAN 只处理一个子队列,新请求放入后续子队列
- 优点:有效防止磁壁粘着现象
- 参数 N 控制吞吐量和公平性的平衡
FSCAN
- N-step SCAN 的简化版本(N=2)
- 使用两个请求队列交替服务
- 当前队列用 SCAN 处理时,新请求放入另一个队列
- 优点:实现简单,同样能防止磁壁粘着
LOOK / C-LOOK(提前折返算法)
- 改进的 SCAN/C-SCAN
- 磁头不需要移动到磁盘端头,只移动到该方向最远的请求位置就折返
- LOOK 对应 SCAN,C-LOOK 对应 C-SCAN
- 优点:减少无效移动,缩短平均寻道时间
- 现代磁盘调度中实际采用 LOOK/C-LOOK
扇区交错(Sector Interleaving)
- 逻辑扇区号与物理扇区号错开排列
- 原因:磁盘旋转速度快,CPU 处理完一个扇区数据后若来不及读取下一个连续的物理扇区,需等一整圈
- 交错因子(Interleave Factor):逻辑连续扇区之间的物理扇区间隔
- 目的:减少旋转延迟,匹配 CPU 处理速度与磁盘传输速度
RAID 与磁盘调度
指向原始笔记的链接
- 磁盘阵列中调度算法需要考虑条带分布,利用并行性
- 独立磁盘间可并行执行多个请求
RAID
RAID
定义
- 独立磁盘冗余阵列(Redundant Array of Independent Disks)
- 将多个物理磁盘组合成一个逻辑磁盘
目的
- 提高性能:多个磁盘并行 I/O,条带化提高吞吐量
- 提高可靠性:通过冗余信息实现数据恢复,容忍磁盘故障
- 提高容量:聚合多个磁盘的空间
重点 RAID 级别详解
级别 描述 最少磁盘数 冗余 性能特点 RAID 0 条带化(Striping),数据分块交叉存储在各磁盘 2 无冗余 读写性能最高,但无容错 RAID 1 镜像(Mirroring),数据完全复制到另一磁盘 2 完全冗余 读快写慢(需双写),空间利用率 50% RAID 5 块级条带化 + 分布式奇偶校验 3 单盘容错 读性能高,写需计算校验 RAID 6 块级条带化 + 双分布式奇偶校验 4 两盘容错 读性能较高,写开销更大 RAID 10 RAID 1+0(先镜像再条带) 4 每对镜像内单盘容错 读写性能最佳 RAID 0(条带化)
- 数据以条带(strip)为单位依次写入各磁盘
- 优点:理论读写速度接近 n 倍单盘速度(n 为磁盘数)
- 缺点:无冗余,任一磁盘损坏导致所有数据丢失
- 适用:临时数据、高性能但可容忍丢失的场景(如视频编辑缓存)
RAID 1(镜像)
- 每份数据同时写入两个磁盘(镜像对)
- 读性能提升(可从任一磁盘读取),写性能下降(需双写)
- 磁盘利用率为 1/n(n 为偶数),仅 50%
- 一个磁盘故障时仍可正常访问镜像磁盘
- 适用:系统盘、重要数据、对可靠性要求高的场景
RAID 5(分布式奇偶校验)
- 数据和奇偶校验信息分布在所有磁盘上
- 校验信息不固定在某个磁盘,而是分布在各磁盘条带
- 单盘故障可通过其余磁盘数据和校验信息重建
- 写操作涉及读旧数据、读旧校验、写新数据、写新校验(读改写)
- 适用:兼顾性能、容量和可靠性的通用方案
RAID 6(双奇偶校验)
- 双重校验(P+Q),可容忍两个磁盘同时故障
- 磁盘空间损失为两个磁盘的容量
- 写开销大于 RAID 5(需更新两个校验)
- 适用:大容量存储系统、数据可靠性要求极高的场景
RAID 10(RAID 1+0)
- 先做镜像(RAID 1)再做条带化(RAID 0)
- 兼具 RAID 0 的高性能和 RAID 1 的高可靠性
- 最多可容忍每组镜像中损坏一个磁盘(不跨组)
- 读写性能均优,但空间利用率仅 50%
- 适用:高并发数据库、高性能服务器
选择考虑
指向原始笔记的链接
- 性能 vs 可靠性:RAID 0 性能最佳但无冗余;RAID 1/10 可靠性高;RAID 5/6 在两者间平衡
- 成本 vs 容量:RAID 1 有效容量仅为一半(成本高);RAID 5/6 有效容量高(校验位开销小)
- 重建时间:大容量时 RAID 5 重建时间较长(需读所有剩余磁盘);RAID 6 更安全;RAID 1 重建最快
- 写密集型 vs 读密集型:写密集选 RAID 10(无校验开销);读密集选 RAID 5
重点 三种 I/O 控制方式对比
参考 O 控制方式
重点 磁盘调度算法对比
参考 重点 磁盘调度算法