更新于 

缓冲区&结束语

缓冲区管理

这节接上一张仍然是核心子系统的功能实现,本节是缓冲区管理。

什么是缓冲区

缓冲区我们并不陌生,机组原理中讲过的cache还有操作系统中讲述的高速缓冲tlb都是以中国缓冲区,他们都是一个存储区域,可以由专门的硬件寄存器组成,也可以利用内存作为缓冲区。使用硬件作为缓冲区的成本较高,容量也较小,一般仅用于对速度要求非常高的场合(如存储器管理中的联想寄存器TLB,由于对页表的访问频繁,因此使用速度很快的联想寄存器来存放页表项的副本)。一般情况下,更过的是利用内存部分空间作为缓冲区,“设备独立性软件的缓冲区管理就是要组织管理好这些缓冲区。

这里我们将详细讲述“内存作为缓冲区”的知识点。首先我们先要了解一下缓冲区的作用:

  1. 缓和cpu和I/O设备之间速度不匹配的矛盾。
  2. 减少对cpu的中断频率,放宽对cpu中断响应时间的限制。
  3. 解决数据颗粒度不匹配的问题,例如输出进程每次可以生成一块数据,但是I/O设备每次只能输出一个字符。
  4. 提高cpu和I/O设备之间的并行性。

这里我们介绍几种缓冲区管理策略

单缓冲

假设某用户进程请求某种块设备读入若干块的数据,如果采用单缓冲的策略,操作系统会在主存中为其分配一个缓冲区(如果题目中没有特别说明,一个缓冲区的大小就是一个块)。

此时当缓冲区数据非空时,不能往缓冲区冲入数据,只能从缓冲区把数据传出,当缓冲区为空时,可以往缓冲区冲入数据,但必须把缓冲区充满以后,才可以把缓冲区数据传出。其实特别类似于管道机制

如上图,块设备数据->缓冲区用时短于cpu处理数据的时间,因此读入的时间更快,那么一段时间后缓冲区就会被充满数据,此时就不能再继续输入数据了,需要等待cpu一直工作到缓冲区为空时才可以继续块设备数据->缓冲区。所以处理一块数据的平均用时=C+M。

当T>C时,那么cpu处理速度更快,反而不会是的缓冲区被充满,所以此时处理一块数据的平均用时=T+M。所以无论是哪种情况,永远是取速度慢的,所以采用单缓冲策略时,处理一块数据平均耗时Mx(C,T)+M。

双缓冲

假设某用户进程请求某块设备读入若干块的数据。如果采用双缓冲的策略,操作系统会在主存中为其分配两个缓冲区(如果题目中没有说明,一个缓冲区的大小就是一块)。那么此时设备对于将数据写入缓冲区1,2的速度相同并且缓冲区->工作区的速度相同的。那么此时假设初始状态为:工作区空,其中的一个缓冲区满,另一个缓冲区空。

那么如果T>M+C,此时即设备将数据填满空数据区2时,另一个数据区1已经全部移到工作区并且被cpu处理完了,那么每次都是设备->缓冲区的速度慢,所以处理一块数据的平均时间就是T。

如果此时T<M=c,那么也就是当满缓冲区1数据移到工作区且被cpu处理完之前,另一个空的缓冲区2已经被填满了,那么此时处理一块数据的平均时间就是M+C。并且在双缓冲策略中,我们发现缓冲区1和缓冲区2是交替进行两个任务:①空的时候就是被设备数据填充②满的时候就是将数据转移到工作区。相应频率是相同的,不会出现一个缓冲区一直空,一个缓冲区一直满的情况,因为两个任务并行进行。所以在双缓冲策略中,处理一个数据块的平均时间为Max(T,M+C)。

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

两台机器之间,可以配置缓冲区用于数据的发送和接受。

当采用单缓冲的时候,显然两个相互通信的机器只设置单缓冲区,那么在任一时刻只能实现数据的单向传输。显然效率并不高。所以一般使用双缓冲策略比较好:

此时两个相互通信的机器设置双缓冲时,则同一时刻可以实现双向的数据传输。我们对比发现实际上管道通信就是一种利用单缓冲区的方法,所以一个管道通信只能实现单一方向的数据传输,而如果想实现双向数据传输,就必须建立两个管道。

循环缓冲区

将过个大小相等的缓冲区链接成一个循环队列。下图中,绿色表示空缓冲区,橙色代表已充满数据的缓冲区。

缓冲池

缓冲池由系统中的共用的缓冲区组成,这些缓冲区按使用状况可以分为:空缓冲队列,装满输入数据的缓冲队列(输入队列),装满输出数据的缓冲队列(输出队列)。另外,根据一个缓冲区在实际运算中扮演的功能不同,又设置了四种工作缓冲区(全部都是以缓冲池的视角命名的):

  • 用于收容输入数据的工作缓冲区(hin):存储的是要输入到用户进程的数据,但是要暂时存放到缓冲池,完成的是设备输入数据->缓冲区

  • 用于提取输入数据的工作缓冲区(sin):存储的是要输入到用户进程的数据,并且是要离开缓冲池,完成的是缓冲池的输入数据->用户进程

  • 用于收容输出数据的工作缓冲区(hout):存储的是要输出到设备的数据,但是要暂时存放到缓冲池,完成的是用户进程输出数据->缓冲区

  • 用于提取输出数据的工作缓冲区(sout):存储的是要输出到设备的数据,并且是要离开缓冲池,完成的是缓冲池的输出数据->设备

总结

结尾语

历时半个月,我终于完成了408–操作系统一周目的学习,20天的熬夜学习换来了丰富的回报,独自一人在图书馆中爆肝王道笔记的场景历历在目,相信经过这次学习更加坚定了长时间战线学习的信念👊,接下来敬请期待我的计算机组成原理学习笔记。–2021.1.18