Bustub重点解析
buffer pool manger
Lru-k-replacer
RecordAccess
一、核心设计思想
- 两阶段存储
1 | lru_premature_ // 存储访问次数 < k 的帧 |
- 状态转换
1 | 访问次数 < k-1 → premature(未成熟) |
- 先删后改再插
1 | 旧状态 → 从集合移除 → 修改访问记录 → 插入到新集合 |
二、代码执行流程图
1 | 开始 RecordAccess(frame_id) |
SetEvictable
场景A:不可驱逐 → 可驱逐(开始保护 → 允许驱逐)
1 | if (set_evictable && !frames_[frame_id]->IsEvictable()) { |
条件分解:
set_evictable == true:目标状态是可驱逐!frames_[frame_id]->IsEvictable():当前状态是不可驱逐
执行流程:
1 | 当前状态:不可驱逐(不在任何集合中) |
示例:
1 | // 初始:帧被钉住(正在使用) |
场景B:可驱逐 → 不可驱逐(允许驱逐 → 开始保护)
1 | if (!set_evictable && frames_[frame_id]->IsEvictable()) { |
条件分解:
!set_evictable == true:目标状态是不可驱逐frames_[frame_id]->IsEvictable():当前状态是可驱逐
执行流程:
1 | 当前状态:可驱逐(在某个集合中) |
示例:
1 | // 初始:帧可以被驱逐 |
完整状态转换图
1 | ┌─────────────────────────────────────────────────────────────┐ |
Evict
1 | 开始 Evict(frame_id*) |