【计算机基础速成】第十三课:IO 模型与 IO 多路复用

3 小时前

【计算机基础速成】第十三课:IO 模型与 IO 多路复用

1. 这节课的目标

IO 模型是操作系统和后端开发面试里很常见的一块内容。

面试官常见会问:

  • 什么是 IO?
  • 什么是阻塞 IO 和非阻塞 IO?
  • 什么是同步 IO 和异步 IO?
  • 什么是 IO 多路复用?
  • 为什么 Redis、Nginx 经常提到 IO 多路复用?

这节课学完后,你至少要做到:

  • 知道 IO 是什么
  • 能分清阻塞和非阻塞
  • 能对同步和异步建立基础理解
  • 能说清 IO 多路复用的核心思想
  • 能回答它为什么适合高并发网络场景

2. 什么是 IO

一句话理解

IO 就是输入和输出。

在后端里通常指什么

最常见的是:

  • 读文件
  • 写文件
  • 网络收发数据

面试标准答法

IO 是 Input/Output,也就是输入输出。在操作系统和后端开发中,IO 通常指程序与外部设备或外部资源之间的数据交换,比如磁盘读写、网络数据收发等。


3. 为什么 IO 是个问题

核心原因

IO 往往比 CPU 计算慢得多。

比如:

  • 你发一个网络请求
  • 数据还没到
  • 线程可能就得等

如果一个线程老是在等 IO,那系统整体效率就可能不高。

所以操作系统和服务端程序需要考虑:

等待 IO 的时候,能不能更高效一点?


4. 什么是阻塞 IO

一句话理解

发起 IO 操作后,如果数据没准备好,线程就一直等着,这就是阻塞 IO。

面试标准答法

阻塞 IO 指的是线程在发起 IO 操作后,如果数据还没有准备好,就会一直等待,直到 IO 完成之后才继续执行。

怎么理解

就像你去窗口办事,没办完之前你只能一直站在那里等。

Mermaid Loading...

5. 什么是非阻塞 IO

一句话理解

发起 IO 操作后,如果数据没准备好,线程不会一直卡住,而是立刻返回。

面试标准答法

非阻塞 IO 指的是线程发起 IO 操作后,如果数据还没准备好,不会一直等待,而是立即返回,线程可以过一会儿再来检查数据是否就绪。

怎么理解

还是窗口办事的类比:

  • 你去问一次
  • 还没好
  • 你先去干别的
  • 过会儿再回来问

注意

非阻塞不等于高效。

如果你一直反复轮询问“好了没”,也可能浪费 CPU。


6. 阻塞和非阻塞的区别

对比项阻塞 IO非阻塞 IO
数据没准备好时线程一直等待线程立即返回
线程状态被卡住可以继续做别的事或再次检查
编程复杂度较低通常更复杂

面试标准答法

阻塞和非阻塞的区别在于,发起 IO 操作后,如果数据没有准备好,阻塞 IO 会让线程一直等待,而非阻塞 IO 会立即返回,线程可以选择继续做其他事情或稍后再次检查。


7. 什么是同步 IO 和异步 IO

这组概念很多人会和阻塞/非阻塞混在一起。

你现在先掌握一个面试够用版本。

同步 IO

发起 IO 后,最终数据读写完成这件事,通常还需要当前线程自己参与处理和等待结果。

异步 IO

发起 IO 后,线程不用一直自己盯着,等 IO 真完成后,系统再通知线程。

面试标准答法

同步和异步更强调的是“谁来等待结果、谁来完成后续处理”。同步 IO 中,调用方通常需要自己等待 IO 完成;异步 IO 中,调用方发起请求后可以先去做别的事,等 IO 真正完成后再由系统通知。

Mermaid Loading...

8. 什么是 IO 多路复用

这是这节课最核心的问题。

一句话理解

IO 多路复用就是用一个线程去同时监听多个 IO 事件,哪个就绪了再处理哪个。

为什么需要它

如果一个连接配一个线程,当连接很多时,线程数就会爆炸,成本很高。

IO 多路复用的思路是:

  • 不给每个连接单独配一个线程死等
  • 先统一监听很多连接
  • 谁准备好了,再处理谁

面试标准答法

IO 多路复用是一种 IO 处理机制,它可以让一个线程同时监听多个文件描述符或连接,当某个连接就绪时再进行处理,从而减少线程数量,提高并发处理能力。

Mermaid Loading...

9. IO 多路复用解决了什么问题

核心作用

  • 减少线程数量
  • 避免大量线程阻塞等待
  • 提高高并发场景下的处理效率

面试标准答法

IO 多路复用的核心价值是让少量线程甚至单线程就能够同时管理多个连接,避免为每个连接都创建一个阻塞线程,从而减少资源消耗并提高高并发处理能力。


10. 为什么 Redis、Nginx 经常提到 IO 多路复用

