讲义 PDF p1–88(slides 无页脚页码)
Paging(缓存替换)是竞争分析的发源地:缓存只能放 个页面,请求逐个到来,缺页时必须当场决定逐出哪个页面,而不知道未来会请求什么。本讲按 Lecture 1 的套路走完一个经典问题的全过程:先找出”好”的确定性算法并证明上界,再证明没有确定性算法能做得更好;然后引入随机化,给出 的随机算法,并用一个新工具(Yao 原理)证明随机算法的下界。
| 部分 | 要回答的问题 | 核心结论 |
|---|---|---|
| 1. Paging 问题 | 问题是什么?常见算法谁好谁坏? | LIFO、LFU 的竞争比无界 |
| 2. FIFO 与 LRU | 好算法好在哪里? | 阶段分析:FIFO、LRU 是 -competitive |
| 3. 确定性下界 | 还能更好吗? | 任何确定性算法 ,FIFO、LRU 最优 |
| 4. 随机化 | 随机能否突破 ? | RAND 仍是 ;Random Marking 为 |
| 5. 随机下界 | 随机算法的极限是多少? | Yao 原理:任何随机算法 |
| 6. 拓展 | 换个比较基准或模型会怎样? | 资源增广、机器学习建议、加权 paging、-server |
其中 是调和数。
1. Paging 问题
1.1 背景与定义
存储层次从快到慢依次是寄存器、内存、SSD、硬盘、云存储。高速存储需要从低速存储取数据时,速度瓶颈在低速一侧,常用办法是在中间放一个小而快的缓存(cache)。CPU 请求一个页面时先查缓存:在缓存中称为命中(hit);不在则为缺页(miss),要把页面调入缓存,缓存已满时还要先逐出一个旧页面。目标是让缺页尽量少。
定义:Paging 问题
- 输入:缓存大小 ;页面请求序列 。
- 在线决策: 到达时,若 不在缓存中,缺页数加 ,把 调入缓存;若缓存已满,须当场决定逐出哪个页面。
- 目标:最小化缺页次数,用竞争比衡量。
缺页时必须把请求的页面调入,算法唯一的自由是逐出谁。
1.2 经典算法
| 算法 | 缺页且缓存满时逐出 |
|---|---|
| FIFO(First In First Out) | 最早调入缓存的页面 |
| LRU(Least Recently Used) | 最久没有被使用(请求)的页面 |
| LFU(Least Frequently Used) | 被请求次数最少的页面 |
| LIFO(Last In First Out) | 最晚调入缓存的页面 |
FIFO 与 LRU 的区别在于”旧”的含义:FIFO 看调入时刻,命中不会改变顺序;LRU 看最近一次请求时刻,命中会刷新顺序。按最坏情况竞争比,FIFO、LRU 远好于 LFU、LIFO。
Remark:离线最优算法
知道整个请求序列时,最优策略是 Belady 的 LFD(Longest Forward Distance):缺页时逐出下一次请求最晚(或不再请求)的页面。后面分析 OPT 时会直接用这一策略。
1.3 LIFO 与 LFU 的竞争比无界
LIFO:取 ,只用页面 ,输入 。LIFO 总是逐出刚调入的页面,于是 和 轮流把对方挤出去,每次请求都缺页;OPT 在第一次请求 时逐出 ,之后全部命中。因此 ,,竞争比 。
例:LIFO 在 时的缓存变化
请求 1 2 3 2 3 2 … LIFO 缓存 {1} {1,2} {1,3} {1,2} {1,3} {1,2} … LIFO 缺页 ✓ ✓ ✓ ✓ ✓ ✓ 每次 OPT 缓存 {1} {1,2} {2,3} {2,3} {2,3} {2,3} … OPT 缺页 ✓ ✓ ✓ 不再缺页 页面 永远占着一个位置,LIFO 只在剩下的一个位置上反复替换。
LFU:竞争比同样是 。仿照 LIFO 的坏实例构造:
- 初始化:请求 ,缓存为 。ALG、OPT 各付 。
- 设置频率:请求 共 次(全部命中),使页面 的频率远高于其他页面。
- 愚弄阶段:请求 共 次。LFU 永远不逐出高频的 ,只能让 、 互相挤占,每次都缺页,代价 ;OPT 在第一次请求 时逐出 ,只付 。
竞争比为 。
两个坏例子的共同问题是存在一个愚弄阶段:OPT 的代价完全不增加,ALG 的代价却一直增加。于是自然要问:能否保证 OPT 每增加 ,ALG 至多增加 ?FIFO 与 LRU 正是这样的算法。
2. FIFO 与 LRU 是 -competitive
证明的思路是把输入切成若干阶段(phase),然后分别证明:每个阶段 OPT 至少付 ,而 FIFO/LRU 至多付 。
2.1 阶段划分
定义: -阶段划分
从头扫描请求序列,每个阶段尽量长,但其中只能出现 个不同页面;遇到第 个不同页面时,开始新阶段,该请求是新阶段的第一个请求。
- 记 为第 个阶段的第 个请求, 为第 个阶段的请求数。
- 除最后一个阶段外,每个阶段恰好包含 个不同页面。
阶段划分只由输入决定,与算法无关。例如 时,输入 分为三个阶段:第一阶段的不同页面是 ,请求 是第 个不同页面,开始第二阶段 ;请求 开始第三阶段。
2.2 OPT 的下界
引理 1:每个阶段 OPT 至少缺页一次
在请求 到 这一段中,任何算法(包括 OPT)至少缺页一次。

