概念定义
复制常是浪费:多数数据复制后永不改变。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.