Skip to content

模型Model

数据库缓冲池:pin、latch与脏页

Database buffer pool · Pin count · Page latch · Dirty page

把页的驻留资格、短期结构保护和持久化状态分开,给出不会提前复用帧或越过WAL的完整刷新轨迹。

形式陈述 ​

缓冲池把按块传输的数据库页缓存在固定大小的帧中。页表映射pageID到frameID,帧至少记录页号、装载状态、pin计数、dirty标记和短期保护状态。槽页的RID先定位页,再在驻留帧内查槽;这张缓冲页表不是操作系统的虚拟地址页表。

三个状态回答不同问题:pin>0表示仍有使用者依赖该帧,禁止替换;latch保护并发访问页字节或管理结构的短临界区,可用互斥锁或读写保护实现;dirty表示内存版本可能比稳定副本新,不能直接丢掉。pin不互斥,latch释放不等于事务提交,dirty清零也不等于事务已提交。

教学接口fetch(p)在受保护的页表中查找。命中时先增加pin再交出引用;缺失时保留一个无pin、无I/O在途的合格帧,必要时安全刷新旧页,移除旧映射,标记新页正在装载。只有读成功、校验通过并发布新映射后才返回引用;同页并发缺失必须等待同一次装载或以等价协议消除重复副本。unpin只归还驻留引用,不执行commit。所有帧被pin时,应等待或返回资源不足,不能覆盖其中一个。

对于采用原位WAL的页,本文用一个简单而低并发的刷新协议证明顺序:为刷新取得内部pin,持有页X-latch冻结字节与pageLSN=l;把日志可靠刷到至少l,成功后将同一页版本写到稳定存储;页写成功才清dirty,最后释放latch和内部pin。任一写失败保留dirty并上报。WAL在此提供flushedLSN≥pageLSN的安全条件。持latch等待I/O效率较低;生产实现可使用受保护副本与版本校验,但不能删掉同版本条件。

直觉

pin像“这把椅子还有人占着”,latch像“现在谁能动椅子上的文件”,dirty像“纸上的修改还没归档”。三者并行存在:读者可以pin干净页;无人pin的页可以是脏页;页没有latch持有者也可能尚未提交。

替换策略只挑候选。LRU或Clock觉得某页不热门,并不能证明它没人在用、它的修改已保存,或它可以在日志之前写盘。

例子与边界

从一次修改到两种崩溃 ​

磁盘P=7,pageLSN=10,稳定日志到10。T执行fetch(P),pin=1;在X-latch内生成更新日志40=(before7,after9),改内存P=9、pageLSN=40、dirty=true,随后释放latch。此时pin仍1,替换不合法。T归还引用后pin=0,P成为候选,却不能越过日志40直接落盘。

刷新者取得内部pin与X-latch,先确认日志40稳定,再写P=9并在成功后清dirty。若commit50尚未稳定就崩溃,原位undo模型把T当loser,将稳定页还原7。另一次独立运行若先稳定commit50并回复成功,却尚未写P,崩溃后redo把磁盘7推进9。两条运行不能合并为同一个磁盘初始状态。

一个错误刷新顺序 ​

假定后台先在无保护状态读到pageLSN=40并刷日志40,然后另一个线程把页改成pageLSN=60。后台这时才取得X-latch,若写出当前页60,就违反WAL。正确协议必须冻结要写的字节及其LSN,再刷到该LSN,或取得保护后重新检查并循环。仅“某时刷过一次日志”不够。

后台复制旧版本写出时,原帧可能又变脏。写旧副本成功只能证明旧版本稳定;不能无条件清掉新版本dirty。本文持X-latch的协议排除了该交错,以较弱并发换来容易检查的状态机。

推论与应用

扫描算子通常只pin当前输入页,把需要长期保留的记录复制到自己的工作区后及时unpin。若返回指向页内字节的借用引用,就必须把pin生命周期延长到消费者用完;提前unpin后的悬垂引用可能读到已替换页的另一条记录。

Steal/no-force规定哪些事务状态的脏页允许写回,以及提交是否要求数据页强制落盘。它与pin/latch是不同维度。前者决定恢复责任,后者维持一次物理访问的正确性。

缓存命中数、脏页写出数、等待pin的时间和等待latch的时间应分别报告。OS页缓存还可能保存数据库文件的另一份字节;数据库刷写是否稳定要继续核对文件同步合同,不因内存页变成clean就自动成立。

参考资料
  • CMU 15-445/645 Fall 2025,Memory & Disk Management,§§2–4:pin、dirty、驻留映射与latch/事务锁边界。
  • C. Mohan et al., “ARIES”,ACM TODS 1992,§1.1,印刷pp.97–98:WAL及pageLSN;本文冻结页版本的刷新协议为自定的保守实现。
关系图谱8 个相邻概念 · 2 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组
类型化关系