[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$fot-QRDp3BObqnxbKQGRt5MN0loe27BJIbyn7q05MSSY":3},{"item":4,"related":44},{"id":5,"type":6,"title":7,"slug":8,"summary":9,"body":10,"coverUrl":11,"productScreenshots":12,"productLinks":13,"authorName":14,"authorUrl":15,"authorSubject":16,"category":17,"tags":22,"sourceLabel":35,"sourceName":36,"sourceUrl":37,"status":38,"seoTitle":7,"seoDescription":9,"canonicalUrl":35,"isFeatured":39,"sno":40,"sortOrder":41,"publishedAt":42,"updatedAt":43,"createdAt":43},"044810b8-5ba0-475f-a0e6-6a167327b639","article","Copy-on-Write：父子进程为什么可以先共享同一份内存？","copy-on-write-memory-sharing","写时复制让多个使用者先共享只读页面，直到某一方真的写入时才创建私有副本，是 fork、快照和容器层常用的延迟复制策略。","Copy-on-Write（写时复制，COW）是一种很朴素却影响深远的优化：多个使用者先共享同一份数据，只有某个使用者真的要修改时，系统才为它复制一份私有版本。它把“可能会改”延迟到“确定要改”的那一刻。\n\nUnix 创建子进程时经常利用这一点。fork 之后，父进程和子进程最初可以共同指向相同的物理页面；这些页面被标记为只读。只要双方都读取，内存无需复制；一旦某个进程写入，处理器触发缺页异常，操作系统分配新的页面，把原内容复制过去，再让写入者修改自己的副本。\n\n这就像复印店只给全班发同一本参考资料：大家可以一起看原件，只有某位同学要在页边做笔记，店里才复印那一页。对大量读取、少量修改的数据，COW 能明显节省内存和启动时间，也被用于快照、容器层、文件系统和持久化数据结构。\n\n代价是第一次写入会承担缺页、分配和复制延迟，写入热点还可能让共享页面迅速裂变。大规模 fork 后如果父子进程都要修改大量内存，COW 的峰值内存可能突然上升；如果应用误以为“共享就永远省内存”，也会在写时付出意外成本。\n\nCOW 的设计重点是权限和引用计数：共享期间阻止直接写入，写故障发生后判断页面是否仍被多人使用，并为写者建立独立版本。它把资源共享和版本隔离结合起来，是操作系统里“先共享、后分叉”这一普遍思想的典型。\n\n快照系统也会利用同样的思想：先把旧版本当作只读基线，新的写入只记录发生变化的块。这样可以快速创建看似完整的副本，但长期累积的写入层会带来碎片、合并和空间回收成本。COW 因而是一种延迟成本的策略，不是让复制完全消失。\n\n在数据库和对象存储中，COW 还常常与版本号、校验和、垃圾回收配合使用。读者可以继续引用旧版本，写者发布新版本后再清理无人引用的旧数据。这样既获得了快照式读取，也把空间回收从写入路径移到了后台任务。\n\n资料来源：[Mel Gorman：Understanding the Linux Virtual Memory Manager](https:\u002F\u002Fwww.kernel.org\u002Fdoc\u002Fgorman\u002Fpdf\u002Funderstand.pdf)","\u002Fuploads\u002F2026-09-26\u002Fbfd5daad-eedd-4305-9f42-9af543a8f85c.jpg",[],[],"Foundit","https:\u002F\u002Ffoundit.cn","foundit-ai-editorial",{"id":18,"name":19,"slug":20,"description":21},"6179d3b6-dc34-4483-9ded-3cd9f1b37a47","科普","abbreviation","介绍各领域新兴概念",[23,27,31],{"id":24,"name":25,"slug":26},"144abe77-0dc6-4f66-a176-20bddb1c0bfa","编程","coding",{"id":28,"name":29,"slug":30},"7c76bfc2-f80f-4ee0-a95d-27bd8708b434","技术","slug",{"id":32,"name":33,"slug":34},"4c2bbea6-eab7-40a8-8447-1de478ff7749","分析","analyse",null,"Mel Gorman：Understanding the Linux Virtual Memory Manager","https:\u002F\u002Fwww.kernel.org\u002Fdoc\u002Fgorman\u002Fpdf\u002Funderstand.pdf","published",false,50,0,"2026-09-27T00:00:00.000Z","2026-09-26T16:26:10.083Z",[45,53,62],{"id":46,"type":6,"title":47,"slug":48,"summary":49,"coverUrl":50,"authorName":14,"sno":51,"publishedAt":42,"createdAt":52},"5e0c84da-6011-41e8-b1f7-726c8bf0b30a","RCU：读多写少的系统，为什么敢让读者几乎不加锁？","rcu-read-copy-update-explained","RCU 把共享数据的更新与旧版本回收拆开，让读者以极低成本读取，同时等待所有旧读者离开后再释放内存。本文用导览图解释它的读侧、宽限期与适用边界。","\u002Fuploads\u002F2026-09-26\u002F3398ce37-ca4f-4cc3-84b3-fe931d2f055d.jpg",41,"2026-09-26T16:25:40.784Z",{"id":54,"type":6,"title":55,"slug":56,"summary":57,"coverUrl":58,"authorName":14,"sno":59,"publishedAt":60,"createdAt":61},"0bc79f1c-f305-4d64-a9f8-589d1d6da0b3","EEVDF：Linux 如何判断哪个任务“最该先用 CPU”？","eevdf-linux-fair-cpu-scheduling","EEVDF 是 Linux 调度器的一种公平调度思路：先判断任务是否获得了应有份额，再按虚拟截止时间安排运行机会。本文用共享厨房的比喻，解释它如何兼顾长期公平与短期响应，并澄清它并非硬实时保证。","\u002Fuploads\u002F2026-10-13\u002Fdc59d374-8c78-41ba-bdfe-a6f0e62ab246.jpg",43,"2026-10-13T00:00:00.000Z","2026-10-13T02:13:28.103Z",{"id":63,"type":6,"title":64,"slug":65,"summary":66,"coverUrl":67,"authorName":14,"sno":68,"publishedAt":42,"createdAt":69},"23b5596a-29ab-4ff8-8237-1fd34d8e0bd1","Seqlock：读者不加锁，为什么还能读到一份一致的数据？","seqlock-sequence-counter-explained","Seqlock 让读者先后读取序列号并在变化时重试，以校验快照是否被写者打断，适合读多写少且字段可安全复制的数据。","\u002Fuploads\u002F2026-09-26\u002Fe6a9caee-7551-469f-9b16-d27fcc97f034.jpg",44,"2026-09-26T16:25:51.305Z"]