设备独立性软件-高速缓存与缓冲区

发布于:2025-07-28 ⋅ 阅读:(12) ⋅ 点赞:(0)

        高速缓存(Cache)和缓冲区(Buffer)是设备独立性软件优化 I/O 性能的两大“利器”,通过内存暂存数据减少低速设备(如磁盘、网络)的访问次数。

一、磁盘高速缓存(Disk Cache)

本质

  • 内存空间模拟“高速磁盘”,缓存磁盘读出的盘块(逻辑属于磁盘,物理在内存)。

形式

  1. 固定大小缓存
  • 例:Linux page cache(默认约 10% 内存),缓存文件系统块。
  1. 缓冲池共享
  • 请求分页(内存缺页调度)共享未用内存,动态调整。

作用

  • 减少磁盘 I/O:例:多次读同一文件块,首次读磁盘入缓存,后续读直接内存取。
  • 写合并:写操作先存缓存,批量刷盘(如 fsync() 强制写回)。


二、缓冲区(Buffer)

引入目的

  1. 速度匹配:CPU(快)⇨ 设备(慢)→ 缓冲暂存。
  2. 减少中断:设备多次写满一块(如串口每次发 1 字符,缓冲聚集成块再通知 CPU)。
  3. 数据粒度适配:设备块大小(512B)⇨ 程序读写(如 100B)→ 缓冲中转。
  4. 并行增强:CPU 处理缓冲数据时,设备填新缓冲(双缓冲/多缓冲)。

实现方式

  • 硬件缓冲:少 --- 成本高(如磁盘控制器内置小缓冲)。
  • 内存缓冲:重点(单/双/循环缓冲、缓冲池)。
单缓冲(Single Buffer)
1、定义与作用
  • 单缓冲是操作系统为每个I/O请求分配一个缓冲区的机制,用于临时存储设备与进程间传输的数据块(通常大小为磁盘块)。
  • 核心功能
    • 速率匹配:缓解CPU处理速度与I/O设备传输速度的差异。
    • 解耦生产与消费:设备写入缓冲区时,CPU可并行处理其他任务
2、关键参数
  • T:设备将数据块写入缓冲区的时间(I/O传输时间)。
  • M:将数据从缓冲区复制到进程工作区的时间(内存复制时间)。
  • C:CPU处理数据块的时间(计算时间)。

工作流程

  • 步骤1:设备将数据块写入缓冲区(耗时T)。
  • 步骤2:数据从缓冲区复制到进程工作区(耗时M)。
  • 步骤3:CPU处理数据(耗时C)。
  • :必须等待缓冲区装满(T完成)后才能开始MC

3、时间计算(关键考点)
  • 并行性T(设备传输)与C(CPU处理)可重叠,但M(复制)必须串行。
  • 两种情况
    • T > C
      • CPU处理完数据后需等待缓冲区再次装满。
      • 平均每块时间Max(C, T) + M = T + M(设备传输是瓶颈)。
    • T < C
      • 设备传输完数据后需等待CPU完成处理。
    • 平均每块时间Max(C, T) + M = C + M(CPU处理是瓶颈)。
    • 通用公式平均时间 = Max(C, T) + M

互斥访问:缓冲共享,需锁(例:设备写时 CPU 不能读)。


双缓冲(Double Buffer)
1、定义与作用
  • 双缓冲通过两个缓冲区交替使用,实现设备与CPU的并行操作,解决单缓冲的串行瓶颈。
  • 核心优势
    • 提高I/O与CPU并行性:设备写入一个缓冲区时,CPU可处理另一个缓冲区的数据。
    • 避免等待延迟:适用于双向数据传输(如管道、网络通信)。
2、关键参数
  • T:设备将数据块写入缓冲区的时间(I/O传输时间)。
  • M:数据从缓冲区复制到用户工作区的时间(内存复制时间)。
  • C:CPU处理数据块的时间(计算时间)。
3、工作流程:
  • 阶段1:设备向缓冲区1写入数据(耗时T),同时CPU处理缓冲区2的数据(耗时C+M)。
  • 阶段2:缓冲区1满后,设备转向缓冲区2写入数据,CPU处理缓冲区1的数据。
  • CM可并行执行,且与T重叠。

