1. Part 1是实现一个LRU,按照C++ STL list + unordered_map 的思路实现,根据描述实现对应的API,可能后面需要考虑一些线程安全的问题。
成员变量设计
private:
std::unordered_map<frame_id_t, std::list<frame_id_t>::iterator> _hashmap;
std::list<frame_id_t> _list;
int max_num_pages;
int size;
namespace bustub {
LRUReplacer::LRUReplacer(size_t num_pages):max_num_pages(num_pages),
size(0){
}
LRUReplacer::~LRUReplacer() = default;
bool LRUReplacer::Victim(frame_id_t *frame_id) {
if(size == 0){
return false;
}
*frame_id = _list.back();
auto tmp = _hashmap[*frame_id];
_hashmap.erase(*frame_id);
_list.erase(tmp);
size--;
return true;
}
void LRUReplacer::Pin(frame_id_t frame_id) {
if(_hashmap.find(frame_id) != _hashmap.end()){
auto tmp = _hashmap[frame_id];
_hashmap.erase(frame_id);
_list.erase(tmp);
size--;
}
}
void LRUReplacer::Unpin(frame_id_t frame_id) {
if(size >= max_num_pages ||
_hashmap.find(frame_id) != _hashmap.end()){
return;
}
_list.push_front(frame_id);
_hashmap[frame_id] = _list.begin();
size++;
}
size_t LRUReplacer::Size() { return size; }
} // namespace bustub
2. Part2 是实现BU