不存在“bionionioaio”这一标准io模型,它是将linux五种io模型英文首字母错误拼凑的伪概念;真实模型为阻塞、非阻塞、io多路复用、信号驱动和异步io,其中信号驱动极少使用,工程中主流为前四种及现代io_uring。

没有“BIONIONIOAIO”这种标准IO模型——这是把 Linux 五种 IO 模型(阻塞、非阻塞、IO 多路复用、信号驱动、异步)的英文缩写(Blocking / Non-blocking / IO Multiplexing / Signal-driven / Asynchronous)胡乱拼凑出来的假概念,常见于二手面试题或错误笔记。
为什么搜 select epoll 却跳出 BIONIONIOAIO?
这是关键词污染:有人把 Blocking、Non-blocking、IO、Multiplexing、Asynchronous 首字母强行连写,再加个 IO 往里塞,凑出“BIONIONIOAIO”这种无意义字符串。搜索引擎抓到碎片词就匹配,结果推给你一堆误导内容。
- 真实技术文档、man 手册、POSIX 标准、Linux 内核源码里,**从不出现这个串**
- 面试中若被问及,优先确认对方是否指代
select/poll/epoll(IO 多路复用),还是io_uring(现代异步 IO) - 查资料时直接搜
linux io model comparison或具体函数名,比如man 2 read,比搜这个乱码靠谱得多
点餐类比只适用于四种主流模型(不含 Signal-driven)
用餐厅点餐比喻 IO 模型,本质是讲「调用方如何等待数据就绪」。Signal-driven(sigio)因实现复杂、使用极少,几乎所有教材和工程实践都跳过它——别为凑“五种”硬加一个。
-
Blocking IO:点完单坐等服务员上菜,期间干不了别的事 -
Non-blocking IO:点完单自己隔几秒去柜台问“好了吗?”,服务员答“没好”,你继续刷手机;反复轮询 -
IO Multiplexing(select/poll/epoll):你告诉领班“哪桌菜好了喊我”,然后坐下等,有菜来才起身——一个线程管多个连接 -
Asynchronous IO(io_uring或 POSIXaio_read):你下单后直接回家睡觉,厨房做好了自动送到你家门——内核全程接管,回调或完成队列通知
epoll 和 io_uring 不是同一层东西,别混着比
很多人拿 epoll 对比 “AIO”,但这是跨层比较:epoll 解决的是「多连接事件通知」,仍是同步接口(read 还是要你自己调);而 io_uring 是真正的异步接口(提交读请求后,内核在后台完成,再发完成事件)。
-
epoll_wait返回后,你还得调read——这一步仍可能阻塞(除非 socket 设了O_NONBLOCK) -
io_uring提交IORING_OP_READ后,你完全不用管,等io_uring_cqe就行 - glibc 的
aio_read表面异步,底层常是线程池模拟,不是真内核异步——别被名字骗了
真正容易被忽略的点是:所谓“异步”,必须看数据拷贝是否由内核完成。只要你的代码里还出现 read(fd, buf, size) 这种调用,就不是真正的异步 IO。










