☰
操作系统学习笔记(一) 并发与并行、同步与异步,阻塞与非阻塞
2026/9/27 9:02:25 网站建设 项目流程

一、并发与并行

并发:多个任务在同一时间段内都被处理过,可能由一个执行单元轮流处理,也可能由多个执行单元同时完成。
并行:同一时刻有多个执行单元真正同时执行多个任务。

核心区别在与:同一刻时间是否真的有多件时间在被共同处理

并行一定是并发,并发不一定是并行
单个执行单元(线程/协程)同一时刻只能处理一个任务,但是可以通过轮流处理,使得多个任务并发地被处理

以下场景属于并发但不属于并行:

  • 一个线程内的多个协程处理多件不同的任务
  • 使用CPython解释器时处理纯计算任务时,同一进程内的多个线程处理不同的任务
  • 单核CPU机器中,多个线程共同执行多个计算任务

现实中的例子:

  • 并发:一个员工被委派了多个任务(任务一天干不完),其可以每天的上午干事件A,每天的下午干事件B,在员工的主管眼里,这两个事情每天都有进展,但是这个员工同一时刻显然内只能干一件事
  • 并行:多个员工被委派了一个大任务的不同子任务,同一时刻内(如果员工没在摸鱼)多个子任务是在被同时推进的

二、同步与异步

同步调用:调用方发起请求后,必须等到调用返回或结果可用,才能继续原来的后续逻辑。
异步调用:调用方发起请求后,不原地等待最终结果,而是立即返回,后续逻辑可以继续;最终结果在未来通过其他方式(回调、事件、Future/Promise、消息或轮询等)获取。

核心区别在与:是原地等待最终结果完成再接着干自己的活,还是立马继续干自己的活,不等待最终结果

现实中的例子:

  • 同步:线下购物,一手交钱一手交货,交完钱后拿到货前你一般不会跑去干别的事情
  • 异步:线上购物,先交钱,下发订单,货一段时间后快递到你家门口,货到之前你完全可以干别的,货到了有快递员通知你

三、阻塞与非阻塞

阻塞: 执行单元发起一个 I/O 调用,如果这个操作不能立即完成,调用不会返回,执行单元被挂起,直到 I/O 完成、出错或被中断。
非阻塞:执行单元发起一个 I/O 调用,无论操作有没有立即完成,调用立即返回。如果没就绪,就返回“暂时不可用”之类的状态,比如 EAGAIN。执行单元不会因为这次 I/O 调用被挂起。

核心区别在与:等待I/O的过程中执行单元是否挂起

同步与异步、阻塞与非阻塞的区别:

同步与异步侧重点在与:调用方如何拿到任务结果
阻塞和非阻塞重点在与:执行单元遇到需要等待的I/O操作时,是挂起还是不挂起

异步通常意味着“发起时非阻塞”,因为调用方可以立刻获得一个调用结果(非最终调用结果),但其不等于“整个过程都非阻塞”,因为在等待最终结果的过程中,为了节省计算资源,可以主动让执行单元挂起,;

组合发起时等待结果时例子
同步阻塞不返回挂起普通read()没数据 ,read()函数不立刻返回而是等到数据准备好后再返回,等待期间,执行单元挂起
同步非阻塞立即返回不挂起,自己轮询非阻塞read()+while重试,read()函数直接返回,但是返回的是"暂时不可用"或者"未准备好",执行单元不被挂起,而是一直轮询数据准备状况
异步非阻塞立即返回不挂起,等回调/事件io_uring+ 事件循环、Node.js 回调;调用io_uring后立刻返回,任务完成后通知执行单元
异步阻塞立即返回挂起等待完成异步I/O本身其实通常是非阻塞的,其中的阻塞大概率是因为程序员选择了让执行单元挂起;本质上是异步非阻塞的一种用发

现实例子:

以在银行办理业务为例:

  • 同步阻塞:站柜台前等业务员办理业务,但是由于需要的时间太久所以你直接在柜台上睡着了
  • 同步非阻塞:问一句“好了没”,没好人就走,过会儿再来问
  • 异步非阻塞:取号后去逛街,叫号通知你
  • 异步阻塞:取号后直接睡在大厅,等号好了叫你

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询