一、I/O 管理概述 #
1.1 I/O 的特点 #
- I/O 性能往往是系统性能的瓶颈
- 设备种类多、杂,并发控制复杂——操作系统庞杂的重要原因
- 速度差异大、控制接口复杂、传送单位不同、数据表示不一致、错误条件各异
- 与文件系统联系密切
1.2 设备分类 #
按数据特征分:
| 类型 | 特点 | 例子 | I/O 方式 |
|---|---|---|---|
| 字符设备 | 字节为单位,不可寻址,传输速率低 | 键盘、鼠标、串口 | get() / put() |
| 块设备 | 数据块为单位,可随机寻址 | 磁盘、磁带 | 文件系统接口或 mmap |
| 网络设备 | 格式化报文交换 | 以太网、无线、蓝牙 | send() / recv() |
按资源分配角度分:
| 类型 | 说明 | 例子 |
|---|---|---|
| 独占设备 | 一段时间内只能一个进程使用 | 打印机 |
| 共享设备 | 多个进程交叉使用 | 磁盘 |
| 虚设备 | 用共享设备模拟独占设备,SPOOLing | 用硬盘模拟打印机输入输出 |
1.3 I/O 管理的目标 #
- 控制设备操作,完成 I/O 设备与内存之间的数据交换(设备分配/回收、记录状态、执行驱动、中断处理、缓冲区管理)
- 建立统一、独立于设备的接口——用户使用逻辑设备名,系统屏蔽硬件细节
- 提高并行性——利用中断、缓冲、DMA 等技术使 CPU 与设备并行工作
- 保护——设备数据的安全与保密
1.4 设备驱动模型 #
硬件差异 vs 应用统一 → 引入中间层 VFS,通过 struct file / inode / dentry 的函数指针表实现多态。
二、I/O 硬件组成 #
2.1 设备控制器的功能 #
- 地址译码(端口地址)
- 按约定格式收发数据和控制信号
- 数模转换(数字 ↔ 模拟信号)
- 内部硬件缓冲、数据加工
当控制器接受一条命令后,可独立于 CPU 完成指定操作;操作完成时产生中断通知 CPU。
2.2 I/O 端口编址 #
| 内存映射编址(MMIO) | I/O 独立编址(PMIO) | |
|---|---|---|
| 地址空间 | 与内存统一编址 | 独立于内存 |
| 操作指令 | 可用所有内存指令(load/store) | 专用 in/out 指令 |
| 优点 | 指令丰富、不需专用指令 | 不占内存空间、易区分 |
| 缺点 | 占用内存空间、需要禁用控制寄存器缓存 | 指令类型少、操作不灵活 |
MMIO 的关键问题:控制寄存器不能进行高速缓存,否则轮询循环会只读缓存而错过设备状态变化。硬件必须支持逐页选择性禁用缓存。
三、I/O 控制方式 #
3.1 三种基本方式 #
| 方式 | 原理 | CPU角色 | 适用 |
|---|---|---|---|
| 可编程 I/O(轮询) | 由CPU代表进程给I/O模块发I/O命令,进程进入忙等待,直到操作完成才继续执行 | CPU 全程参与 | 简单低速设备 |
| 中断驱动 I/O | 操作完成后控制器发中断通知 CPU | 发起后切走,中断后处理 | 较复杂设备 |
| DMA | 控制器直接访问总线,在内存和外设间搬运数据 | 只参与开始和结束 | 高吞吐量设备 |


