🎭 第 2 章 · 五大 I/O 模型对比

同步 / 异步 / 阻塞 / 非阻塞 · 用医院叫号系统理解多路复用

① 五大 I/O 模型时序动画

点击下方任意模型查看时序演示。重点观察「用户线程」是不是被挂起、需要做几次系统调用。

① 阻塞 I/O
② 非阻塞 I/O
③ 多路复用 ⭐
④ 信号驱动
⑤ 异步 I/O

🧑 用户线程

🛡️ 内核 / 数据源

→ 选择一个模型并点击播放

② 同步/异步 × 阻塞/非阻塞 矩阵

五大模型按"同步/异步"和"阻塞/非阻塞"两个维度归类。这一张表是面试官最喜欢问的。

模型
同步/异步
阻塞/非阻塞
关键说明
① 阻塞 I/O
同步
阻塞
用户线程在 read 上挂起
② 非阻塞 I/O
同步
非阻塞
用户自己轮询,CPU 浪费
③ I/O 多路复用
同步
阻塞
阻塞在 select/epoll_wait(等任意 fd 就绪)
④ 信号驱动 I/O
同步
非阻塞
SIGIO 通知后还得自己 read
⑤ 异步 I/O
异步
非阻塞
内核完成全部工作再通知(io_uring)
🚨 常见误区多路复用是"同步阻塞"的!很多人以为它是异步——它阻塞在 select/epoll_wait 上,只是同时盯多个 fd。真异步是 io_uring 这种"内核完事后通知你"的。

③ 用医院叫号类比理解多路复用

假设医院有 10 个病人(fd),不同模式下「护士」(线程)怎么处理他们:

→ 点击上方按钮观察不同模式