[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$fXu2i4pATFHr6wjUGaoftx8Qv8oFUEizZTwXuQXj9jlE":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},"c815f364-8e08-45f5-bd34-2a9b9673f7d6","article","userfaultfd：程序能不能自己接管缺页处理？","linux-userfaultfd-userspace-page-faults","Linux userfaultfd 能把特定缺页事件交给用户态程序处理，为按需恢复和延迟加载提供接口。本文说明工作方式、延迟代价与实现边界。","程序遇到尚未装入内存的页面时，操作系统通常会处理缺页：找数据、分配页面，再让程序继续执行。userfaultfd 把其中一部分缺页事件交给用户态程序处理。管理者可以接收“某个地址需要页面”的通知，再准备内容并通过接口交回内核，之后原任务才能继续访问。\n\n这像一间仓库给客户发来取货请求，但不由仓库自动找货，而是把请求交给一个专门的调度员。调度员可以按需从远端加载数据、从快照恢复页面，或执行应用特定的准备逻辑。Linux 用户态分页接口因此成为一些延迟装载和内存管理方案的基础组件。\n\n一个典型用途是虚拟机或进程的按需恢复：先快速启动执行环境，只在真正访问某个页面时再从检查点或远端取回内容。这种方式能缩短“所有内存都预先复制完”之前的等待，但并没有消除数据传输。首次访问缺失页面的任务必须等页面抵达，远程链路变慢时，停顿仍会直接暴露给应用。后台预取可以降低等待，却可能多取无用数据、占带宽或占内存。\n\nuserfaultfd 提供不同事件模式和 ioctl 操作，具体能力与内核版本、权限和系统配置有关。它也要求用户态处理程序可靠：若事件没有被及时处理，受影响的线程就可能长期挂起；若恢复内容错误，程序得到的就是错误状态。它适合明确需要自定义分页策略的系统软件，不是普通应用替代 `malloc` 或通用缺页处理的快捷开关。\n\n设计者通常要考虑故障处理器本身如何获得其所需的内存和代码，避免处理页面时又触发无法处理的递归缺页；还要管理并发访问、取消、超时和远端错误。权限控制也很重要，因为用户态组件可能决定哪些页面内容进入进程。若将其用于容器迁移或运行时恢复，必须验证一致性边界和失败回滚策略。\n\n它把虚拟内存中一个原本由内核封装的机制开放给专门的软件，让“页面从哪里来”可以由应用架构参与决定。灵活性更强的同时，延迟、失败语义和安全责任也要由系统设计者承担。\n\n来源：[Linux `userfaultfd(2)` 手册](https:\u002F\u002Fwww.man7.org\u002Flinux\u002Fman-pages\u002Fman2\u002Fuserfaultfd.2.html)","\u002Fuploads\u002F2026-10-06\u002F330041ff-463a-465f-8f43-6e03c57f9177.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},"a202d639-99a6-488a-a712-4d4c6ffd7e15","开发","dev",null,"Linux userfaultfd(2) Manual","https:\u002F\u002Fwww.man7.org\u002Flinux\u002Fman-pages\u002Fman2\u002Fuserfaultfd.2.html","published",false,49,0,"2026-10-06T00:00:00.000Z","2026-10-06T07:51:25.559Z",[45,54,61],{"id":46,"type":6,"title":47,"slug":48,"summary":49,"coverUrl":50,"authorName":14,"sno":51,"publishedAt":52,"createdAt":53},"4ce57934-2b23-41a1-800e-bb2d8ab36684","Wasm Component Model：不同语言写的模块怎样用同一套接口协作？","wasm-component-model-wit-interfaces","WebAssembly Component Model 用有类型的接口描述组件如何交换数据与调用功能，WIT 则帮助表达这些接口。本文用模块化电器说明跨语言组合的意义，也指出它不代表程序脱离运行时就能在任何环境原样运行。","\u002Fuploads\u002F2026-10-17\u002F0eb1c88d-dc1f-486d-8194-54f72dd215ec.jpg",45,"2026-10-17T00:00:00.000Z","2026-10-17T03:08:52.474Z",{"id":55,"type":6,"title":56,"slug":57,"summary":58,"coverUrl":59,"authorName":14,"sno":51,"publishedAt":42,"createdAt":60},"07fe8e6e-82b0-46cc-9015-c6d027564430","pidfd：进程号会被重用，怎样才能稳定指向一个进程？","linux-pidfd-stable-process-reference","Linux pidfd 用文件描述符稳定引用一个进程，避免退出后的 PID 被重用而误操作新进程。本文介绍它的等待、信号用途和版本边界。","\u002Fuploads\u002F2026-10-06\u002F699e59f8-693f-47cb-87b1-c51764d1a679.jpg","2026-10-06T07:51:27.054Z",{"id":62,"type":6,"title":63,"slug":64,"summary":65,"coverUrl":66,"authorName":14,"sno":51,"publishedAt":67,"createdAt":68},"15988123-6303-4ab1-ba01-dcc41f36329f","Futex：Linux 的锁为什么大多数时候根本不需要进内核？","futex-fast-userspace-locking","Futex 把无竞争时的锁操作留在用户态，只有真正需要睡眠和唤醒时才进入内核，是 Linux 高性能锁的关键低层构件。","\u002Fuploads\u002F2026-09-26\u002F90e98cc8-e57b-4dea-afc7-2afe7550d483.jpg","2026-09-27T00:00:00.000Z","2026-09-26T16:25:54.119Z"]