证明
这一段包含第 阶段除 外的 个不同页面,再加上 (它不属于第 阶段),共 个不同页面,且都不等于 。刚服务完 时,缓存中有 ,至多还能放 个其他页面,放不下这 个页面,所以这一段中至少缺页一次。
图中各段( 到 )互不重叠,所以若共有 个阶段,则 。
2.3 FIFO/LRU 的上界
引理 2:每个阶段 FIFO/LRU 至多缺页 次
从 到 ,FIFO 或 LRU 至多缺页 次。
设第 阶段的 个不同页面为 。引理 2 由下面的引理 3 推出:每个页面在本阶段被请求后就”安全”了,所以每个页面在本阶段至多缺页一次,共至多 次。
引理 3:请求过的页面在本阶段内是安全的
- LRU:页面 在本阶段被请求后,LRU 在本阶段内不会逐出 。
- FIFO:页面 在本阶段因缺页被调入后,FIFO 在本阶段内不会逐出它。
证明
LRU:要逐出 ,它必须是缓存中最久未使用的页面,即缓存中另外 个页面都在 之后被请求过,再加上触发这次缺页的新页面,本阶段在 之后就出现了 个不同于 的页面,加上 共 个,与阶段定义矛盾。
FIFO(对时间归纳): 调入后,要逐出它,必须在它之后再发生 次缺页、调入 个页面。由归纳假设,本阶段每个页面至多缺页一次,而除 外本阶段只有 个页面,所以在本阶段内凑不齐 次缺页。
FIFO 的引理要求 是”因缺页调入”的:若 在本阶段第一次请求时命中(它从上一阶段就在缓存里),FIFO 仍可能因为它调入得早而把它逐出。但此时它在本阶段还没有因缺页付过费,再缺页一次也不超过”每页一次”的计数。
定理:FIFO 与 LRU 的竞争比
FIFO 和 LRU 都是 -competitive 的:,其中 为阶段数。
3. 确定性下界: 是最优的
上一节的分析是否已经最紧?要回答两个问题: 对 FIFO/LRU 是否 tight? 对整个问题是否 tight?思路是构造输入,让上下界同时取等:每个阶段 OPT 恰好付 ,算法恰好付 。
3.1 FIFO 的紧例子
取 ,先请求 填满缓存,之后每次都请求 FIFO 缓存中刚被逐出的页面:。FIFO 每次都缺页,每个阶段付 ;OPT 在每个阶段开头逐出本阶段不会被请求的那个页面(如第二阶段 中逐出 ),每个阶段只付 。

