当前位置: 首页 > news >正文

io_uring

了解io_uring,可以看看如下link文章:

https://blog.csdn.net/LAN_chen_ning/article/details/159965083

https://cloud.tencent.com/developer/article/2651888

Reactor 与 Proactor 模式 通俗完整讲解

一、先一句话本质区别

  • Reactor:事件通知 + 自己做 IO内核告诉你:有数据来了 / 可写了,然后你自己调用 read/recv 去读
  • Proactor:IO 完成通知 + 内核帮你做完 IO你提前把读 / 写任务交给内核,内核做完读写后,只通知你:已经读完了,数据给你放好了

二、Reactor 模式(同步事件驱动)

1. 工作流程

  1. 应用注册fd 读 / 写事件到多路复用器(epoll/kqueue/select)
  2. 内核等待事件就绪
  3. 事件到达 → 内核唤醒应用
  4. 应用自己调用 recv/read/send/write完成实际 IO
  5. 处理业务逻辑

2. 形象理解

你去食堂排队,服务员喊你:“你的饭好了”自己上去端饭回来吃。

3. 特点

  • IO 事件由内核监听
  • 实际读写由用户态代码执行
  • 属于同步非阻塞模型

4. 典型开源库

  • muduo
  • libevent
  • libev
  • libuv
  • Nginx
  • 大部分 Linux 网络框架

5. 优点

  • 逻辑简单、好理解、好调试
  • Linux 下生态成熟、性能足够高
  • 开发门槛低

6. 缺点

  • 事件触发后还要再调用一次系统调用去读写
  • 高并发下系统调用开销累积

三、Proactor 模式(异步事件驱动)

1. 工作流程

  1. 应用提前发起异步读 / 写请求,把缓冲区交给内核
  2. 内核自己负责等待数据、拷贝到用户缓冲区
  3. IO 真正完成后,内核给应用发完成事件
  4. 应用直接处理已经读到好的数据,不用再调用 recv

2. 形象理解

你点餐留地址,食堂做好直接送餐到你桌上你不用自己去端,直接开吃。

3. 特点

  • 内核全权包办 IO 读写
  • 用户态只接收「IO 完成」通知
  • 真正异步 IO模型

4. 典型开源 / 系统

  • WindowsIOCP标准 Proactor
  • Boost.Asio(跨平台封装成 Proactor 风格)
  • Java NIO2 AIO
  • 部分基于 io_uring 封装的框架

5. 优点

  • 少系统调用,内核批量处理 IO
  • 用户态不用循环读写,CPU 开销更低
  • 高并发极限吞吐更强

6. 缺点

  • 逻辑比 Reactor 复杂很多
  • 编程模型反直觉,回调 / 异步链难写
  • Linux 原生 AIO 弱,靠 io_uring 才像样

四、核心对比表

维度ReactorProactor
IO 谁做用户态自己 read/recv内核自动完成读写
触发通知通知「可读 / 可写」通知「已读完 / 已写完」
模型类型同步非阻塞真正异步
系统调用次数多(事件 + 再读写)少(只提交一次任务)
编程难度简单、直观复杂、反直觉
代表框架muduo、libevent、libuvIOCP、Boost.Asio、io_uring 高级封装
平台偏好Linux 标配Windows 原生支持,Linux 靠 io_uring

五、和你之前学的技术对应

  1. epoll→ 天然适配Reactor
  2. io_uring→ 可以轻松实现Proactor语义(内核替你做 accept/recv/send)
  3. muduo/libuv都是标准Reactor 实现
  4. Boost.Asio对外统一封装成Proactor 编程风格,底层 Linux 用 epoll 模拟、Windows 用 IOCP 原生

六、最简单记忆口诀

  • Reactor:有事喊你,自己去读
  • Proactor:帮你做完,直接给结果

Direct I/O 与 Buffered I/O 通俗易懂详解(Linux 标准)

一、先搞懂核心区别

1. Buffered I/O 缓冲 I/O(默认普通读写)

也叫Cache I/O,Linux 所有read/writefread/fwrite默认都是 Buffered I/O

2. Direct I/O 直接 I/O

绕过操作系统页缓存(Page Cache),应用程序直接和磁盘硬件读写数据,不经过内核缓存。


二、Buffered I/O 原理流程

写流程

应用缓冲区 →内核 Page Cache(页缓存)→ 内核后台刷盘 → 磁盘硬件

读流程

磁盘硬件 →内核 Page Cache→ 应用缓冲区

核心特点

  1. 有操作系统页缓存兜底
  2. 第一次读进缓存,第二次直接从缓存拿,极快
  3. 写操作先写缓存,不立刻落盘,内核异步延迟刷盘
  4. 系统自动预读、缓存热点数据

Buffered I/O 优点

  • 读写延迟低、命中率高
  • 内核帮你做预读、缓存、合并 IO、调度
  • 接口简单,不用管对齐、块大小
  • 普通文件、日志、配置、业务程序默认首选

Buffered I/O 缺点

  • 多了一次用户态 ↔ 内核态数据拷贝
  • 占用大量内存做 Page Cache,内存大时会吃满内存
  • 掉电可能缓存数据没刷盘,丢失数据

三、Direct I/O 原理流程

读写都直接跨过 Page Cache

应用缓冲区 ⇨直接磁盘硬件