3.2 I/O 部件的演化 #
- CPU 直接控制外围设备
- 增加控制器,CPU 使用非中断可编程 I/O
- 采用中断方式,CPU 无需等待
- DMA 直接控制存储器(块传输)
- I/O 部件增强为独立处理器(I/O 通道)
- I/O 部件有自己的局部存储器(独立计算机)
四、I/O 软件层次 #
分层的设计思想:较低层考虑硬件特性,较高层不依赖硬件。
用户级 I/O 软件 ← 用户进程,系统调用,格式化 I/O 数据
独立于设备的软件 ← 设备命名、保护、缓冲、块大小统一
设备驱动程序 ← 设置设备寄存器、检查执行状态
中断处理程序 ← I/O 完成时唤醒驱动进程
硬件 ← 物理 I/O 操作4.1 设备独立性(设备无关性) #
- 用户使用逻辑设备名,系统完成逻辑→物理转换
- 好处:设备分配时灵活、易于实现 I/O 重定向
- 实现:设备作为特殊文件处理,用户 I/O 请求在文件系统中完成合法性检查和参数处理
4.2 设备驱动程序 #
- 每个设备驱动程序处理一种设备类型
- 接收来自上层软件的抽象请求并执行
- 与外界的接口:操作系统接口、系统引导接口、设备接口
4.3 I/O 进程模型 #
专门处理系统中 I/O 请求和中断的系统进程:
- 用户程序
send发 I/O 请求给 I/O 进程 →block阻塞自己 - I/O 完成后
wakeup唤醒用户进程 - 中断到达时,内核发消息给 I/O 进程处理
五、缓冲技术 #
5.1 为什么引入缓冲 #
- 解决 CPU 与 I/O 设备速度不匹配(最早引入的技术)
- 提高 CPU 与 I/O 设备之间的并行性
- 减少对 CPU 的中断请求次数
5.2 缓冲区分类 #
| 类型 | 说明 |
|---|---|
| 硬缓冲 | 设备中硬件寄存器实现 |
| 软缓冲 | 内存中开辟空间 |
| 单/双缓冲 | 基本形式 |
| 缓冲池 | 多个缓冲区,循环使用,生产者-消费者模型 |
5.3 UNIX System V 缓冲池 #
- 约 200 个缓冲区,每个 512 或 1024 字节
- 每个缓冲区 = 缓冲控制块(设备号、盘块号、状态、指针)+ 缓冲数据区
每个缓冲区同时在两条链中:
| 链 | 用途 |
|---|---|
| av 链(空闲队列) | 空闲缓冲区,头 bfreelist,按近似 LRU 分配 |
| b 链(设备队列) | 分配给具体设备的缓冲区,散列组织,64 个队列 |
散列公式:i = (b_dev + block) mod 64
访问流程:根据盘块号在 b 链查找 → 找到则标记"忙"并从 av 链取下 → 传送数据 → 释放回 av 链尾 → 保留在 b 链中(数据有效可复用)→ 长期未用从 av 链头被置换。
六、设备分配 #
6.1 独占设备分配 #
| 方式 | 说明 | 优缺点 |
|---|---|---|
| 静态分配 | 进程运行前分配,结束时回收 | 设备利用率低,但不会死锁 |
| 动态分配 | 进程提出申请时分配,停止使用时收回 | 效率好,但可能死锁 |
6.2 分时共享设备 #
以一次 I/O 为单位分时使用,请求排队。典型:SPOOLing 技术——用硬盘模拟打印机,打印请求排队由 daemon 进程逐个处理。
七、I/O 性能 #
目的:使CPU利用率尽可能不被IO降低,尽可能摆脱IO(如DMA)。
7.1 同步 vs 异步 I/O #
| 同步 I/O | 异步 I/O | |
|---|---|---|
| 进程状态 | 阻塞直到操作完成 | 发起后继续执行 |
| CPU 利用 | I/O 期间 CPU 空闲 | I/O 期间 CPU 可做其他事 |
| 实现 | 简单 | 通过线程切换或用户态分段发请求 |
| 例子 | 默认 read() |
Windows Overlapped I/O、aio_read |
7.2 性能优化措施 #
- 缓冲技术 → 减少速度差距
- 异步 I/O → CPU 不等待 I/O
- DMA / 通道 → CPU 摆脱 I/O 操作