3.2 愚弄所有确定性算法
上面的构造对任何确定性算法都适用:对手可以模拟算法,总是请求算法缓存中缺少的那个页面。
定理:Paging 的确定性下界
任何确定性在线 paging 算法的竞争比都不小于 。因此 FIFO、LRU 是最优确定性算法。
证明
只用 个页面。缓存满后,在任意时刻恰有一个页面不在算法的缓存中;确定性算法的行为可被对手预先算出,对手每次都请求这个页面,于是算法每次都缺页,(去掉开头填满缓存的部分)。
对同一序列,用 LFD 估计 OPT。设 LFD 在时刻 缺页,它在缓存的 个页面中逐出下一次请求最晚的页面 ,所以另外 个页面都会在 之前被请求。由于总共只有 个页面,下一次缺页只能发生在再次请求 时,至少是 个请求之后。所以 LFD 至多每 个请求缺页一次,。
于是 (,加性常数被吸收)。
4. 随机化
确定性下界又一次依赖”对手知道算法缓存中缺哪一页”。随机算法让对手无法确定缺的是哪一页。
4.1 随机逐出(RAND)
定义:RAND
缺页且缓存已满时,从缓存的 个页面中均匀随机选一个逐出,调入请求的页面;缓存有空位时直接调入。
RAND 的期望竞争比仍是 ,且是 tight 的(输入固定,期望对随机逐出取)。问题出在 RAND 对页面的历史一无所知:它会以同样的概率逐出刚刚请求过的页面。
一个无用页面:,初始缓存 ,之后反复请求 ,页面 再也不被请求。OPT 在第一次缺页时逐出 ,总代价 。RAND 只要还保留着 ,就有某个被反复请求的页面不在缓存中,两步之内必然再次缺页;每次缺页以概率 逐出 。记 为直到逐出 为止(含这一次)的缺页数,则 ,。

紧下界:用 个页面: 以及 。初始缓存为 ,交替请求两种长块
(块长 事先固定)。OPT 始终保留 ,每块只缺页一次。在 块中, 是无用页面,RAND 每次缺页以 的概率逐出它,所以每块期望缺页数在 足够大时趋于 。重复足够多块,加性常数可以忽略,竞争比趋于 。
4.2 Marking 算法族
既然 RAND 的问题是”会逐出刚请求过的页面”,就应该保留 LRU 分析中真正起作用的性质。回看第 2 节,LRU 能达到 只用到了两点:
- 知道阶段何时切换;
- 本阶段请求过的页面是安全的,不会被逐出。
把这两点单独提出来,就得到一族算法,LRU 是其中之一。
定义:Marking 算法
每个缓存页面带一个标记位。收到请求 时:
- 若 在缓存中:标记 。
- 若 不在缓存中:任选一个未标记页面逐出,调入 并标记。
- 若 不在缓存中且所有页面都已标记:开始新阶段,清除所有标记,再执行第 2 步。
第 2 步中”任选”规则不同,就得到不同的 marking 算法。Random Marking 在未标记页面中均匀随机选一个逐出。
flowchart TD R[收到请求 x] --> Q{x 在缓存中?} Q -- 是 --> M[标记 x] Q -- 否 --> U{有未标记页面?} U -- 有 --> E[逐出一个未标记页面<br/>调入 x 并标记] U -- 无 --> P[新阶段:清除所有标记] --> E

被标记的页面就是本阶段请求过的页面,所有页面都被标记时恰好有 个不同页面出现过,所以 marking 算法的阶段与第 2 节的 -阶段划分一致。由引理 1 和”每个页面在本阶段至多缺页一次”,任何 marking 算法都是 -competitive 的。LRU 是 marking 算法(被逐出的最久未使用页面一定未标记,除非开始新阶段);FIFO 不是(见文末练习)。
4.3 Random Marking 的分析
为什么不能沿用”每阶段 OPT 付 “:要让 ALG 每阶段的代价小于 ,就不能再用”OPT 每阶段至少付 “这个过粗的下界。例如 时,输入 的第二阶段三个页面全是新的,任何算法(包括 OPT)在这一阶段都要付约 。所以代价应该和每个阶段”新页面的数量”挂钩。
定义:新页面数
为第 阶段中不在第 阶段出现过的不同页面数(新页面);第 阶段的其余 个页面称为旧页面。约定第 阶段为空,故 。
引理 1':OPT 的下界
证明
设 OPT 在第 阶段缺页 次。第 、 两个阶段合起来请求了 个不同页面,而第 阶段开始时 OPT 的缓存至多有 个页面,所以这两个阶段中 OPT 至少缺页 次:(),且 。对 求和,每个 至多被计两次,得 。
再看 Random Marking 在一个阶段中的代价。阶段开始时,缓存恰好是上一阶段请求过的 个页面(即本阶段眼中的”旧页面”候选),全部未标记。
- 新页面:每个新页面必然缺页一次,共 。
- 旧页面:只有在第一次被请求之前就被逐出时才缺页。对手希望旧页面尽量多被逐出,最坏情况是先请求所有新页面,再请求旧页面:新页面越早到,被逐出的旧页面越多。

引理 4:旧页面的缺页概率
把第 阶段被请求的旧页面按首次请求的先后排序,第 个旧页面首次被请求时缺页的概率至多为