4、时间计算(关键考点)
  • 并行性T(设备传输)与C+M(CPU处理+内存复制)完全并行。
    • 两种情况
      • T > C + M
        • 设备是瓶颈,CPU处理完数据后需等待设备写入完成。
        • 平均每块时间Max(C+M, T) = T(由设备速度决定)。
      • T < C + M
        • CPU是瓶颈,设备写入完成后需等待CPU处理。
        • 平均每块时间Max(C+M, T) = C + M(由CPU速度决定)。
  • 通用公式平均时间 = Max(C+M, T)

效果:CPU 与设备并行度提升(同时填缓冲 1、移/处理缓冲 2)。

5、双缓冲的同步与双向通信

1、双向数据传输

  • 单缓冲问题:单缓冲区只能单向传输(如A→B或B→A,不能同时)。
  • 双缓冲解决方案
    • 每个机器配置两个缓冲区(发送缓冲区和接收缓冲区),实现全双工通信。
    • 示例:网络Socket通信中,双缓冲允许同时收发数据。

 2、互斥与同步

  • 缓冲区切换:需保证设备与CPU访问不同缓冲区,避免冲突。
  • 信号量控制:使用互斥锁保护缓冲区状态,避免同时读写同一缓冲区。

6、双缓冲 vs 单缓冲 vs 缓冲池

特性

单缓冲

双缓冲

缓冲池

缓冲区数量

1

2

动态多个

并行性

T∥C

M

串行

T∥(C+M)

多进程共享,高并发

平均时间

Max(C,T) + M

Max(C+M, T)

依赖队列管理

适用场景

低速设备(如打印机)

双向通信(如管道、网络)

高负载系统(如数据库)


循环缓冲(Circular Buffer)
1、定义与结构
  • 循环缓冲是由多个大小相等的缓冲区组成的环形队列,通过指针链接形成闭环(最后一个缓冲区指向第一个)。
  • 关键指针
    • in指针:指向下一个可写入的空缓冲区。
    • out指针:指向下一个可读取的满缓冲区。
  • 逻辑环形:物理上为线性内存,通过指针回绕(到达末尾后跳至头部)实现循环访问 。
2、数据读写流程
  • 写入数据
    • 输入进程将数据写入in指向的空缓冲区。
    • 缓冲区满后,in指针移至下一个空缓冲区(若到末尾则回绕) 。
  • 读取数据
    • 计算进程从out指向的满缓冲区提取数据。
    • 数据提取完毕后,out指针移至下一个满缓冲区