这是面试中非常高频的追问。

Redis

Redis 经常要同时处理很多客户端连接。

它如果给每个连接都开一个线程,代价会很高。

所以它常常借助 IO 多路复用机制,用较少线程处理大量连接。

Nginx

Nginx 也是高并发网络服务器,需要同时处理大量请求连接。

IO 多路复用可以让它更高效地监听和处理这些连接。

面试标准答法

Redis 和 Nginx 都需要在高并发场景下处理大量网络连接,而 IO 多路复用可以让少量线程同时监听多个连接,谁就绪就处理谁,因此能够显著降低线程开销并提升并发处理能力。


11. 你现在不必深挖的部分

这个阶段你先不用深挖:

  • select
  • poll
  • epoll
  • 边缘触发和水平触发
  • 具体内核实现细节

这些当然重要,但对你当前“后端实习速成”来说,不是第一优先级。

你现在先把下面几句答顺更重要:

  • 什么是阻塞 IO
  • 什么是非阻塞 IO
  • 什么是 IO 多路复用
  • 为什么它适合高并发

12. 一套适合面试的完整答法

如果面试官问:

什么是 IO 多路复用?

你可以这样答:

IO 多路复用是一种 IO 处理机制,它可以让一个线程同时监听多个连接或文件描述符,
当某个连接就绪时再去处理,而不是给每个连接都分配一个线程阻塞等待。
这样做的好处是可以减少线程数量,降低资源消耗,
并提升高并发场景下的连接处理能力。
所以像 Redis、Nginx 这类需要处理大量网络连接的系统,经常会使用 IO 多路复用机制。

如果面试官再问阻塞和非阻塞,你可以补一句:

阻塞 IO 是线程发起 IO 后一直等待结果,
非阻塞 IO 是发起后如果数据未就绪就立即返回,
而 IO 多路复用则是进一步让一个线程高效管理多个 IO 事件。

13. 本课高频面试题

13.1 什么是 IO

标准回答

IO 是输入输出,通常指程序与外部资源之间的数据交换,比如文件读写、网络数据收发等。


13.2 什么是阻塞 IO 和非阻塞 IO

标准回答

阻塞 IO 是指发起 IO 操作后,如果数据还没有准备好,线程会一直等待;非阻塞 IO 则是在数据未准备好时立即返回,线程可以稍后再检查。


13.3 什么是同步 IO 和异步 IO

标准回答

同步和异步主要强调的是调用方如何等待和获取结果。同步 IO 中,调用方通常需要自己等待结果;异步 IO 中,调用方发起请求后可以先做别的事,等 IO 完成后再由系统通知。


13.4 什么是 IO 多路复用

标准回答

IO 多路复用是一种让一个线程同时监听多个连接或文件描述符的机制,当某个连接就绪时再去处理,从而提高高并发场景下的处理效率。


13.5 为什么 IO 多路复用适合高并发

标准回答

因为它可以让少量线程同时管理大量连接,避免为每个连接都创建一个线程阻塞等待,从而减少资源消耗并提升并发处理能力。


13.6 为什么 Redis、Nginx 常提到 IO 多路复用

标准回答

因为 Redis 和 Nginx 都需要在高并发场景下处理大量连接,而 IO 多路复用可以让少量线程高效地监听和处理这些连接,所以非常适合这类系统。


14. 本课最小记忆卡片

卡片 1

  • IO:输入输出
  • 常见是文件和网络

卡片 2

  • 阻塞 IO:线程一直等
  • 非阻塞 IO:没好就先返回

卡片 3

  • 同步 IO:调用方自己等
  • 异步 IO:系统完成后通知

卡片 4

  • IO 多路复用:一个线程监听多个连接

卡片 5

  • 谁就绪处理谁
  • 减少线程数量

卡片 6

  • Redis/Nginx 常用它来应对高并发连接

15. 课后练习

15.1 口头复述题

请你尝试不看讲义回答:

  1. 什么是 IO?
  2. 阻塞 IO 和非阻塞 IO 有什么区别?
  3. 同步 IO 和异步 IO 有什么区别?
  4. 什么是 IO 多路复用?
  5. 为什么 IO 多路复用适合高并发场景?
  6. 为什么 Redis、Nginx 常提到 IO 多路复用?

15.2 今日最低完成标准

如果今天时间不多,至少完成下面任务:

  1. 背会本课 6 张最小记忆卡片
  2. 能完整回答“什么是 IO 多路复用”
  3. 能说清阻塞/非阻塞、同步/异步的大致区别

16. 操作系统阶段小结

到这里,你操作系统面试最核心的四块内容已经基本串起来了:

  1. 进程和线程
  2. 同步、互斥与死锁
  3. 内存管理、虚拟内存与分页
  4. IO 模型与 IO 多路复用

使用社交账号登录

  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...