Database System(三)
2025-4-6
| 2025-4-11
Words 2410Read Time 7 min
type
status
date
slug
summary
tags
category
icon
password

我们现在在数据库系统的哪一层?

这张图展示了数据库管理系统(DBMS)的各个层级:
  • ✅ 已完成:SQL 客户端、查询解析与优化、关系运算符、文件与索引管理
  • 🟣 你现在在这里:缓冲区管理(Buffer Management)
  • ✅ 已完成:磁盘空间管理(Disk Space Management)
notion image

什么是缓冲区管理?

缓冲区管理器的作用是:
内存(RAM)中管理页面(pages),并处理来自文件与索引管理器的页面请求。
关键点如下:
  • 内存有限:不能把所有数据库页面都放进内存(称为缓冲池 buffer pool)。
  • 页面置换策略:缓冲区管理器会使用策略(如 LRU 最近最少使用)来决定哪些页面需要被移除,以便为新页面腾出空间。
  • 与磁盘的交互
    • 如果请求的页面不在内存中,缓冲区管理器会从磁盘读取(通过磁盘空间管理器);
    • 如果一个页面在内存中被修改过(称为“脏页”),当它被移除时,需要写回磁盘

图示解释:页面如何在磁盘与内存之间流动

notion image
  • 底部的 Disk Space Manager 管理所有磁盘上的页面(Page 1 到 Page 6)。
  • 中间的 Buffer Manager 管理内存中的缓冲池(此图中有 3 个 frame)。
  • 内存中当前装入了 Page 1、Page 4 和 Page 3。
  • 如果现在需要访问 Page 2:
    • 因为内存中没有 Page 2,缓冲区管理器会从磁盘中读取它,装入一个空的或被置换的 frame。
  • 如果 Page 3 在内存中被修改了,然后需要被替换出去:
    • 缓冲区管理器会把它写回磁盘,以保存修改。

什么是缓冲池?

内存空间被划分成多个缓冲帧(Frame),每个帧可以容纳一个页面(Page)。
缓冲管理器(Buffer Manager)会使用一张元数据表来追踪每个帧的状态。

表格含义(Buffer Pool Metadata)

Frame ID
Page ID
Dirty Bit
Pin Count
0
5
1
3
1
3
0
1
2
10
1
0
3
(空)
(空)
(空)

每一列含义:

  1. Frame ID:缓冲帧的编号,对应某个内存位置;
  1. Page ID:当前帧中装载的页编号;
  1. Dirty Bit(脏位)
      • 1 表示该页面已被修改;
      • 0 表示页面未被修改,不需要写回磁盘;
  1. Pin Count(固定计数)
      • 表示当前有多少请求者正在使用这个页面;
      • 只有当 Pin Count 为 0 时,该页面才可以被替换出去。

示例解读:

  • Frame 0
    • 存放 Page 5,已被修改(Dirty Bit = 1),
    • 正在被 3 个用户/进程使用(Pin Count = 3)。
  • Frame 2
    • 存放 Page 10,已被修改,
    • 但没人正在用(Pin Count = 0),因此是一个可以被置换的候选帧。
  • Frame 3
    • 当前是空的(没有装入任何页面),可以直接使用。

页面请求的处理逻辑(Handling Page Requests)

情况 1:页面已经在内存中(命中 Hit)

  • 如果请求的页面已经存在于缓冲池(内存中的帧)中:
    • 📌 Pin Count(引用计数)+1:表示又有一个请求者正在使用这个页面;
    • ✅ 返回该页面所在的内存地址;
    • ✔️ 这是一个 Page Hit(命中),不需要从磁盘读取,效率高。

情况 2:页面不在内存中,但还有空帧

  • 找到一个 空的 Frame
  • 把请求的页面 从磁盘读入该 Frame
  • 📌 设置 Pin Count = 1(被一个请求者使用);
  • ✅ 返回页面所在的内存地址;
  • ❌ 这是一个 Page Miss(未命中),需要一次磁盘 I/O。

情况 3:页面不在内存中,且缓冲池已满

  • 此时必须使用 页面替换策略(Page Replacement Policy) 来决定淘汰哪个页面。
  • 替换策略会尽量选择“最不可能再被使用”的页面,以提升命中率(Hit Rate)

替换前的检查:

  • 如果要被替换的页面 Dirty Bit(脏位)为 1
    • 表示页面被修改过;
    • ⚠️ 必须先将页面写回磁盘,以免数据丢失;
    • 写回后,Dirty Bit 设置为 0;
  • 然后将新页面从磁盘读入该 Frame,并设置 Pin Count = 1。