3、指针同步与冲突处理

  • 缓冲区满:若in追上out(所有缓冲区满),输入进程需等待计算进程释放缓冲区(通过信号量或阻塞机制。
  • 缓冲区空:若out追上in(所有缓冲区空),计算进程需等待输入进程填充数据

使用时机:在双缓冲机制中,当输入与输出的速度不匹配时,

 

用场景:流式数据(如音频输入:缓冲 1 播放时,缓冲 2 录新数据)。

in 指向第一个可以输入数据的空缓冲区,out 指向第一个可以提取数据的满缓冲区。输入/输出时,in 和 out 指针沿链接方向循环移动。

6、循环缓冲与缓冲池的对比

特性

循环缓冲

缓冲池

缓冲区数量

固定数量,循环复用

动态管理,按需分配

适用场景

连续数据流(如实时传输)

多进程共享的通用I/O操作

管理复杂度

较低(仅需维护in/out指针)

较高(需管理多个队列)


缓冲池(Buffer Pool)

        缓冲池是操作系统管理的公用内存区域,由多个缓冲区组成,用于协调不同速度的设备(如CPU与I/O设备)之间的数据传输

核心功能

  • 速率匹配:缓解CPU与I/O设备的速度差异(如磁盘与内存的读写速度差)。
  • 资源解耦:通过队列管理实现生产者和消费者的异步操作,避免进程阻塞 。
  • 提高并行性:允许CPU和I/O设备同时工作
缓冲池 vs 单/双缓冲
  • 单缓冲:仅一个缓冲区,处理时间取决于Max(C, T) + M(C为CPU处理时间,T为I/O传输时间,M为内存复制时间) 。
  • 双缓冲:两个缓冲区交替使用,处理时间优化为Max(T, C+M),适用于双向通信场景。
  • 缓冲池:动态管理多个缓冲区,支持更复杂的并发场景,如多进程共享。
缓冲池的组成与数据结构

1、队列分类

  • 空缓冲队列(emq):空闲缓冲区链表,用于分配新缓冲区 5。
  • 输入队列(inq):存储已装满输入数据的缓冲区 。
  • 输出队列(outq):存储待输出的数据缓冲区 。

2、工作缓冲区类型

  • 收容输入(hin):从emq获取空缓冲区,接收输入数据后挂到inq。
  • 提取输入(sin):从inq获取缓冲区供进程读取,使用后归还emq 。
  • 收容输出(hout):从emq获取空缓冲区接收进程输出数据,挂到outq 。
  • 提取输出(sout):从outq获取缓冲区输出数据,完成后归还emq 。

3、数据结构实现

  • 控制块:记录缓冲区状态(如设备号、块号、脏页标志) 。
  • 链表管理:通过双向链表实现队列,支持快速插入和移除
缓冲池的工作流程

 

1、收容输入(输入进程)

  • 调用GetBuf(emq)获取空缓冲区→填充数据→PutBuf(inq)挂到输入队列。示例:磁盘数据读
  • 入缓冲区后加入inq,等待计算进程处理 。

 2、提取输入(计算进程)

  • 调用GetBuf(inq)获取输入数据→处理数据→PutBuf(emq)释放缓冲区 。

3、收容输出(计算进程)

  • 调用GetBuf(emq)获取空缓冲区→填充输出数据→PutBuf(outq)挂到输出队列 。

4、提取输出(输出进程)

  • 调用GetBuf(outq)获取输出数据→写入设备→PutBuf(emq)释放缓冲区


三、高速缓存 vs 缓冲区

对比项

高速缓存(Cache)

缓冲区(Buffer)

目的

加速 (数据多读场景,如文件服务器)

匹配 速度粒度(读写均适用)

数据角色

原始数据拷贝(磁盘数据副本)

临时中转(最终不一定存磁盘,如打印机缓冲)

典型场景

磁盘读 page cache、CPU 缓存

串口接收(逐字符 → 块处理)、网络 socket 缓冲

空间管理

动态(如 LRU 淘汰旧缓存)

静态(单/双缓冲大小固定)或动态(缓冲池)


四、总结与对比

特性

单缓冲

双缓冲

缓冲池

缓冲区数量

1

2

动态管理(多个)

并行性

中(双向通信)

高(多进程共享)

适用场景

简单I/O任务

双向数据传输

高并发、复杂I/O(如数据库)

管理复杂度

高(需同步机制)

核心考点

1、单/双缓冲计算

  • 例:( T=10ms ), ( M=1ms ), ( C=5ms )
  • 单缓冲:( Max(10,5) +1 = 11ms )。
  • 双缓冲:( 10ms )(( T > C+M=6ms ), 设备持续填)。

2、缓冲池优势

  • 多进程共享,按需分配(如网络接收缓冲可用于 A 用户接收,后分配给 B 用户发送)。

3、写回策略

  • 高速缓存:延迟写(如 Linux dirty_expire_centisecs 控制刷盘时机)。
  • 缓冲区:视情况(如打印机缓冲需及时打印,无延迟)。

总结

        高速缓存和缓冲区通过“以快代慢”(内存代磁盘)、“并行处理”(双缓冲)优化 I/O 性能。理解单/双缓冲时间计算、缓冲池共享机制,能解释为何文件复制(cp)用缓冲比直接读快,以及网络服务器如何用缓冲池高效处理并发请求。

一句话记忆:缓存加速读,缓冲平速度,单双循环缓冲池,计算 Max 与并行! ✨        


网站公告

今日签到

点亮在社区的每一天
去签到