Linux 的五种 IO模型
1. 阻塞 I/O(Blocking I/O)
- 解释:程序发起 I/O 操作后,会一直等待操作完成,直到数据准备好才能继续执行其他任务。
- 举例:你去奶茶店买奶茶,点单后直接站在柜台前等,直到奶茶做好、拿到手,才能离开。
2. 非阻塞 I/O(Non-blocking I/O)
- 解释:程序发起 I/O 操作后,立即返回,哪怕数据还没准备好。程序需要不断轮询检查数据是否准备好了。
- 举例:你去奶茶店点单后,发现奶茶还没好,就先去逛一会儿,然后再回来问好了没。你多次重复这个过程,直到奶茶做好。
3. 多路复用 I/O(I/O Multiplexing)
- 解释:程序同时监视多个 I/O 操作,一旦其中一个操作准备好,程序就处理该操作。
- 举例:你和朋友们一起去奶茶店,每个人点了不同的奶茶。你们坐在旁边等候,当服务员叫出某一杯奶茶的取号码时,作为请客的你会统一去拿所有已完成的奶茶。这样,大家都不需要来回跑动,统一由你一个人处理。
4. 信号驱动 I/O(Signal-driven I/O)
- 解释:程序为 I/O 操作设置信号处理器,当数据准备好时,操作系统会发送信号通知程序,然后程序再去处理这个数据。
- 举例:你点完奶茶后,服务员让你留下手机号,奶茶做好后微信小程序或发短信通知你。你离开奶茶店去做其他事情,收到小程序推送或看到短信后再回来拿奶茶。
5. 异步 I/O(Asynchronous I/O)
- 解释:程序发起 I/O 操作后,不等待数据准备,继续执行其他任务。I/O 操作完成后,操作系统会自动将数据传递给程序,程序接收到结果时直接处理。
- 举例:你在奶茶隔壁开了炸鸡店,你和奶茶家店员特别熟悉,你上奶茶店点完奶茶后,等待店员奶茶直接送到你家,然后你继续去做自己的事。奶茶做好后,店员会把奶茶送到你家,你收到奶茶时直接享用。