缓冲区管理
缓冲区结构
frame的参数
- Dirty:frame中的块是否被修改
- Pin-count:frame的块已经被请求并且还未释放的计数,也就是当前的用户数
- Others:Latch:是否加锁
请求块操作
- 如果请求块不在缓冲池中:
1)选择一个frame替换
2)若frame是dirty,则写回磁盘
3)将请求快写入frame中 - 否则增加对应frame的pin-count,并返回地址
释放块操作
- unpin对应frame
- 表明哪块block是dirty
缓冲区替换策略
只有pin-count为0的frame才会被选择为候选frame
OPT算法
- 定义:也称为Belady’s算法,最佳的页面置换算法
- 规则:每次置换以后永远用不到的页面,如果没有则淘汰最久以后再用到的页面
- 只存在理论意义,可以作为算法性能上界作为对比
LRU
- 规则:所有frame按照最近一次访问时间排列成一个链表,基于时间局部性,越是最近访问的在未来被访问的概率越高,总是替换LRU端的frame
- 优点:在重复访问同一个页面上效果较好,选择frame的复杂度只有O(1)
- 缺点:缓存污染、维护LRU链表代价高、不满足时间局部性则性能差、没有考虑访问频率
LRU-K
- 规则:若某个frame的访问次数达到了K次以上,则尽量不置换
- 方法:维护两个LRU链表(1个是访问K次以上的,1个访问次数小于K),优先置换小于K次的链表
- LRU-2性能较好
2Q
- 规则:与LRU-2类似,区别在于访问1次的队列采用FIFO
Second-Chance LRU
- 规则:给每个frame两次置换机会
- 方法:LRU链表基础上增加一个bit,初始为1,第一次被选中置换时置0并放到MRU端;只有bit位为0的LRU页才会被置换;若重新被访问,则移到MRU端并置为1
CLOCK
- 规则:避免每次访问都需要调整链表
- 方法:引入环形Second Chance FIFO,引入一个current指针指向当前指向的frame,给每个frame添加一个referenced位,初始为1
1)current指向frame的pin-count>0,则current++
2)current指向frame的referenced位若为1,则置0;current++
3)current指向frame的referenced位若为0,且pin-count为0,则替换该frame;current++
(注意若访问命中时,不会改变current指针)
缓冲区管理器的实现
Buffer vs. Disk file
一般而言,frame大小=page大小;buffer由若干frame组成,file由若干page组成
Page/block的一般存储格式
也就是对一个块来说,有若干槽,对于不连续存储,每个槽对应是否有内容由最后一行的位图表示;对于连续存储,只有最后一个地方记录记录数量
Buffer中Frame的查找
- 读磁盘块时:根据page_id确定在Buffer中是否已经存在frame
- 写磁盘块时:根据frame_id快速找到文件中对应的page_id
- 建立frame-page之间的索引