[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$fTOo9LgR0iRdJslrVh5157nE123nxz31Xri7JIsHKWO4":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},"69224a1f-e0fc-4431-a3bd-acc1d81523d0","article","io_uring：Linux 如何用两个环形队列批量处理异步 I\u002FO？","io-uring-async-io-rings","io_uring 通过提交队列和完成队列连接应用与内核，让大量 I\u002FO 请求可以批量提交与收取结果，减少固定交互成本。","传统异步 I\u002FO 常把一次操作拆成系统调用、等待和回调，程序与内核之间来回切换。io_uring 是 Linux 提供的一套共享环形队列接口：应用把待做的请求放进提交队列，内核完成后把结果放进完成队列，双方都能批量处理。\n\n可以把它想成厨房和传菜窗口之间的两条传送带。应用把“读这个文件、写那块缓冲区”的任务卡放到提交带上，内核厨师持续取卡执行；完成后，结果卡会被放到另一条完成带上。应用不必为每张卡都敲一次门，而是一次放入一批，再一次性收取多个结果。\n\n提交队列里的元素通常描述操作类型、文件描述符、缓冲区、偏移量和用户数据；完成队列里的元素则告诉应用结果码和实际处理了多少字节。共享内存环让生产者和消费者能低成本交换这些条目，批处理还能减少系统调用次数。对网络服务器、存储服务和高吞吐代理来说，这种减少边界切换的能力很有吸引力。\n\n但 io_uring 不等于“所有 I\u002FO 自动变快”。任务是否真正异步、内核版本和文件系统是否支持某种操作、缓冲区生命周期是否稳定，都会影响收益。程序还要正确处理部分完成、错误码、取消、超时和队列回压；如果应用不断塞入请求却不及时消费完成队列，环形队列本身也会成为瓶颈。\n\n它的价值更像是一种批量化的内核协作模型：把请求描述、执行和完成通知标准化，减少每次操作的固定交互成本。理解提交队列与完成队列后，异步 I\u002FO 就不再只是“开一个线程等待”，而是应用和内核围绕共享队列共同推进工作。\n\n队列深度也是性能模型的一部分。队列太浅，内核无法形成批量并行；队列太深，请求会在内存中排队，尾延迟和取消成本反而上升。一个成熟的 io_uring 使用方式通常会根据磁盘、网卡和业务吞吐动态调节在途请求，并让完成事件及时回收对应的缓冲区和用户数据。\n\n资料来源：[Linux io_uring(7) 手册](https:\u002F\u002Fwww.man7.org\u002Flinux\u002Fman-pages\u002Fman7\u002Fio_uring.7.html)","\u002Fuploads\u002F2026-09-26\u002F0eb80204-5abc-41e2-8c8a-0e1ac633b209.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 io_uring(7) 手册","https:\u002F\u002Fwww.man7.org\u002Flinux\u002Fman-pages\u002Fman7\u002Fio_uring.7.html","published",false,46,0,"2026-09-27T00:00:00.000Z","2026-09-26T16:25:57.069Z",[45,54,62],{"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":60,"createdAt":61},"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-06T00:00:00.000Z","2026-10-06T07:51:27.054Z",{"id":63,"type":6,"title":64,"slug":65,"summary":66,"coverUrl":67,"authorName":14,"sno":51,"publishedAt":42,"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-26T16:25:54.119Z"]