前言

Project1最后一个部分是利用我们前面的extendible hash table和lru来完成我们的buffer pool。

正文

我们利用extendible hash table来做根据page id来找对应的page,通过diskmanager我们可以找到page对应在disk上的物理页,然后我们用一个std::list结构free_list来维护空闲的page,当free_page没有剩余的空闲快时,我们需要调用前面写的lrureplacer中挑选出将要被替换的page(实验里声明的victim page,这里用添加了一个GetVictimPage函数专门来获取),然后每个page如果被一个线程使用的话pin+1,然后还有个dirty位来判断page是否需要被更新回disk。

正式开始,先看看.h文件中定义的

disk_manager_是与磁盘交互读写用的,log_manager_在这里还没有用到,page_table_就是我们前面写的extendible hash table,free_list_用来存储空闲page,GetVictimPage()是唯一新添加的方便使用的。

然后来看下cpp文件

FetchPage函数在缓存池中根据page_id找page,找到的话pin+1,从replacer中删除掉,没有的话就找victim page,然后判断这个victim page是否是脏的,是否需要刷新回disk中,然后就是在page_table中删除这个victim page并插入新的然后从disk中根据page_id读入数据到p->data中,最后更新下p的一些数据。

看下GetVictimPage()函数

先从free_list中找是否有空闲页,没有就从replacer中找,

然后UnpinPage,FlushPage,DeletePage比较简单不细说了

最后看下NewPage

根据注释当我们需要新建个page时调用,首先需要个victim page从free list或者replacer中,然后从disk中allocate中获取到新的page_id然后判断victim page是否是脏的,最后就是清理page_table后插入然后初始化page的meta data。

总结

Buffer Pool Manager比lru难点,比extendible hash table简单,最难的还是extendible hash table需要仔细阅读我给的那个文章的内容,好的继续学习数据库,刚把爹。