直接回答:以 Unix 的五种 IO 模型看:阻塞 IO——调用后不拿到数据不返回,线程一直挂起;非阻塞 IO——没数据立即返回错误码,需轮询重试;IO 多路复用——用一个调用(select/epoll)监视多个 fd,谁就绪处理谁,单个 IO 操作本身仍是阻塞的;信号驱动 IO——内核就绪后发信号通知;异步 IO——告知内核完成整个操作(含数据拷贝到用户缓冲),完成后通知,期间线程完全自由。
展开解析:区分两组概念:阻塞/非阻塞看调用是否等待(线程是否挂起);同步/异步看数据从内核拷到用户空间这一步由谁完成——同步 IO 要求调用者参与数据搬移(前四种都同步,包括多路复用),异步 IO 由内核全程代办(如 Linux 的 io_uring、Windows IOCP)。常见误区是把"非阻塞"当"异步":非阻塞 read 只是立即返回,数据拷贝仍要自己发起。工程上高并发主流是"非阻塞 IO + epoll/kqueue"的 Reactor 模式(Nginx、Netty),追问方向:Reactor 与 Proactor 区别、io_uring 相对 epoll 的改进。