在线测试
本地测试
Project #1 - Buffer Pool
以下是Project #1的网址,2022FALL的Project #1是实现一个缓冲池。其中,为了实现缓冲池的管理,我们实现了缓冲池中的两个组件:可扩展哈希表和LRU-K 更换策略。最终利用可扩展哈希表来存储page与frame的对应关系,利用LRU-K 更换策略来实现frame的更新替换。而Buffer Pool Manager向系统提供了获得page的接口,只需要系统提供page_id就能够获得对应的page,而不需要关心如何获得。
1、可扩展哈希表
考虑到题目要求不能使用 built-in 的哈希表,我们需要自己实现可扩展哈希表用于维护Buffer Pool Manager中page与frame的对应关系。其中,Extendible Hash Table 由一个 directory 数组和多个 bucket 组成,其中 directory 数组的每一项都指向一个bucket :
directory:存放指向 bucket 的指针,是一个数组。用于寻找 key 对应 value 所在的 bucket。
bucket:存放 key 和 value,是一个链表。一个 bucket 可以至多存放指定数量的 key / value 对。
值得注意的是,在可扩展哈希表中,directory 数组的每一项都指向一个bucket,但一个bucket可以被多个directory 数组的项所指。 这主要与可扩展哈希表的插入机制有关:
- 当我们向哈希表中插入键值对 (K,V) 时,我们首先利用哈希函数计算出键值的哈希值
std::hash<K>()(key)
。而后我们利用哈希值计算出当前键值对应当储存的对应bucket,并将其放入相应位置。 - 在计