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
:存储在磁盘上的数据