[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$f7I5xwfvPbA7DI6wyux3cLKmxfOxaNuZZyy1Jn3p7HqQ":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},"5e0c84da-6011-41e8-b1f7-726c8bf0b30a","article","RCU：读多写少的系统，为什么敢让读者几乎不加锁？","rcu-read-copy-update-explained","RCU 把共享数据的更新与旧版本回收拆开，让读者以极低成本读取，同时等待所有旧读者离开后再释放内存。本文用导览图解释它的读侧、宽限期与适用边界。","很多高并发系统有一个共同烦恼：读操作远多于写操作，但如果每次读都先抢一把锁，CPU 就会把时间花在排队上。RCU（Read-Copy Update，读-复制-更新）就是为这种场景设计的一种并发思想。它的核心不是让读者更快地抢到锁，而是让读者尽量不需要锁。\n\n可以把一份共享配置想象成商场里的导览图。绝大多数人只是查路线，只有偶尔才有人更新地图。传统做法是在更新时把门关上，所有查询者等更新完成；RCU 则会先复制一份新地图，在新地图准备好后，把入口指针从旧地图瞬间切到新地图。已经拿到旧地图的人继续读完，后来的人直接看新地图。\n\n这里最关键的是“更新”和“回收”被拆开了。更新者可以创建新版本、修改新版本，再发布新指针；但旧版本不能马上释放，因为某个读者可能还握着它。系统需要等到所有在更新前开始的读者都离开临界区，确认没有人再访问旧对象后，才回收旧内存。这个等待阶段常被称为宽限期（grace period）。\n\nRCU 的读侧因此非常轻：通常只需要进入和退出一个读侧标记区，不需要原子地修改一个互斥锁状态。它特别适合内核路由表、文件系统元数据、进程信息等“读多写少”的结构。代价也很明确：更新者要承担复制和延迟回收的成本，读者不能无限期停留，否则旧版本会一直占着内存；如果数据需要频繁写入，复制成本也可能超过锁竞争成本。\n\n工程上还要注意，RCU 保护的是“对象何时可以被释放”，并不自动保证业务字段的组合更新是一致的。发布新指针、修改对象内部字段、管理嵌套对象，都需要额外的内存顺序和生命周期设计。理解这一点后，RCU 就不再是一个神秘的内核缩写：它是在读路径上尽量少做事，把复杂度转移给版本发布、读者追踪和安全回收。\n\n资料来源：[Linux Kernel Documentation：What is RCU?](https:\u002F\u002Fwww.kernel.org\u002Fdoc\u002Fhtml\u002Fv6.13\u002FRCU\u002FwhatisRCU.html)","\u002Fuploads\u002F2026-09-26\u002F3398ce37-ca4f-4cc3-84b3-fe931d2f055d.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,"Linux Kernel Documentation：What is RCU?","https:\u002F\u002Fwww.kernel.org\u002Fdoc\u002Fhtml\u002Fv6.13\u002FRCU\u002FwhatisRCU.html","published",false,41,0,"2026-09-27T00:00:00.000Z","2026-09-26T16:25:40.784Z",[45,54,62],{"id":46,"type":6,"title":47,"slug":48,"summary":49,"coverUrl":50,"authorName":14,"sno":51,"publishedAt":52,"createdAt":53},"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":55,"type":6,"title":56,"slug":57,"summary":58,"coverUrl":59,"authorName":14,"sno":60,"publishedAt":42,"createdAt":61},"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",{"id":63,"type":6,"title":64,"slug":65,"summary":66,"coverUrl":67,"authorName":14,"sno":68,"publishedAt":42,"createdAt":69},"6ced249d-9a51-438b-b51a-8ebb9a27a949","NUMA：同一台机器上的内存，为什么有的更近更快？","numa-non-uniform-memory-access","NUMA 把多路服务器的 CPU 与内存看成多个距离不同的节点，本地访问通常更快，线程与数据的放置会直接影响吞吐和尾延迟。","\u002Fuploads\u002F2026-09-26\u002F1bf98759-c58b-4537-a274-ebc889f06f89.jpg",48,"2026-09-26T16:26:03.813Z"]