首页/操作系统/05-io/阻塞与非阻塞IO 🔗 在 Obsidian 中打开
操作系统 · 05-io

阻塞与非阻塞 IO

重要度 ⭐⭐⭐⭐ 操作系统/IO管理阻塞IO非阻塞IOIO模型
速查
阻塞 IO:IO 未完成时进程阻塞并释放 CPU(CPU 利用率高);非阻塞 IO:立即返回但需轮询忙等(浪费 CPU);大多数系统默认阻塞 IO。

速查

项目
阻塞IOIO 未完成时进程被阻塞,释放 CPU
非阻塞IOIO 未完成时立即返回,进程继续执行
默认方式大多数 OS 默认阻塞 IO
非阻塞用途轮询检查 IO 状态

核心概念

阻塞 IO(Blocking I/O)

  • 进程发起 IO 请求后,如果 IO 未完成,进程被阻塞(进入阻塞态)
  • IO 完成后,中断处理程序唤醒进程
  • 优点:不浪费 CPU(阻塞时释放 CPU);缺点:进程被挂起,不能做其他事情
  • 大多数系统默认使用阻塞 IO

非阻塞 IO(Non-blocking I/O)

  • 进程发起 IO 请求后,如果 IO 未完成,立即返回(不阻塞)
  • 进程需要轮询检查 IO 是否完成
  • 优点:进程不被阻塞,可以做其他事情;缺点:轮询浪费 CPU(忙等)

IO 模型对比

模型IO 未完成时CPU 利用编程复杂度
阻塞IO进程阻塞高(释放CPU)
非阻塞IO立即返回低(轮询忙等)
IO多路复用select/epoll 阻塞
异步IO立即返回+回调最高最高

IO 多路复用

  • 用 select/poll/epoll 同时监听多个文件描述符
  • 任何一个 fd 就绪时返回,适合高并发网络编程

异步 IO

  • 发起 IO 后立即返回,IO 完成后通过信号或回调通知进程
  • 真正的非阻塞——进程完全不等待 IO

关键性质

对比项阻塞IO非阻塞IO
IO 未完成时进程阻塞立即返回
CPU 利用低(轮询)
编程模型简单复杂
适用场景通用需要并发处理

常见考法

考法解题套路
阻塞 vs 非阻塞阻塞释放 CPU(高效),非阻塞忙等(浪费 CPU)
默认 IO 方式大多数 OS 默认阻塞 IO
IO 多路复用select/epoll 同时监听多个 fd
异步 IO发起后立即返回,完成后回调通知

易错点

注意
  1. 阻塞 IO 的 CPU 利用率(阻塞时释放 CPU 给其他进程),不是低
  2. 非阻塞 IO 的 CPU 利用率(轮询浪费 CPU),不是高
  3. 非阻塞 IO $\neq$ 异步 IO——非阻塞仍需轮询,异步是完成后通知
  4. IO 多路复用的 select 是阻塞的——阻塞在 select 上而不是 read/write 上
  5. 异步 IO 是真正的非阻塞——发起后完全不等待,完成后回调

核心结论

必背
  1. 阻塞 IO 是最常用的 IO 模型,IO 未完成时进程阻塞释放 CPU
  2. 非阻塞 IO 需要轮询,浪费 CPU,适合 IO 等待时间短的场景
  3. IO 多路复用(select/epoll)适合高并发场景,同时监听多个 IO
  4. 异步 IO 是最高效的模型,但编程复杂度最高
  5. 大多数 OS 默认使用阻塞 IO——简单且 CPU 利用率高

记忆卡片

阻塞 IO 和非阻塞 IO 的核心区别?
阻塞 IO 未完成时进程阻塞释放 CPU;非阻塞 IO 立即返回需轮询。
哪种 IO 模型 CPU 利用率高?
阻塞 IO(阻塞时释放 CPU)和异步 IO(完全不等待)。
非阻塞 IO 的缺点?
轮询浪费 CPU(忙等)。
什么是 IO 多路复用?
select/epoll 同时监听多个文件描述符,任一就绪时返回。
异步 IO 和非阻塞 IO 的区别?
非阻塞仍需轮询;异步发起后完全不等待,完成后回调通知。

交互动画 · 进程时间线对比

阻塞 IO(发起→阻塞→唤醒) 非阻塞 IO(发起→轮询忙等) 发起IO请求 阻塞释放CPU 等待IO无CPU占用 IO完成·唤醒继续运行 发起IO请求 立即返回继续执行 轮询忙等占用CPU IO完成返回结果 橙 = 阻塞IO路径 | 紫 = 非阻塞IO路径(忙等)
点击按钮对比阻塞 / 非阻塞 / 异步三种 IO 模型的进程行为
默认方式:阻塞 IO;非阻塞 IO 需轮询检查

相关知识点

io-software-layers spooling-technology

↑ 以上为站内 HTML 相对链接(纯网页可浏览);本页右上「在 Obsidian 中打开」跳回源笔记。