DS3.1 Clock Policy(时钟算法)
2025-4-6
| 2025-4-11
Words 859Read Time 3 min
type
status
date
slug
summary
tags
category
icon
password
notion image

图的整体结构:Clock 算法的核心思想

  • 将缓冲池(Buffer Pool)中的帧排成一个环形,就像一个钟表的圆圈。
  • 有一个指针,叫 Clock Hand(时钟指针),会顺时针地“扫描”这些帧,寻找可以被替换的目标帧。
  • 每个帧中都装有一个页面(Page),并带有一个 Reference Bit(引用位),用来标记这个页面是否最近被访问过

图中包含内容详解:

圆圈中的四个 Frame:

  • Frame 1:
    • Page 3,Ref Bit = 0(没被最近访问)
    • Page 4,Ref Bit = 1(最近访问过)
  • Frame 2: 没有显示详细内容,代表空或被略去
  • Frame 3:
    • Page 2,Ref Bit = 0
    • Page 1,Ref Bit = 1
  • Frame 4: 是当前 Clock Hand 所指的位置 ✅

如何工作(Clock 算法过程)

  1. 起点: Clock Hand 指向 Frame 4,表示从它开始检查。
  1. 算法规则:
      • 如果帧的 Ref Bit = 1,说明页面“最近被访问”,就将它设置为 0,并移动指针继续查下一个;
      • 如果帧的 Ref Bit = 0,并且该帧未被占用(Pin Count = 0),就选择该帧作为替换目标
      • 若该页是“脏页”,先写回磁盘;
      • 读入新页面后,把 Ref Bit 设为 1,并继续。

举个例子来说明图中操作

假设我们现在 Clock Hand 指向 Frame 4:
  • 查看 Page 2 的 Ref Bit = 0 → ✅ 符合条件,可被换出
  • Page 2 会被替换;
  • 新的页面读入 Frame 4,并把 Ref Bit 设置为 1;
  • Clock Hand 移动到下一个 Frame。
如果 Page 2 的 Ref Bit 是 1 呢?
  • 则将其设为 0,继续下一帧;
  • 直到找到 Ref Bit = 0 的页面。

总结关键点

术语
含义
Clock Hand
当前检查帧的位置
Ref Bit
最近是否被访问过(1=是,0=否)
Eviction
替换 Ref Bit 为 0 且未被占用的帧中的页面
圆形结构
像时钟一样不停地绕圈扫描
优点
接近 LRU 效果,但实现简单,效率高,占用空间少

一步一步模拟一轮真实的 Clock 页面替换流程

假设环境:

我们有一个 4 帧的缓冲池,如下所示:
Frame ID
Page ID
Ref Bit
Pin Count
0
A
1
0
1
B
1
0
2
C
0
0
3
D
1
0
🔁 当前 Clock Hand 指向 Frame 0

模拟过程:页面 E 要读入

目标是:找一个可以被替换的页面(Ref Bit = 0 且 Pin Count = 0)

第一步:Frame 0

  • Ref Bit = 1 → 最近被访问过
    • 👉 把 Ref Bit 改为 0,指针移动到下一个 Frame

第二步:Frame 1

  • Ref Bit = 1 → 最近被访问过
    • 👉 把 Ref Bit 改为 0,指针移动到下一个 Frame

第三步:Frame 2

  • Ref Bit = 0 ✅
  • Pin Count = 0 ✅
    • 🔄 找到可替换的页面:Page C!
操作:
  • 如果 Page C 是脏页(Dirty Bit = 1),写回磁盘;
  • 用新页面 E 替换 Page C;
  • 设置 Frame 2 的 Ref Bit = 1(因为刚刚被访问);
  • 指针移动到下一个 Frame(Frame 3)

最终状态如下:

Frame ID
Page ID
Ref Bit
Pin Count
0
A
0
0
1
B
0
0
2
E
1
1 ← 新读入页面
3
D
1
0
Clock Hand → 指向 Frame 3

总结流程(关键逻辑):

  1. Clock Hand 每次检查当前帧;
  1. 如果 Ref Bit 是 1,就改成 0,继续走;
  1. 如果 Ref Bit 是 0 且 Pin Count = 0,就换掉这个页面;
  1. 读入新页面后,把 Ref Bit 设为 1,Pin Count 设为 1;
  1. 移动 Clock Hand 到下一帧。
notion image
  • database
  • DS3.2 Buffer Manager 类设计Database System(三)
    Loading...