613 字
3 分钟
什么是异步 I/O?它和非阻塞、多路复用的区别
异步 I/O 的核心是:应用提交一次 I/O 操作后可以继续做其他工作,由系统或运行时推进该操作,并在操作完成时提供完成事件或结果。提交成功只表示请求被接受,不代表数据已经读完;应用需在完成通知到达后检查实际字节数、错误码和剩余工作。
它与非阻塞 I/O 的区别在于关注点不同。非阻塞调用在当前无法完成时立即返回,应用通常要再次调用或等待就绪;异步接口则把操作交给执行方,应用等待“完成”通知。多路复用一般通知“可读/可写”,之后应用执行 read/write;因此它属于就绪通知模式,而不是完成通知模式。
实际系统中“异步”一词可能泛指不同实现:内核原生异步、事件循环、运行时线程池封装等。线程池异步可以避免调用者线程被阻塞,但底层操作仍可能占用工作线程等待;网络设备、文件系统和接口版本也会影响是否真正由内核异步完成。需要根据具体 API 的语义判断,不能只看函数名带 async。
异步模型的好处是让少量线程管理大量等待中的工作,代价是状态机、取消、超时、错误传播和对象生命周期更复杂。提交后若缓冲区需要保持有效,应用不能提前释放或复用;取消也可能与完成竞态,需按接口约定处理。
常见追问
Q:异步 I/O 是不是不用等待?
A:调用方不用同步阻塞等待完成,但系统仍需等待设备或网络事件;应用通过事件循环或完成队列在之后处理结果。
Q:epoll 是异步 I/O 吗?
A:通常将 epoll 归为 I/O 多路复用的就绪通知接口。它通知描述符就绪,应用仍发起读写;这与提交读请求后收到完成结果的异步操作不同。
Q:线程池实现的异步有没有价值?
A:有,它可把阻塞等待移出调用者线程,改善应用并发结构;但线程池容量、排队和底层线程占用仍需管理,不能当作零成本内核异步。
什么是异步 I/O?它和非阻塞、多路复用的区别
https://blog.xqcherry.top/posts/interview/operating-system/asynchronous-io/ 目录