😉Buffer Pool
PROJECT #1 - BUFFER POOL
实现存储管理的
buffer pool
查看
lru_replace.h
和buffer_pool_manager.h
中需要实现的函数查看
Page
,DiskManager
类的一些成员变量和函数
TASK #1 - LRU REPLACEMENT POLICY
实现页面替换的 LRU 策略,即优先替换最近最少使用的页面
思路
使用
std::list<frame_id_t> lru
双链表的数据结构来添加可以被淘汰的页面使用
std::unordered_map<frame_id_t, std::list<frame_id_t>::iterator> mp
来加速frame
的查找和删除使用
std::mutex latch_;
来支持多线程
使用 std::lock_guard<std::mutex> guard(latch_);
语句,在构造 guard
时会自动调用 latch_.lock()
加锁,并且在 guard
析构的时候自动调用 latch_.unlock()
释放锁。
Victim
当
Size()
为 0 时返回false
取
lru
的头部元素给frame_id
,删除头部元素,并且在mp
中删除frame_id
Pin
当
frame_id
在mp
中时,我们需要在lru
链表和mp
字典中删除frame_id
这个元素因为
mp
中已经保存了frame_id
的迭代器,因此从lru
中删除它的时间复杂度为 O(1)O(1)
Unpin
如果
frame_id
已经在mp
中了,那么直接返回否则的话将
frame_id
添加到lru
的末尾,然后在mp
中保存这个frame_id
和它的迭代器(--lru.end()
)
TASK #2 - BUFFER POOL MANAGER
在实现
buffer_pool_manager
时,应该看一下Page
对象的一些成员变量;各个函数如何实现已经详细给出了。
注意
page_id
表示的是磁盘上的页page_table_
可以根据page_id
找到对应的frame_id
pages_
指向了一个Page
数组,我们会用frame_id
来找到某一个Page
对象在
UnpinPageImpl
函数中,如果page_id
不在page_table_
中,我们应该返回true
,而不是false
;还有就是只有当is_dirty
为true
时,我们才设置Page
的is_dirty_
在
DeletePageImpl(page_id_t page_id)
中,除了把page_id
对应的页从page_table_
移除,还需要调用Pin
将该页从replacer_
中移除
测试
代码格式验证
打包
打包
然后前往 https://www.gradescope.com 提交代码
Last updated