缓冲区管理
1 简介
到目前为止,我们已经讨论了如何在数据库管理系统的最低级别管理磁盘空间,以及如何在基于页面的数据库系统中管理文件和索引。我们现在将探讨DBMS上这两个级别之间的接口-缓冲区管理器。
缓冲区管理器负责管理内存中的页面,并处理来自文件和索引管理器的页面请求。请记住,内存空间是有限的,因此我们无法在缓冲池中存储所有页面。缓冲区管理器负责收回策略,或者在空间已满时选择要收回的页面。当从内存中逐出页面或将新页面读入内存时,缓冲区管理器与磁盘空间管理器通信以执行所需的磁盘操作。
2 缓冲池
通过将空间划分为可放置页面的帧,将内存转换为缓冲池。缓冲帧可以保存与页面相同数量的数据(因此页面完全适合于帧)。为了有效地跟踪帧,缓冲区管理器为元数据表分配额外的内存空间。
该表跟踪4条信息:
1.与存储器地址唯一关联的帧ID
2.用于确定帧当前包含的页面的页面ID
3.用于验证页面是否已修改的脏位
4.用于跟踪当前使用页面的请求者数量的Pin计数
3 处理页面请求
当从缓冲区管理器请求页面并且页面已经存在于内存中时,页面的pin计数将递增,并返回页面的内存地址。
如果缓冲池中不存在页,并且仍有空间,则会找到下一个空帧,并将页读入该帧。页面的pin计数设置为1,并返回页面的内存地址。如果页面不存在并且没有剩余的空帧,则必须使用替换策略来确定要退出的页面。
替换策略的选择在很大程度上取决于页面访问模式,通过计算页面访问次数来选择最佳策略。页面命中是指可以在内存中找到请求的页面,而无需转到磁盘。每个页面丢失都会导致额外的IO成本,因此良好的逐出策略对性能至关重要。访问模式的命中率被定义为页面点击数#/(#of页面点击数+#页面未命中数),或者更简单地,页面点击数/页面访问数。
此外,如果被逐出的页面设置了脏位,则将页面写入磁盘,以确保保持更新。当在内存中更新页面时,脏位设置为1。页面写回磁盘后,脏位设置为0。
一旦请求者完成其工作负载,它负责通知缓冲区管理器减少与先前使用的页面相关联的pin数。
4 LRU 置换
常用的替换策略是LRU(最近最少使用)。当需要将新页读入满缓冲池时,将逐出最近使用最少的未固定页(pin计数=0)。为了跟踪页面使用情况,将向元数据表中添加“上次使用”列,并测量页面的pin计数减少的最新时间。
通常情况下,实现LRU可能成本高昂。时钟策略提供了一种替代实现,其使用元数据表中的ref位(最近引用的)列和时钟指针变量来有效地近似LRU,以跟踪所考虑的当前帧。
时钟策略算法将元数据表视为帧的循环列表。它在开始时将时钟指针设置为第一个未固定帧,并在初始读取到帧中时将每个页面对应行上的ref位设置为1。在尝试驱逐时,策略的工作方式如下:
- 遍历表中的帧,跳过固定页并在到达末尾时环绕到帧0,直到找到ref位为0的第一个未固定帧
- 在每次迭代期间,如果当前帧的ref位=1,则将ref位设置为0,并将时钟指针移动到下一帧。
- 到达ref位为0的帧时,退出现有页(如果设置了脏位,则将其写入磁盘;然后将脏位设置为0),读取新页,将帧的ref位设置为1,并将时钟指针移动到下一帧。
如果访问缓冲池中当前的页面,时钟策略将页面的ref位设置为1,而不移动时钟指针。
4.1 顺序扫描性能-LRU
LRU总体性能良好,但当一组页S(其中|S|>缓冲池大小)被多次重复访问时,性能会受到影响。
为了强调这一点,考虑使用LRU的3帧缓冲池,并具有以下访问模式:
5 MRU更换
另一个常用的替换策略是MRU(最近使用)。不是逐出最近使用的未固定页面,而是逐出最近一次使用的未锁定页面,该页面的pin计数是在最后一次减少时测量的。
5.1 顺序扫描性能-MRU
起初,使用此策略似乎有违直觉,但考虑使用MRU的3帧缓冲池具有以下访问模式的场景:
显然,无论何时出现顺序洪泛访问模式,MRU在页面命中率方面都远远优于LRU。