← 中文资源

简体中文版本

写时复制(COW)

写时复制把复制推迟到共享页或对象被修改的那一刻:fork 共享物理页、快照廉价、不可变结构按“改动量 O(1)”而非“体积 O(n)”克隆。

阅读英文原文

概念定义

复制常是浪费:多数数据复制后永不改变。COW 把复制推迟到首次修改——此前共享、之后只为真正分叉的部分付费。

工作机制

内核或运行时把共享结构标记只读;写入触发缺页,处理程序分配私有副本、更新引用并恢复执行。fork 出的进程共享带 COW 标记的物理页;MVCC 数据库按页版本化让读者看到一致快照而不阻塞写者;持久化数据结构只重建从变更到根的路径。

使用场景

大状态快照、从预热父进程 fork 出 worker 模型、跨线程共享不可变值、增量复制——读共享主导、突变稀少的场景经济学最优。

常见误区

“COW 让复制免费”实为“让读免费”:写要付复制加缺页,写密集负载会退化。复制波是隐患:fork 后立刻触碰全部页的工作负载要付全额复制再叠加缺页开销。依赖内存超售的 fork 在严格记账的容器里会中途失败;写密集数据集上的长快照链让每个块处处分叉、空间膨胀——要安排合并。Redis BGSAVE 在写密集负载下绝非免费,正是在付这笔账。

代码示例

SELECT id, title, created_at
FROM articles
WHERE (created_at, id) < ($1, $2)
  AND published = true
ORDER BY created_at DESC, id DESC
LIMIT $3;

-- The caller passes the previous page's created_at and id as cursor values,
-- plus the page size as the limit, so no OFFSET scan is required.