跳到主内容
快讯直播
AI智模界
AI 词典

写时复制与快照:秒级备份背后的同一套把戏

写时复制(Copy-on-Write,简称 CoW)的意思是:多个人先用同一份数据,谁要改,谁才拿到一份属于自己的副本。

打个比方。一份一百页的讲义要发给五十个学生。老实做法是复印五十份,五千页纸。CoW 的做法是:每人先领一张小卡片,写着"讲义在图书馆三号柜"。谁都不动笔时,大家看的是同一本;只有当某个学生要在第三页做批注,管理员才单独复印一份给他改,其余四十九人继续共用原本。

计算机里就这么干。进程调用 fork() 时,内核并不真的复制父进程那几 GB 内存,而是让父子进程的页表指向同一批物理页,统一标成只读。任何一方往里写,CPU 触发一次缺页异常(page fault),内核才复制那一页——只复制一页,不是整个进程——改好页表再放行。所以 fork 快到几乎免费,这也是为什么许多服务用"fork 之后立刻 exec"的方式启动子进程。

快照(snapshot)是同一套把戏的第二副面孔。给几百 GB 的数据库或虚拟机做快照,若老老实实全量复制,要几分钟到几十分钟;CoW 快照只做一件事:记下"此刻这些数据块属于 1 号版本",把这份清单锁住。之后的写入要么落到新位置(重定向写,redirect-on-write),要么先把旧数据挪开。快照本身只动元数据,所以能做到秒级,跟数据量关系不大。开销被推迟到了"第一次修改"那一刻。

容器分层也是它。镜像每一层都是只读的,起十个容器,底下几层是同一份文件,不占十份磁盘;容器要改某个文件时,才把它从只读层"抄上来"到可写层(copy-up)。

场景共享什么何时才真复制换来什么
fork 子进程父进程内存页某一方写入该页时进程创建接近免费
文件系统/虚拟机快照当时的数据块旧块被覆盖前秒级、省空间
容器分层下层只读文件容器修改该文件时镜像复用、启动快

两个容易混淆的邻居:

  • 备份 vs 快照:备份是真的另存一份,拔了线也能恢复;快照只是"记账",底层数据一旦损坏,快照也救不回来。所以快照不能替代备份。
  • 浅拷贝 vs CoW:浅拷贝只复制最外层引用,改内层会互相影响;CoW 在语义上等价于深拷贝,只是把开销推迟到写入时。

实际意义:对普通人,为什么休眠能秒恢复、为什么系统还原点能每小时一个,都是这个把戏。对 AI 从业者,数据处理库的写时复制模式、数据集版本工具、向量库与实验环境的快照,用的是同一招。理解它,就知道哪些操作"看起来在复制,其实在共享",也就知道什么时候会踩到内存翻倍、磁盘写放大、快照空间悄悄涨满的坑——具体配额与保留策略以各平台官方页面为准。

AI 生成本文由 AI 基于公开信息自动生成,仅供参考。