io_uring
了解io_uring可以看看如下link文章https://blog.csdn.net/LAN_chen_ning/article/details/159965083https://cloud.tencent.com/developer/article/2651888Reactor 与 Proactor 模式 通俗完整讲解一、先一句话本质区别Reactor事件通知 自己做 IO内核告诉你有数据来了 / 可写了然后你自己调用 read/recv 去读。ProactorIO 完成通知 内核帮你做完 IO你提前把读 / 写任务交给内核内核做完读写后只通知你已经读完了数据给你放好了。二、Reactor 模式同步事件驱动1. 工作流程应用注册fd 读 / 写事件到多路复用器epoll/kqueue/select内核等待事件就绪事件到达 → 内核唤醒应用应用自己调用 recv/read/send/write完成实际 IO处理业务逻辑2. 形象理解你去食堂排队服务员喊你“你的饭好了”你自己上去端饭回来吃。3. 特点IO 事件由内核监听实际读写由用户态代码执行属于同步非阻塞模型4. 典型开源库muduolibeventlibevlibuvNginx大部分 Linux 网络框架5. 优点逻辑简单、好理解、好调试Linux 下生态成熟、性能足够高开发门槛低6. 缺点事件触发后还要再调用一次系统调用去读写高并发下系统调用开销累积三、Proactor 模式异步事件驱动1. 工作流程应用提前发起异步读 / 写请求把缓冲区交给内核内核自己负责等待数据、拷贝到用户缓冲区IO 真正完成后内核给应用发完成事件应用直接处理已经读到好的数据不用再调用 recv2. 形象理解你点餐留地址食堂做好直接送餐到你桌上你不用自己去端直接开吃。3. 特点内核全权包办 IO 读写用户态只接收「IO 完成」通知真正异步 IO模型4. 典型开源 / 系统WindowsIOCP标准 ProactorBoost.Asio跨平台封装成 Proactor 风格Java NIO2 AIO部分基于 io_uring 封装的框架5. 优点少系统调用内核批量处理 IO用户态不用循环读写CPU 开销更低高并发极限吞吐更强6. 缺点逻辑比 Reactor 复杂很多编程模型反直觉回调 / 异步链难写Linux 原生 AIO 弱靠 io_uring 才像样四、核心对比表维度ReactorProactorIO 谁做用户态自己 read/recv内核自动完成读写触发通知通知「可读 / 可写」通知「已读完 / 已写完」模型类型同步非阻塞真正异步系统调用次数多事件 再读写少只提交一次任务编程难度简单、直观复杂、反直觉代表框架muduo、libevent、libuvIOCP、Boost.Asio、io_uring 高级封装平台偏好Linux 标配Windows 原生支持Linux 靠 io_uring五、和你之前学的技术对应epoll→ 天然适配Reactorio_uring→ 可以轻松实现Proactor语义内核替你做 accept/recv/sendmuduo/libuv都是标准Reactor 实现Boost.Asio对外统一封装成Proactor 编程风格底层 Linux 用 epoll 模拟、Windows 用 IOCP 原生六、最简单记忆口诀Reactor有事喊你自己去读Proactor帮你做完直接给结果Direct I/O 与 Buffered I/O 通俗易懂详解Linux 标准一、先搞懂核心区别1. Buffered I/O 缓冲 I/O默认普通读写也叫Cache I/OLinux 所有read/write、fread/fwrite默认都是 Buffered I/O。2. Direct I/O 直接 I/O绕过操作系统页缓存Page Cache应用程序直接和磁盘硬件读写数据不经过内核缓存。二、Buffered I/O 原理流程写流程应用缓冲区 →内核 Page Cache页缓存→ 内核后台刷盘 → 磁盘硬件读流程磁盘硬件 →内核 Page Cache→ 应用缓冲区核心特点有操作系统页缓存兜底第一次读进缓存第二次直接从缓存拿极快写操作先写缓存不立刻落盘内核异步延迟刷盘系统自动预读、缓存热点数据Buffered I/O 优点读写延迟低、命中率高内核帮你做预读、缓存、合并 IO、调度接口简单不用管对齐、块大小普通文件、日志、配置、业务程序默认首选Buffered I/O 缺点多了一次用户态 ↔ 内核态数据拷贝占用大量内存做 Page Cache内存大时会吃满内存掉电可能缓存数据没刷盘丢失数据三、Direct I/O 原理流程读写都直接跨过 Page Cache应用缓冲区 ⇨直接磁盘硬件强制约束必须满足否则调用失败内存地址对齐必须按 4K/512 字节对齐读写长度对齐必须是磁盘块大小整数倍常见 512B、4K文件偏移对齐读写起始偏移也要对齐Direct I/O 优点无 Page Cache 内存占用不抢占系统缓存内存少一次数据拷贝用户态直接到磁盘CPU 开销更低不污染系统页缓存适合数据库自己管理缓存读写实时落盘可控性强内核不干预Direct I/O 缺点无系统缓存、无预读重复读性能差强制对齐编程麻烦自己要管理内存块小 IO 性能极差只能适合大块顺序读写没有内核 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 RDBLevelDB、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绕内核缓存无内存浪费、少拷贝数据库 / 存储专用编程要处理对齐。