706 字
4 分钟
阻塞、非阻塞、同步、异步 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:数据未就绪时 read 等待;数据到达后,通常还要完成拷贝才返回。非阻塞 I/O:数据未就绪时立刻返回暂不可用,应用可做别的事,但需再次尝试或等待通知;不断空轮询会浪费 CPU。I/O 多路复用(select/poll/epoll)等待多个描述符的就绪状态,收到可读通知后应用仍调用 read 取数据,因此通常属于同步 I/O 的就绪通知模式。

异步 I/O则是应用提交读写请求后继续执行,由内核或运行时推进操作,在完成后通知应用并提供结果。真正异步语义依具体 API、文件系统、设备与运行时实现;线程池包装也能让调用方不阻塞,但底层可能仍是工作线程阻塞等待。信号驱动 I/O 常在状态变化时通知就绪,随后仍由应用执行读写,也不能仅因“异步通知”就认定数据拷贝已完成。

网络面试中还要注意:就绪只表示现在可以尝试读写,不保证一条应用消息已完整到齐;TCP 是字节流,read 可能只返回部分数据。异步提交后则需遵守缓冲区生命周期、取消与错误处理规则。架构选择要看并发量、连接活跃度、内存和状态管理成本,而不是只比较名词。

常见追问#

Q:非阻塞 I/O 是异步 I/O 吗?
A:不是。非阻塞未就绪时及时返回,后续仍由应用再次读写;异步 I/O 通常由系统/运行时完成已提交操作,再给出完成通知。

Q:epoll 报告可读后,数据已经复制到用户态了吗?
A:没有。它报告就绪,应用仍要调用 read/recv,读取过程才把数据交给用户缓冲区。

Q:阻塞/非阻塞与同步/异步是同一条分类轴吗?
A:不是。前者描述调用等待时线程的行为,后者描述 I/O 完成与应用责任;非阻塞轮询仍可属于同步 I/O。

Q:异步调用返回成功意味着读完了吗?
A:通常只表示请求已成功提交;要等完成事件并检查实际字节数、错误状态,才能判断操作结果。

阻塞、非阻塞、同步、异步 I/O 怎么区分
https://blog.xqcherry.top/posts/interview/operating-system/io-blocking-nonblocking-sync-async/
作者
xqcherry
发布于
2026-10-12
许可协议
CC BY-NC-SA 4.0