Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 17 additions & 17 deletions src/buffer/buffer_pool_manager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ auto BufferPoolManager::NewPage(page_id_t *page_id) -> Page * {
*page_id = INVALID_PAGE_ID;
std::lock_guard<std::mutex> lock(latch_);

if(NewFrameUnlocked(frame_id) == nullptr) return nullptr;
if (NewFrameUnlocked(frame_id) == nullptr) return nullptr;

replacer_->RecordAccess(frame_id); // 确保frame存在于replacer中,并添加一条history
replacer_->SetEvictable(frame_id, false);
Expand All @@ -62,19 +62,19 @@ auto BufferPoolManager::NewPage(page_id_t *page_id) -> Page * {

auto BufferPoolManager::NewFrameUnlocked(frame_id_t &frame_id) -> Page *{
frame_id = -1; // 初始化为无效
if(!free_list_.empty()){
if (!free_list_.empty()) {
// 优先找free_list
frame_id = free_list_.front();
free_list_.pop_front();
// BUSTUB_ASSERT(frame_id != -1, "");
}else{
} else {
// 最坏情况,去驱除内存页
bool ret = replacer_->Evict(&frame_id);
if(ret == true){ // 驱除成功
if (ret == true) { // 驱除成功
// BUSTUB_ASSERT(frame_id != -1, "");
BUSTUB_ASSERT(pages_[frame_id].GetPinCount() == 0, "");

if(pages_[frame_id].IsDirty()){
if (pages_[frame_id].IsDirty()) {
// 脏页写回磁盘
disk_manager_->WritePage(pages_[frame_id].GetPageId(), pages_[frame_id].GetData());
}
Expand All @@ -85,7 +85,7 @@ auto BufferPoolManager::NewFrameUnlocked(frame_id_t &frame_id) -> Page *{
pages_[frame_id].pin_count_ = 0;
pages_[frame_id].is_dirty_ = false;

}else{
} else {
// 没有多余或者可驱除的frame。
return nullptr;
}
Expand All @@ -101,7 +101,7 @@ auto BufferPoolManager::FetchPage(page_id_t page_id, [[maybe_unused]] AccessType
std::lock_guard<std::mutex> lock(latch_);
auto target = page_table_.find(page_id);
frame_id_t frame_id = -1;
if(target != page_table_.end()){
if (target != page_table_.end()) {
// page在内存中
frame_id = target->second;

Expand All @@ -111,9 +111,9 @@ auto BufferPoolManager::FetchPage(page_id_t page_id, [[maybe_unused]] AccessType
pages_[frame_id].pin_count_++; // 引用计数加一

//return pages_ + frame_id;
}else{
} else {
// page不在内存中
if(NewFrameUnlocked(frame_id) == nullptr) return nullptr; // 缓存满
if (NewFrameUnlocked(frame_id) == nullptr) return nullptr; // 缓存满

replacer_->RecordAccess(frame_id); // 确保frame存在于replacer中,并添加一条history
replacer_->SetEvictable(frame_id, false);
Expand Down Expand Up @@ -141,7 +141,7 @@ auto BufferPoolManager::UnpinPage(page_id_t page_id, bool is_dirty, [[maybe_unus
auto target = page_table_.find(page_id);

//合法性判断
if(target == page_table_.end() || pages_[target->second].GetPinCount() == 0){
if (target == page_table_.end() || pages_[target->second].GetPinCount() == 0) {
return false;
}
frame_id_t frame_id = target->second;
Expand All @@ -150,11 +150,11 @@ auto BufferPoolManager::UnpinPage(page_id_t page_id, bool is_dirty, [[maybe_unus
pages_[frame_id].pin_count_--;
BUSTUB_ASSERT(pages_[frame_id].GetPinCount() >= 0, "");

if(pages_[frame_id].GetPinCount() == 0){
if (pages_[frame_id].GetPinCount() == 0) {
replacer_->SetEvictable(frame_id, true);
}

if(is_dirty == true){
if (is_dirty == true) {
pages_[frame_id].is_dirty_ = true;
}
return true;;
Expand All @@ -164,7 +164,7 @@ auto BufferPoolManager::FlushPage(page_id_t page_id) -> bool {
std::lock_guard<std::mutex> lock(latch_);
auto target = page_table_.find(page_id);

if(target == page_table_.end()){
if (target == page_table_.end()) {
// page 不在内存中
return false;
}
Expand All @@ -183,7 +183,7 @@ auto BufferPoolManager::FlushPage(page_id_t page_id) -> bool {
void BufferPoolManager::FlushAllPages() {
std::lock_guard<std::mutex> lock(latch_);

for(const auto & it : page_table_){
for (const auto & it : page_table_) {
page_id_t page_id = it.first;
frame_id_t frame_id = it.second;

Expand All @@ -201,21 +201,21 @@ auto BufferPoolManager::DeletePage(page_id_t page_id) -> bool {

auto target = page_table_.find(page_id);

if(target == page_table_.end()){
if (target == page_table_.end()) {
// page 不在内存中
return true;
}


if(pages_[target->second].GetPinCount() > 0){
if (pages_[target->second].GetPinCount() > 0) {
return false;
}
frame_id_t frame_id = target->second;
// 确定该page可以删除
BUSTUB_ASSERT(page_id == pages_[frame_id].GetPageId(), "");
BUSTUB_ASSERT(pages_[frame_id].GetPinCount() == 0, "");

if(pages_[frame_id].is_dirty_ == true){
if (pages_[frame_id].is_dirty_ == true) {
// 脏页写回磁盘
disk_manager_->WritePage(page_id, pages_[frame_id].GetData());
}
Expand Down
51 changes: 28 additions & 23 deletions src/buffer/lru_k_replacer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,35 +20,40 @@ LRUKReplacer::LRUKReplacer(size_t num_frames, size_t k) : replacer_size_(num_fra
auto LRUKReplacer::Evict(frame_id_t *frame_id) -> bool {
std::lock_guard<std::mutex> lock(latch_);
auto target = node_store_.end();
size_t targetBKDist = 0;
if(node_store_.empty()){ // 没有可Evict的帧
size_t target_dist_diff = 0;
if (node_store_.empty()) { // 没有可Evict的帧
return false;
}

for(auto it = node_store_.begin(); it != node_store_.end(); it++){
for(auto it = node_store_.begin(); it != node_store_.end(); it++) {
const LRUKNode& node = it->second;
size_t bKDist = 0;
if(node.is_evictable_ == false)
size_t diff_dist = 0;
if (node.is_evictable_ == false)
continue;

if(node.history_.size() == node.k_){ // 记录了k次历史
bKDist = current_timestamp_ - node.history_.back(); // 和前k次时间戳做差
}else{ // 访问不足k次。
bKDist = UINT64_MAX;
if (node.history_.size() == node.k_) { // 记录了k次历史
diff_dist = current_timestamp_ - node.history_.back(); // 和前k次时间戳做差
} else { // 访问不足k次。
diff_dist = UINT64_MAX;
}

if(targetBKDist < bKDist){ // 找到间隔更久的node
if (target_dist_diff < diff_dist) { // 找到间隔更久的node
target = it;
targetBKDist = bKDist;
}else if(targetBKDist == bKDist){ // 相等就比较第kth个时间戳。
if(target->second.history_.back() > node.history_.back()){
target_dist_diff = diff_dist;
} else if (target_dist_diff == diff_dist) { // 相等就比较第kth个时间戳。
if (target->second.history_.empty()) {
// 为空代表存在一个无限小的时间戳
// 既然都无限小了,所以就没有更小的时间戳了
// continue即可。
continue;
} else if (node.history_.empty() || (target->second.history_.back() > node.history_.back())) {
target = it;
targetBKDist = bKDist;
target_dist_diff = diff_dist;
}
}
}

if(target == node_store_.end()){ // 找不到要剔除的frame
if (target == node_store_.end()) { // 找不到要剔除的frame
return false;
}
BUSTUB_ASSERT(target->second.is_evictable_ == true, "is_evictable_ == false!");
Expand All @@ -65,7 +70,7 @@ void LRUKReplacer::RecordAccess(frame_id_t frame_id, [[maybe_unused]] AccessType
BUSTUB_ASSERT((frame_id != -1) && (frame_id < (frame_id_t)replacer_size_), "");

auto target = node_store_.find(frame_id);
if(target == node_store_.end()){ // 没有
if (target == node_store_.end()) { // 没有
target = node_store_.insert(std::make_pair(frame_id, LRUKNode())).first;
target->second.fid_ = frame_id;
target->second.is_evictable_ = false;
Expand All @@ -75,9 +80,9 @@ void LRUKReplacer::RecordAccess(frame_id_t frame_id, [[maybe_unused]] AccessType
BUSTUB_ASSERT(curr_size_ <= replacer_size_, "");
}
// need mark to is_evictable_ == false?
if(target->second.history_.size() < target->second.k_){
if (target->second.history_.size() < target->second.k_) {
target->second.history_.push_front(++current_timestamp_);
}else{ // ==
} else { // ==
BUSTUB_ASSERT(target->second.history_.size() == target->second.k_, "");
target->second.history_.push_front(++current_timestamp_);
target->second.history_.pop_back();
Expand All @@ -90,17 +95,17 @@ void LRUKReplacer::SetEvictable(frame_id_t frame_id, bool set_evictable) {

auto target = node_store_.find(frame_id);

if(target != node_store_.end()){
if(target->second.is_evictable_ == true && set_evictable == false){
if (target != node_store_.end()) {
if (target->second.is_evictable_ == true && set_evictable == false) {
target->second.is_evictable_ = false;
BUSTUB_ASSERT(curr_size_ - 1 < curr_size_, "");
curr_size_--;
}else if(target->second.is_evictable_ == false && set_evictable == true){
} else if (target->second.is_evictable_ == false && set_evictable == true) {
target->second.is_evictable_ = true;
curr_size_++;
BUSTUB_ASSERT(curr_size_ <= replacer_size_, "");
}
}else{// 什么也不做
} else {// 什么也不做
BUSTUB_ASSERT(false, "");
}
// 考虑可以自学习?
Expand All @@ -111,7 +116,7 @@ void LRUKReplacer::Remove(frame_id_t frame_id) {
BUSTUB_ASSERT(frame_id < (frame_id_t)replacer_size_, "");

auto target = node_store_.find(frame_id);
if(target != node_store_.end()){
if (target != node_store_.end()) {
BUSTUB_ASSERT(target->second.is_evictable_ == true, "");
node_store_.erase(target);
BUSTUB_ASSERT(curr_size_ - 1 < curr_size_, "");
Expand Down
Loading