Lab1 Buffer Pool
时钟更换策略
时钟的组成
对于单个frame应当有以下三部分组成:frame_id、Ref、PIN。
frame_id:唯一确定id,与buffer pool相对应。
Ref:该frame最近是否使用过。使挑选的frame尽量是很久之前使用的(类似与LRU)
PIN:该frame是否正在使用。
?> 注:该时钟不包含任何page信息,真正的page是存储在buffer pool。该时钟只是在buffer pool满了后,buffer pool manager希望加载新的page时,为其提供可以替换的frame_id。
时钟的初始化
frame_id:初始化0-X-1,X代表buffer pool中能存储Page的数量。
接下来两个元素的初始化,我们就要先要知道时钟使用的时机:所有的buffer pool都加载了Page,加载一个Page那对应的PIN必然是true,若Page的使用还未结束那么Ref的初始化应当为false。
Ref:上述分析,false
PIN:上述分析,true
Victim
Victim(受害者),方法名很有意思。就在buffer pool满了时,buffer pool manager希望加载新的page时,为其提供可以替换的frame_id。
首先我们要知道我们要找什么样的受害者:PIN为false、Ref也为false。代表现在不在使用,且最近未被使用。
hand是时钟的指针,它顺时针旋转,便可以发现可以被移除的frame。
如果hand扫描一圈发现所有的PIN都是true的话,就代表所有的page都在被使用,就无法加载新的page进buffer pool,便返回false。如Clock刚初始化的时候:
还有一个问题,就是我说的在PIN都是true时才找不到,但是我们要找的确是PIN和Ref都为false的情况。那是因为Ref是可以改变的,当时针扫描过一个frame时,若它的PIN是false,且Ref为true,那此时便将Ref变为false。
PIN
PIN(固定方法)则是代表,该frame中存储的page正在使用,不能将其移除(PIN = true)。
UNPIN
UNPIN(取消固定方法)则是代表,该frame中存储的page正在使用,可以将其移除(PIN = false),同时该frame刚被使用过(Ref = false)。
缓冲池管理器
管理器的组成
由三部分组成Buffer Pool 、Clock、 Free List。他们分别的作用:
Buffer Pool:用来存储Page
Free List:目前Buffer Pool中有那几个地方没有加载Page
Clock:在Free List为空时(Buffer Pool加载满时),提供可以移除的受害者。
FetchPage
FetchPage(获取page),若在Buffer Pool中,直接返回对象。若不在,则从磁盘中加载后返回对象。
NewPage
Page的结构
pageId:Page唯一的唯一标识,决定其存储位置。
pinCount:正在被多少线程使用。
dirty:内容是否修改
Data:存储在磁盘上的数据