ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

tmp

2022-06-13 22:02:51  阅读:139  来源: 互联网

标签:tmp frame lruMap id _. include LRUReplacer


//===----------------------------------------------------------------------===//
//
//                         BusTub
//
// lru_replacer.h
//
// Identification: src/include/buffer/lru_replacer.h
//
// Copyright (c) 2015-2021, Carnegie Mellon University Database Group
//
//===----------------------------------------------------------------------===//

#pragma once

#include <list>
#include <mutex>  // NOLINT
#include <vector>
#include <unordered_map>

#include "buffer/replacer.h"
#include "common/config.h"

namespace bustub {

/**
 * LRUReplacer implements the Least Recently Used replacement policy.
 */
class LRUReplacer : public Replacer {
 public:
  /**
   * Create a new LRUReplacer.
   * @param num_pages the maximum number of pages the LRUReplacer will be required to store
   */
  explicit LRUReplacer(size_t num_pages);

  /**
   * Destroys the LRUReplacer.
   */
  ~LRUReplacer() override;

  bool Victim(frame_id_t *frame_id) override;

  void Pin(frame_id_t frame_id) override;

  void Unpin(frame_id_t frame_id) override;

  size_t Size() override;

 private:
  // TODO(student): implement me!
  const int capacity_;
  std::list<frame_id_t> lruList_;
  std::unordered_map<frame_id_t, std::list<frame_id_t>::iterator> lruMap_;
  std::mutex latch_;

  frame_id_t VictimFrame();
};

}  // namespace bustub

//===----------------------------------------------------------------------===//
//
//                         BusTub
//
// lru_replacer.cpp
//
// Identification: src/buffer/lru_replacer.cpp
//
// Copyright (c) 2015-2019, Carnegie Mellon University Database Group
//
//===----------------------------------------------------------------------===//

#include "buffer/lru_replacer.h"

namespace bustub {

LRUReplacer::LRUReplacer(size_t num_pages) : capacity_(num_pages) {}

LRUReplacer::~LRUReplacer() = default;

bool LRUReplacer::Victim(frame_id_t *frame_id) {
  std::lock_guard<std::mutex> guard(latch_);
  if (lruMap_.empty()) {
    *frame_id = -1;
    return false;
  }
  *frame_id = VictimFrame();
  return true;
}

void LRUReplacer::Pin(frame_id_t frame_id) {
  std::lock_guard<std::mutex> guard(latch_);
  if (lruMap_.find(frame_id) == lruMap_.end()) {
    return;
  }
  lruList_.remove(lruMap_.find(frame_id)->second);
  lruMap_.erase(frame_id);
  return;
}

void LRUReplacer::Unpin(frame_id_t frame_id) {
  std::lock_guard<std::mutex> guard(latch_);
  if (lruMap_.find(frame_id) != lruMap_.end()) {
    return;
  }
  while (lruMap_.size() >= capacity_) {
    VictimFrame();
  }
  lruList_.push_front(frame_id);
  lruMap_[frame_id] = lruList_.begin();
}

size_t LRUReplacer::Size() {
  std::lock_guard<std::mutex> guard(latch_);
  return lruMap_.size();
}

frame_id_t LRUReplacer::VictimFrame() {
  frame_id_t victimFrame = lruList_.back();
  lruList_.pop_back();
  lruMap_.erase(victimFrame);
  return victimFrame;
}

}  // namespace bustub

标签:tmp,frame,lruMap,id,_.,include,LRUReplacer
来源: https://www.cnblogs.com/pannnn/p/16372487.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有