命中率(Hit Rate)定义:

命中率衡量缓冲池的性能,公式为:
  • 命中(Hit):请求的页面已在内存,无需磁盘读操作;
  • 未命中(Miss):页面需从磁盘加载,代价高。

引用计数的释放(Unpin)

请求者在使用完页面后,有责任通知缓冲管理器:
  • 把页面的 Pin Count -1
  • 只有当 Pin Count 为 0 时,该帧才有资格被替换。

总结流程图:

notion image

LRU & Clock Policy

LRU(Least Recently Used)页面替换策略

思路:

  • 当需要换出页面时,选择那个**“最久没被使用”而且没有被 pin 的页面(Pin Count = 0)**;
  • 通常需要维护一个 Last Used 时间戳,记录每个页面最近一次使用的时间。
notion image

示例表(上半部分)解释:

Clock Policy(时钟算法)— LRU 的近似替代方案

思路:

  • 不再用时间戳,而是维护一个 Ref Bit(引用位)
  • 把元数据表当作一个环形列表(Clock),顺时针移动“指针”(Clock Hand)寻找可换出的页面。

步骤:

  1. 从当前指针位置开始,跳过所有被 pin 的页面;
  1. 如果 Ref Bit = 1,先改为 0,继续前进;
  1. 如果 Ref Bit = 0,且 Pin Count = 0,就把该页面换出;
  1. 如果页面是脏页(Dirty Bit = 1),先写回磁盘;
  1. 然后加载新页面,并将 Ref Bit 设为 1;
  1. 最后移动指针到下一帧。

优点:

  • 空间更省:只需 1 bit;
  • 时间更快:无需搜索最小 Last Used。
notion image

LRU 的问题:顺序访问(Sequential Scanning)

问题描述:

  • LRU 会在面对重复访问一组页面(大于缓冲区大小)时频繁替换
  • 每次都换出旧页面,导致没有命中(Hit Rate 很低);
  • 如图所示,访问模式是 A B C D A B C D ...,缓冲池大小为 3:
    • 每次访问都要替换页面;
    • 命中次数为 0,总共 7 次访问。
这种现象称为 缓存污染(cache flooding),常见于全表扫描的数据库操作。
notion image

总结对比:

策略
是否追踪时间
开销
命中率
适用场景
LRU
✅ 精确
一般随机访问模式
Clock
❌ 近似 LRU
中高
大多数情况适用
LRU 差
❌ 顺序访问差
顺序或批量扫描时差

MRU 替换策略的核心思想:

替换 最近刚被使用过的未固定页面(pin count = 0)。

与 LRU 的区别:

  • LRU:淘汰最久没用的页面;
  • MRU:淘汰最近刚用过的页面。
这种方法看起来有点反直觉,但在某些特定访问模式下表现得更好。

顺序访问模拟实验

我们使用一个 3 帧的缓冲池,访问序列如下:
这个访问模式被称为“顺序扫描(sequential scan)”或“cache flooding(缓存泛滥)”。

模拟过程(图解):

notion image
  1. 开始:空缓存
      • 访问 A、B、C → 全 miss(总数 = 3)
  1. 访问 D:
      • 缓存满了,根据 MRU 策略,淘汰最近刚使用的 C;
      • 缓存变成:A、B、D(Hit: 0, Total: 4)
  1. 访问 A(在缓存中)✅ → 命中 ✔️
  1. 访问 B ✅ → 命中 ✔️
  1. 访问 C:
      • 缓存中无 C,要替换 MRU(最近刚用的是 B)→ 淘汰 B;
      • 缓存变成:A、C、D
  1. 访问 D ✅ → 命中 ✔️
  1. 访问 A ✅ → 命中 ✔️
  1. 访问 B:
      • 淘汰 MRU(A 被刚使用)→ 淘汰 A;
      • 缓存变成:B、C、D

命中情况:

步骤
访问
命中数(Hit)
总访问数(Total)
初始
A B C D
0
4
之后
A B C D A B
Hit: 4
Total: 9

结论:MRU 在顺序扫描中更有效

相比于 LRU 的“每次都 miss”,MRU 能保留老页面(例如 A、B)以应对下一次循环,大幅提升命中率

总结

策略
替换对象
优势
适用场景
LRU
最久未用的页面
通用表现好,保留热数据
随机访问或有局部性
MRU
最近刚使用页面
顺序扫描型访问模式极为有效
批量扫描、全表扫描等场景
  • database
  • DS3.1 Clock Policy(时钟算法)Database System (二)
    Loading...