强制约束(必须满足,否则调用失败)

  1. 内存地址对齐:必须按 4K/512 字节对齐
  2. 读写长度对齐:必须是磁盘块大小整数倍(常见 512B、4K)
  3. 文件偏移对齐:读写起始偏移也要对齐

Direct I/O 优点

  1. 无 Page Cache 内存占用,不抢占系统缓存内存
  2. 少一次数据拷贝:用户态直接到磁盘,CPU 开销更低
  3. 不污染系统页缓存,适合数据库自己管理缓存
  4. 读写实时落盘,可控性强,内核不干预

Direct I/O 缺点

  1. 无系统缓存、无预读,重复读性能差
  2. 强制对齐,编程麻烦,自己要管理内存块
  3. 小 IO 性能极差,只能适合大块顺序读写
  4. 没有内核 IO 合并,随机小 IO 压力很大

四、关键核心对比表

表格

对比项Buffered I/O 缓冲 I/ODirect I/O 直接 I/O
是否走 Page Cache✅ 是❌ 绕过
数据拷贝多一次内核拷贝零拷贝,直达磁盘
缓存策略内核自动管理应用自己管理缓存
读写对齐要求无要求必须内存 / 偏移 / 长度对齐
重复读取速度极快(命中缓存)慢(每次都读磁盘)
内存占用占用系统 Page Cache不占 Page Cache
适用场景普通文件、日志、配置、Web 服务数据库、存储引擎、大数据
编程难度简单复杂

五、各自典型使用场景

什么时候用 Buffered I/O(默认)

  • 普通业务程序读写配置、日志
  • Web 服务、Nginx、业务小文件
  • 偶尔读取、热点不多的文件
  • 不想处理对齐、只想简单读写

什么时候必须用 Direct I/O

数据库 / 存储引擎专用

  • MySQL、PostgreSQL、Redis RDB
  • LevelDB、RocksDB、TiDB
  • 分布式存储、块存储、大数据读写

原因:数据库自己有自己的内存缓存池,不需要内核 Page Cache;用 Direct I/O 绕过系统缓存,避免双重缓存浪费内存,还能自主控制刷盘时机。


六、Linux 如何开启

Buffered I/O

默认open()不加任何特殊标志就是:

c

运行

fd = open("a.txt", O_RDWR);

Direct I/O

O_DIRECT标志:

c

运行

fd = open("data.dat", O_RDWR | O_DIRECT);

七、一句话极简总结

  • Buffered I/O:过内核缓存,省心、快、适合普通业务,掉电可能丢数据。
  • Direct I/O:绕内核缓存,无内存浪费、少拷贝,数据库 / 存储专用,编程要处理对齐。
http://www.jsqmd.com/news/820194/

相关文章:

  • 科技早报晚报|2026年5月14日:数据库沙箱、文档解析与 GPU 共享,今天更值得做成产品的 3 个技术机会
  • 《简明银行会计(程序员视角)》详细读书笔记
  • Trae IDE 实战:打造“创建完美智能体助手”(交互式+自动生成+模板删减,新手无脑上手)
  • WasmEdge:高性能WebAssembly运行时在云原生与边缘计算中的实践
  • 从时序到内存:51单片机驱动DHT11和OLED屏的5个常见坑点及解决方法
  • CC‑Switch 下载、配置、安装完整指南【2026.5.14】
  • ARM ETE Trace技术:非侵入式调试与TRCEVENTCTL寄存器详解
  • 结构化提示词工程:模块化设计提升LLM应用开发效率
  • 基于Wechaty的插件化聊天机器人开发:从消息管道到指令系统
  • Git 分支保护规则如何配置禁止强制推送 force push
  • Display-Lock:开源工具解决多显示器与远程桌面黑屏难题
  • VSCode布局管理插件vscode-control:提升开发效率的界面控制中心
  • Claude 3 AI 编程启动包:结构化提示词提升项目开发效率
  • 宠物洗衣机推荐哪款性价比高?618十款性价比高的宠物洗衣机品牌大盘点!希亦/小吉等型号解密~
  • Equinix 扩展 Fabric Geo Zones 应对数据主权挑战
  • Cursor智能体工具包:从AI编程助手到自主规划开发伙伴
  • Ironclad/Rivet:现代开发者的效率革命,从环境配置到工具链整合
  • 一篇讲透:为什么说 GEO 不是营销,是你的基本功
  • 【研报 A122】中国电子皮肤行业概览:柔性触觉传感从实验室走向产业化
  • Midscene.js 2025技术演进:从自动化工具到智能操作平台的架构升级
  • VS运行时库配置区别(静态链接和动态链接区别)
  • ChatGPT对话转Anki闪卡:自动化工具实现与Python技术解析
  • Android Studio集成阿里云OpenAPI:从‘Access Key Not Found’到子账户权限配置的实战避坑
  • GitHub Awesome List:OpenClaw机器人抓取学习资源全导航
  • AI智能体安全扫描实战:AgentScan开源工具详解与应用
  • 别再只会用@article了!BibTeX中@inproceedings和@article的保姆级区别指南(附AI会议论文引用实例)
  • Unity多语言本地化新方案:基于GPT的自动化工具设计与实战
  • 全球数据中心分布变化对代理IP可用性的影响
  • Elasticsearch 8.3.3 HTTPS连接踩坑记:DBeaver配置JDBC驱动与P12证书的完整流程
  • 2026年AI自动剪辑视频软件怎么选择?5款自动剪辑软件对比