操作系统

设备管理负责管理计算机的 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 语言的 printfscanffreadfwrite
  • 将格式化数据转换为系统调用
  • 对用户屏蔽底层细节

设备无关操作系统层(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-LOOKSCAN 变种,磁头只走到最后一个请求位置更好不到达磁盘端头,减少无效移动

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 10RAID 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 控制方式

重点 磁盘调度算法对比

参考 重点 磁盘调度算法