type
status
date
slug
summary
tags
category
icon
password

图的整体结构: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 算法过程)
- 起点: Clock Hand 指向 Frame 4,表示从它开始检查。
- 算法规则:
- 如果帧的
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
总结流程(关键逻辑):
- Clock Hand 每次检查当前帧;
- 如果 Ref Bit 是 1,就改成 0,继续走;
- 如果 Ref Bit 是 0 且 Pin Count = 0,就换掉这个页面;
- 读入新页面后,把 Ref Bit 设为 1,Pin Count 设为 1;
- 移动 Clock Hand 到下一帧。
