① 五大 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),不同模式下「护士」(线程)怎么处理他们:
→ 点击上方按钮观察不同模式