目的
- 缓和 CPU 与 I/O 设备速度不匹配的矛盾
- 减少对 CPU 的中断频率
- 实现数据流的平滑和暂存
- 允许 CPU 和设备在数据传送速率上解耦
缓冲类型
| 类型 | 描述 | 处理时间公式 |
|---|
| 单缓冲 | 一个缓冲区,CPU 和 I/O 交替使用 | T=max(CPU,I/O) |
| 双缓冲 | 两个缓冲区,CPU 和 I/O 可同时工作 | T=max(CPU,I/O)(可重叠) |
| 循环缓冲 | 多个缓冲区组成环形队列,生产者-消费者模式 | 适合连续数据流 |
| 缓冲池 | 系统统一管理多个缓冲区,动态分配 | 全局共享,利用率高 |
工作原理
单缓冲(Single Buffer)
- 系统在内存中分配一个缓冲区
- 输入:设备 → 缓冲区 → CPU(交替进行)
- CPU 处理缓冲区数据时,设备不能向缓冲区写入新数据
- CPU 处理时间 TCPU 和 I/O 传输时间 TIO 串行重叠
- 处理 n 块数据的总时间:n×max(TCPU,TIO)+min(TCPU,TIO)
- 适用于 CPU 和设备速率接近的场景
双缓冲(Double Buffering)
- 两个缓冲区交替使用:缓冲区 1 和缓冲区 2
- 设备填充缓冲区 1 的同时,CPU 处理缓冲区 2
- 设备填充缓冲区 2 的同时,CPU 处理缓冲区 1
- CPU 和 I/O 可并行工作(缓冲区大小设置合理时)
- 处理 n 块数据的总时间:n×max(TCPU,TIO)
- 适用于 CPU 和设备速率相当且数据块较大的场景
循环缓冲(Circular Buffer)
- 多个缓冲区组成环形队列
- 典型的生产者-消费者模式
- 输入:设备(生产者)向空缓冲区填入数据
- 输出:CPU(消费者)从满缓冲区取走数据
- 使用指针/索引管理缓冲区状态(空/满)
- 解决多缓冲区的组织管理问题
- 适用于持续数据流(如音频、视频播放)
缓冲池(Buffer Pool)
- 系统维护一组大小相同的缓冲区
- 支持三种队列:空缓冲队列、装满输入数据的缓冲队列、装满输出数据的缓冲队列
- 按需从缓冲池获取和释放缓冲区
- 优点:全局统一管理,缓冲区利用率高,灵活性好
- 现代操作系统普遍采用
数据流向
- 输入:I/O 设备 → 缓冲区 → CPU
- 输出:CPU → 缓冲区 → I/O 设备
- 缓冲区在内存中实现数据的暂存和速度匹配