BUFFER POOL
文章目录
本文记录了 PROJECT #1 - 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)$
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_
中移除
测试
1 | make lru_replacer_test |
1 | make buffer_pool_manager_test |
代码格式验证
1 | make format |
打包
- 打包
1 | zip project1-submission.zip src/include/buffer/lru_replacer.h src/buffer/lru_replacer.cpp src/include/buffer/buffer_pool_manager.h src/buffer/buffer_pool_manager.cpp |
- 然后前往 https://www.gradescope.com 提交代码