IO模型与中断
IO 模型决定应用如何等待外部事件。阻塞、非阻塞、多路复用、异步 IO、信号和中断共同影响服务并发能力。
# 1. 学习目标
- 理解阻塞 IO、非阻塞 IO、IO 多路复用和异步 IO。
- 能解释 select、poll、epoll、kqueue、IOCP 的差异。
- 能把应用线程模型和操作系统 IO 模型联系起来。
# 2. 知识框架
IO模型与中断
├─ 入门:建立术语、对象和日常操作的直觉
├─ 进阶:理解机制、边界和跨平台差异
└─ 专家:能排障、能设计、能阅读实现和研究材料
高并发 IO 的核心不是“线程越多”,而是用更少线程管理更多等待中的连接,把 CPU 留给真正可处理的事件。
# 3. 核心概念
| 主题 | 说明 | 工程关注 |
|---|---|---|
| 阻塞 IO | 调用方等待 IO 完成后返回 | 简单但线程占用高 |
| 非阻塞 IO | 调用立即返回,需要轮询或事件通知 | 适合事件循环 |
| 多路复用 | 一个线程等待多个 IO 事件 | epoll、kqueue、Selector、Netty |
| 异步 IO | 提交请求后由系统完成并回调或通知 | Windows IOCP、部分平台 AIO |
# 4. 机制与实践
- 低并发同步业务可以使用阻塞 IO,高并发长连接优先事件驱动模型。
- 事件循环线程不要执行耗时阻塞任务,避免拖慢所有连接。
- 网络问题要结合连接状态、事件循环延迟、内核队列和应用线程池分析。
# 5. 常用命令与工具
| 命令或工具 | 作用 | 使用建议 |
|---|---|---|
strace -e trace=network -p pid | 观察网络相关系统调用 | 定位 accept、read、write、epoll_wait |
netstat -s | 查看协议栈统计 | 观察重传、丢包和错误 |
lsof -iTCP -sTCP:LISTEN | 查看监听端口 | 确认服务是否真正监听 |
# 6. 常见误区
- 把 NIO 等同于一定高性能:模型只是基础,业务阻塞、内存分配和锁竞争仍会拖慢系统。
- 在事件循环中写阻塞代码:一个慢操作会影响同一事件循环上的大量连接。
- 忽略背压:写入速度超过下游消费能力时,队列和内存会持续膨胀。
# 7. 进阶研究方向
- 比较 epoll、kqueue、IOCP 的通知模型。
- 阅读 Netty、Redis、Nginx 的事件循环设计。
- 研究 io_uring 对 Linux 异步 IO 的改进。
# 8. Tips 快问快答
Q:IO 多路复用解决什么问题?
A:让少量线程等待大量连接的就绪事件,减少一连接一线程的资源开销。
Q:非阻塞 IO 是否不需要等待?
A:不是。它只是调用不阻塞当前线程,等待逻辑需要由事件机制或轮询处理。
Q:epoll 为什么适合高并发?
A:它能高效管理大量文件描述符的就绪事件,避免每次扫描全部连接。
# 9. 总结
IO 模型是高并发系统的底层支点。理解阻塞、非阻塞、事件通知和异步完成后,才能真正看懂服务器、数据库和中间件的网络模型。
上次更新: 2026/06/25, 10:02:19