613 字
3 分钟
什么是异步 I/O?它和非阻塞、多路复用的区别
  1. 1操作系统面试学习路线与知识地图
  2. 2什么是用户态和内核态
  3. 3什么是系统调用?它和普通函数调用有什么区别
  4. 4进程和线程有什么区别
  5. 5进程的五种状态:新建、就绪、运行、阻塞与终止
  6. 6fork、exec 和 wait 分别做什么
  7. 7什么是竞态条件和临界区?如何保证互斥
  8. 8互斥锁和自旋锁有什么区别?分别适合什么场景
  9. 9死锁的四个必要条件是什么?如何逐个预防
  10. 10缺页异常如何处理?虚拟内存不等于 Swap
  11. 11阻塞、非阻塞、同步、异步 I/O 怎么区分
  12. 12抢占式调度是什么?SJF 和 MLFQ 适合什么假设
  13. 13进程间通信如何选择?管道、共享内存、信号和 Socket
  14. 14线程切换时,操作系统要做哪些操作
  15. 15进程上下文切换要保存什么?为什么有开销
  16. 16死锁是什么?如何预防和避免死锁?
  17. 17银行家算法如何避免死锁?死锁检测后怎样恢复
  18. 18活锁、饥饿和死锁有什么区别
  19. 19进程调度算法:FCFS、SJF、优先级、时间片轮转与多级反馈队列
  20. 20调度指标有哪些?什么是优先级反转
  21. 21为什么要有虚拟内存
  22. 22TLB、多级页表和虚拟地址转换是怎么工作的
  23. 23什么是分段,什么是分页
  24. 24页面置换算法有哪些?FIFO、LRU 和 Clock
  25. 25信号量是什么?计数信号量和二元信号量怎么用
  26. 26条件变量是什么?为什么要和互斥锁配合使用
  27. 27进程间通信方式:管道、消息队列、共享内存、信号量与套接字
  28. 28I/O 模型有哪些:阻塞、非阻塞与多路复用
  29. 29select、poll 和 epoll 有什么区别
  30. 30epoll 的 LT 和 ET 模式有什么区别
  31. 31什么是异步 I/O?它和非阻塞、多路复用的区别本文
  32. 32什么是僵尸进程和孤儿进程?如何处理
  33. 33原子操作是什么?原子性、可见性和有序性有什么区别
  34. 34什么是工作集和抖动?内存不足时为何系统变慢
  35. 35mmap 是什么?文件映射和匿名映射怎么理解
  36. 36什么是写时复制?fork 和私有映射如何利用 COW

异步 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/
作者
xqcherry
发布于
2026-10-12
许可协议
CC BY-NC-SA 4.0