证明
称”本阶段尚未被请求、且已被逐出的旧页面”为空洞。每请求一个新页面,就逐出一个未标记页面,即一个尚未请求的旧页面,空洞数加 ;每当一个旧页面缺页,它从空洞变回缓存中的页面,同时又逐出另一个未请求的旧页面,空洞数不变。所以空洞数始终等于已请求的新页面数,至多 。
第 个旧页面被请求时,前 个旧页面已被标记,尚未请求的旧页面还有 个。逐出总是在未标记页面中均匀随机进行,由对称性,空洞是这 个页面中的均匀随机子集。因此第 个旧页面恰好是空洞的概率至多为 。
(讲义用组合计数得到同样结果:先请求完 个新页面时,从 个旧页面中逐出 个,第 1 个旧页面被逐出的概率为 ;依此类推。)
定理:Random Marking 的竞争比
Random Marking 是 -competitive 的,即竞争比为 。
证明
第 阶段旧页面至多 个,由引理 4,期望代价 对阶段求和并结合引理 1’:。
思路:为什么随机能从 降到
确定性算法被坑,是因为对手每次都知道”缓存里缺的是哪一页”,下一步就请求它。Random Marking 中,空洞(被逐出的旧页面)是随机的,对手只能盲猜。
每个阶段中,对手能让 OPT 付的费用约为新页面数 ;新页面在 ALG 的旧页面中”打出” 个空洞。对手接着请求旧页面,想撞上空洞:第 1 次撞中的概率是 ,之后被请求过的旧页面被标记保护,候选越来越少,撞中概率依次是 。这些概率加起来是调和级数,只有 量级,而不是确定性情形下的 。
分析中的因子 来自 OPT 的下界:一个阶段的新页面,OPT 可以提前在上一阶段处理,所以只能保证相邻两阶段合起来付 。
Tightness:在算法层面,可以构造每阶段 的输入(与确定性 下界类似,只用 个页面),计算期望与上面的分析几乎相同,说明 Random Marking 的竞争比确实是 。在问题层面,要证明所有随机算法都做不到更好就难多了:Ski Rental 的随机策略只是购买日上的一个分布,可以直接优化;而 paging 的随机算法有太多种,无法逐一分析,需要新的工具。
5. 随机下界:Yao 原理
5.1 对手的三个层次
讨论随机算法的下界之前,先要说清对手知道什么。
| 对手 | 知道什么 | 评价 |
|---|---|---|
| Adaptive offline | 算法的全部随机比特 | 等价于离线对手,太强:随机化没有用 |
| Adaptive online | 根据算法已做出的决策在线构造输入,但自己的服务也必须在线做出 | 中间层次 |
| Oblivious | 只知道算法的代码(分布),输入须事先固定 | 较弱但合理,本课程的默认设定 |
Lecture 1 中随机算法竞争比的定义(输入在随机选择之前固定)就是 oblivious 对手。
5.2 Yao 的极小极大原理
在 oblivious 对手下证明随机下界,困难在于要对付所有随机算法。Yao 原理把问题反过来:对手先公开一个输入分布,算法设计者知道这个分布后再选一个确定性算法。只要这时每个确定性算法都表现不好,任何随机算法也都表现不好。
例:排序的随机下界(回忆)
行是输入,列是确定性算法,格子里是代价。每个确定性算法都有某个输入让它付很多(如 ),但不同算法的坏输入不同;而对四个输入取均匀混合后,每个确定性算法的期望代价都 。随机算法是各列的混合,所以它在这个输入分布下的期望代价也 ,从而存在某个具体输入使其期望代价 。
定理:Yao 原理(用于竞争比)
若存在一个输入分布 ,使每个确定性在线算法 都满足 则对每个随机在线算法 ,存在输入 使 ,即 的竞争比至少为 (对 oblivious 对手)。
证明
固定 ,定义收益 。
- 算法先选:选随机算法 (确定性算法上的分布),对手知道 但不知道随机比特,。
- 分布先选:选输入分布 ,设计者知道后选确定性算法,。
对任意 和 , 所以 (Yao 不等式)。条件即找到了 使 ,于是每个 都有某个 使 。
使用 Yao 原理的套路:固定一个与算法随机比特无关的输入分布 ;设计者知道 后选确定性算法 ;证明每个 都有 。随机化只是对这些确定性代价取平均,不会更好。
5.3 Paging 的 下界
怎样设计坏分布:它既要有机会愚弄算法,又要足够”均衡”,不让知道分布的设计者找到可利用的规律。回忆确定性下界: 个页面,每次请求算法缺的那一页。现在对手不知道算法缺哪一页,而设计者知道分布,于是最均衡的做法是:每次独立地从 个页面中均匀随机请求一个。
ALG:无论算法怎么做,缓存至多放 个页面,每次请求的页面不在缓存中的概率至少为 。于是 。
OPT:在第一个阶段之后,OPT 每个阶段至多缺页一次:在阶段开始的缺页时,逐出本阶段不会被请求的那个页面( 个页面中恰有一个不在本阶段出现),本阶段剩下的请求全部命中。所以 OPT 约等于阶段数,关键是阶段有多长。
引理:Coupon Collector
每次从 种优惠券中均匀随机抽一张,抽齐所有 种所需的期望次数为 。
一个阶段从某个页面开始(已知 种),在第 种页面出现时结束,期望长度为
证明
已有 种时,下一次抽到新种类的概率为 ,等待次数服从几何分布,期望 。对 求和即得。阶段的情形是 、从 开始。
粗略计算( 很大):阶段数约为 ,所以
“阶段数约为 平均阶段长度”需要严格化,用的是更新理论中的结论。
定理:初等更新定理(Elementary renewal theorem)
设 独立同分布,,。令 ,, 为到时刻 为止完成的更新次数,则 不需要有限方差或连续性假设。
在 paging 中, 是阶段长度(请求独立,各阶段长度独立同分布),。
定理:Paging 的随机下界
任何随机在线 paging 算法(对 oblivious 对手)的竞争比至少为 。
证明
由 OPT 每阶段至多缺页一次(另加初始至多 次),,由更新定理 结合 对每个确定性算法成立, 对任何加性常数 ,取 使 ,再由 Yao 原理,每个随机算法的竞争比至少为 。
至此 paging 的图景是:确定性最优为 ,随机算法可以做到 ,下界为 ,两者只差常数因子 。
Remark: 是 tight 的
存在竞争比恰为 的随机 paging 算法(McGeoch & Sleator 1991 的 Partition 算法;Achlioptas, Chrobak & Noga 2000 的 Equitable 算法),所以随机 paging 的最优竞争比就是 。
6. 拓展
-paging 与资源增广:在线算法的缓存大小为 ,而作为基准的 OPT 只有 的缓存。
| 竞争比 | 来源 | |
|---|---|---|
| 确定性 | (tight) | Sleator & Tarjan 1985 |
| 随机 | 约 (almost tight) | Young 1991 |
这种分析称为资源增广(resource augmentation)。理论上,它是一种放宽的分析、换了一个比较基准;实践上,如果发现 LRU 表现不好,与其设计新算法(困难),不如把缓存加倍(容易): 时确定性比值约为 。
机器学习建议:请求到达时,额外得到对该页面下一次请求时间的预测(Lykouris & Vassilvitskii, ICML 2018)。预测正确时竞争比为 ,预测完全错误时仍为 ,并随预测误差平滑退化。
推广模型:
- 加权 paging:不同页面调入缓存的代价不同。由树上 -server 的结果可得竞争比 。
- -server:度量空间中有 个服务器,服务一个请求就是把某个服务器移到请求点。Paging 是 -server 在均匀度量上的特例,见下一讲。
练习:FIFO 不是 marking 算法
构造一个输入,使 FIFO 在某个阶段内逐出了本阶段已被请求过的页面。
答:取 ,请求 。第二阶段开始时请求 ,FIFO 逐出 ,缓存为 ,调入顺序为 。请求 命中, 在本阶段已被请求(marking 算法会标记它)。请求 时本阶段不同页面为 ,仍在第二阶段;FIFO 逐出最早调入的 ,而 marking 算法只能逐出未标记的 。这也说明 FIFO 的引理 3 为什么只保护”因缺页调入”的页面。
练习:LRU 是 marking 算法
说明 LRU 在阶段内不会逐出已标记页面。
答:已标记页面就是本阶段请求过的页面。若 LRU 在阶段内逐出某个本阶段请求过的页面 ,则 是最久未使用的,缓存中其他 个页面以及当前请求的新页面都在 之后被请求,本阶段就出现了 个不同页面,矛盾。所以 LRU 只在新阶段开始时(全部已标记)才可能逐出本阶段请求过的页面,符合 marking 规则。
