侧边栏壁纸
博主头像
牧云

怀璧慎显,博识谨言。

  • 累计撰写 149 篇文章
  • 累计创建 14 个标签
  • 累计收到 8 条评论

目 录CONTENT

文章目录

同步 vs 异步,阻塞 vs 非阻塞:别再混淆了!

秋之牧云
2026-04-09 / 0 评论 / 0 点赞 / 3 阅读 / 0 字

在学习编程、网络通信或操作系统时,我们经常会听到“同步”、“异步”、“阻塞”、“非阻塞”这些术语。它们看似相似,实则描述的是不同维度的概念。很多人容易混淆,甚至误以为“异步=非阻塞”、“同步=阻塞”。今天我们就来彻底厘清它们的区别,并通过生活中的例子帮助你直观理解。

一、核心概念:两个独立的维度

首先要明确一点:同步/异步阻塞/非阻塞 是两个正交(即相互独立)的概念,分别描述不同的行为特征:

  • 同步(Synchronous) vs 异步(Asynchronous)
    描述的是任务完成的通知机制

  • 同步:调用方必须主动等待或轮询结果。

  • 异步:调用方发起请求后可以继续做别的事,结果通过回调、事件、通知等方式自动送达

  • 阻塞(Blocking) vs 非阻塞(Non-blocking)
    描述的是调用是否立即返回

  • 阻塞:调用会挂起当前线程/进程,直到操作完成才返回。

  • 非阻塞:调用立即返回(无论操作是否完成),通常返回一个状态(如“进行中”或“未就绪”)。

✅ 关键点:同步/异步关注“如何得知结果”,阻塞/非阻塞关注“调用是否立刻返回”。

二、四种组合方式

基于上述两个维度,理论上可以有四种组合:

阻塞(Blocking)

非阻塞(Non-blocking)

同步(Sync)

同步阻塞

同步非阻塞

异步(Async)

❌(几乎不存在)

异步非阻塞

1. 同步阻塞(Synchronous Blocking)

例子:你在炉子旁烧水,眼睛盯着水壶,直到水开为止。期间你什么也干不了。

  • 调用发起后,线程被挂起,一直等待操作完成

  • 操作完成后,函数才返回结果。

  • 这是最常见的传统 I/O 方式(如 read()accept() 在默认模式下)。

2. 同步非阻塞(Synchronous Non-blocking)

例子:你把水烧上,然后去刷牙、叠被子,但每隔几秒就跑回来看一眼水开了没。

  • 调用立即返回,但返回的可能是“未就绪”状态。

  • 程序需要主动轮询(polling)检查操作是否完成。

  • 虽然不阻塞线程,但需要持续检查,可能浪费 CPU。

3. 异步非阻塞(Asynchronous Non-blocking)

例子:你烧水时设定了水开报警器。水一开,警报响起,你立刻知道,中间可以安心做别的事。

  • 调用立即返回,程序继续执行。

  • 操作完成后,系统主动通知你(通过回调、信号、事件等)。

  • 这是高性能服务器常用的模型(如 Linux 的 io_uring、Windows 的 IOCP)。

4. 异步阻塞?不存在!

很多人会问:“有没有异步阻塞?”
答案是:几乎没有实际意义,通常不被认为是一种有效组合

为什么?
因为“异步”的本质就是“不需要等待结果,由系统通知你”。如果你在发起异步操作后又主动阻塞等待结果,那就退化成了同步行为,失去了异步的意义。

🚫 所以:异步一定是非阻塞的

三、技术视角:Unix/Linux 中的 I/O 模型

在 Unix 系统中,这几种模型对应如下:

模型

同步/异步

阻塞/非阻塞

说明

阻塞 I/O

同步

阻塞

默认的 read() 行为

非阻塞 I/O

同步

非阻塞

设置 O_NONBLOCK,需轮询

I/O 多路复用(select/poll/epoll)

同步

阻塞(或非阻塞)

本质仍是同步,只是能同时监听多个 fd

信号驱动 I/O(SIGIO)

同步

非阻塞

通过信号通知可读/可写,但仍需主动读取

异步 I/O(AIO)

异步

非阻塞

内核完成全部 I/O 后通知用户

💡 注意:像 epoll 虽然高效,但它仍然是同步 I/O,因为你仍需在事件就绪后主动调用 read() 来获取数据。

四、常见误区澄清

  • ❌ “异步就是多线程”
    → 错!异步是一种编程模型,可以用单线程实现(如 Node.js、Python asyncio)。

  • ❌ “非阻塞就是异步”
    → 错!非阻塞 I/O 通常是同步的(需要轮询或事件触发后再读)。

  • ✅ 正确认知:
    异步 = 通知机制 + 非阻塞
    同步 = 主动获取结果(无论是否阻塞)

五、总结

类型

是否等待结果

是否立即返回

如何获知完成

同步阻塞

函数返回即完成

同步非阻塞

是(轮询)

主动检查状态

异步非阻塞

系统主动通知

记住这个口诀:

同步看你怎么拿结果,阻塞看你能不能马上走。
异步必是非阻塞,烧水报警最轻松。

0

评论区