缓冲区管理 - wolai 笔记

1. 缓冲区概念

缓冲区是一个存储区域,可由专门硬件寄存器组成,一般利用内存作为缓冲区

2. 作用

  • 缓和CPUIO设备之间速度不匹配的矛盾
  • 减少对CPU的中断频率,放宽对CPU中断相应时间的限制
  • 解决数据粒度不匹配的问题:如输入进程一次一块数据,IO设备每次只能输出一个字符

3. 单缓冲

  • 设备—(T)—缓冲区—(M)—工作区—(C)—处理
  • 注意:当缓冲区数据非空时,不能往缓冲区冲入数据,只能从缓冲区把数据传出;
  • 注意当缓冲区为空时,可以往缓冲区冲入数据,但必须把缓冲区填满之后,才能从缓冲区把数据传出
  • 处理一块数据平均耗时Max(C, T) + M
  • 分析问题的初始状态:工作区满,缓冲区空
注意
  • T > C,CPU处理完数据不能将下一块数据传送到工作区,必须等待缓冲区中充满数据
  • T < C,缓冲区中充满数据后暂时不能继续冲入下一块数据,必须等待CPU处理结束后将数据从缓冲区传送到工作区
结论:采用单缓冲策略,处理一块数据平均耗时 Max(C, T) + M

4. 双缓冲

  • 处理一块数据平均耗时Max(T, C+M)
  • 分析问题的初始状态:工作区空,一个缓冲区满,另一个缓冲区空
假设初始状态为:工作区空,其中一个缓冲区满,另一个缓冲区空
结论:采用双缓冲策略,处理一个数据块的平均耗时为Max(T, C+M)

5. 使用单/双缓冲在通信时的区别

两台机器之间通信时,可以配置缓冲区用于数据的发送和接受
显然,若两个互相通信的机器只设置单缓冲区,在任一时刻只能实现数据的单向传输
若两个互相通信的机器设置双缓冲区,则同一时刻可以实现双向的数据传输
注:管道通信中的“管道”其实就是缓冲区。要实现数据的双向传输,必须设置两个管道

6. 循环缓冲

  • 多个大小相等的缓冲区链接成循环队列
  • in指针指向第一个空缓冲区,out指针指向第一个满缓冲区

7. 缓冲池

缓冲池由系统中公用的缓冲区组成
这些缓冲区按使用状况分为:
  • 空缓冲队列
  • 装满输入数据的缓冲队列(输入队列)
  • 装满输出数据的缓冲队列(输出队列)
缓冲区在实际运算中扮演的功能不同,又设置四种工作缓冲区
  • 用于收容输入数据的工作缓冲区(hin)
  • 用于提取输入数据的工作缓冲区(sin)
  • 用于收容输出数据的工作缓冲区(hout)
  • 用于提取输出数据的工作缓冲区(sout)
  • 输入进程请求输入数据:从空缓冲队列中取出一块作为收容输入数据的工作缓冲区(hin),充满数据后将缓冲区挂到输入队列队尾。
  • 计算进程想要取得一块输入数据:从输入队列中取得一块充满输入数据的缓冲区作为“提取输入数据的工作缓冲区(sin)”。缓冲区读空后挂到空缓冲区队列。
  • 计算进程想要将准备好的数据冲入缓冲区:从空缓冲队列中取出一块作为“收容输出数据的工作缓冲区(hout)”。数据充满后将缓冲区挂到输出队列队尾。
  • 输出进程请求输出数据:从输出队列中取得一块充满输出数据的缓冲区作为“提取输出数据的工作缓冲区(sout)。缓冲区读空后挂到空缓冲区队列”。

Comment