进程、线程、协程

进程(Process)

  • 操作系统为程序分配资源(CPU、内存、文件句柄等)的最小单位。每个进程都有独立的地址空间(代码段、数据段、堆栈),进程间完全隔离,互不干扰。

特点:

  • 资源独立:进程有自己的内存空间,一个进程崩溃不会影响其他进程(隔离性强);
  • 调度方式:由操作系统内核(进程调度器)负责调度,采用「抢占式调度」(OS 强制分配 CPU 时间片);
  • 切换成本高:上下文切换需保存 / 恢复整个进程的状态(地址空间、寄存器、PCB 等),耗时毫秒级;
  • 通信复杂:进程间无法直接访问对方内存,需通过「IPC(进程间通信)」机制:管道、消息队列、共享内存、Socket 等。

线程(Thread)

  • 操作系统CPU 调度和执行的最小单位,隶属于进程,共享所属进程的所有资源(内存、文件句柄等)。

特点:

  • 资源共享:同一进程下的线程共享进程地址空间,无需 IPC,直接读写共享变量(通信简单);
  • 独立部分:每个线程有自己的栈(保存函数调用栈)和程序计数器(PC,记录下一条执行指令);
  • 调度方式:由操作系统内核(线程调度器)负责,同样是「抢占式调度」;
  • 切换成本中等:上下文切换无需切换地址空间,仅需保存 / 恢复线程的栈和 PC,耗时微秒级(比进程快 10-100 倍);
  • 同步需求:线程间共享资源可能导致「竞态条件」(比如两个线程同时修改一个变量),需通过锁(互斥锁、条件变量)、信号量等同步机制解决。

协程(Coroutine)

  • 用户态的轻量级线程(又称 “微线程”),不由操作系统调度,而是由程序(用户态调度器)主动控制切换,本质是 “协作式调度”。

特点

  • 依附线程:协程必须运行在单个线程中,共享该线程的资源(无法直接利用多 CPU);
  • 调度方式:用户态主动调度(协作式),通过 yield(Python2)、await(Python3)等关键字主动让出 CPU,切换到其他协程;
  • 切换成本极低:无需陷入内核态,仅切换用户态的栈、PC 和寄存器,耗时纳秒级(是线程的 1/1000 甚至更低);
  • 依赖支持:需语言或框架原生支持(如 Python 的asyncio、Go 的goroutine、C++ 的boost.coroutine);
  • 无锁并发:同一线程内的协程切换不会有竞态条件(单线程串行执行),无需加锁。
例如:Python 中用 async def 定义的协程函数,通过 asyncio.run() 启动;

核心概念总览

单元 本质定位 核心特点
进程 操作系统资源分配的最小单位 独立资源、隔离性强、切换成本高
线程 操作系统CPU 调度的最小单位 共享进程资源、切换成本中等
协程 用户态轻量级线程 共享线程资源、切换成本极低

三者的层级关系
进程(资源容器) → 包含多个线程(CPU调度单元) → 每个线程包含多个协程(用户态轻量执行单元)

  • 资源占用:进程 > 线程 > 协程;
  • 切换成本:进程 > 线程 > 协程;
  • 并发能力:协程 > 线程 > 进程;
  • 隔离性:进程 > 线程 = 协程(线程 / 协程无隔离)

常见误区:

  1. “协程比线程快” 是错的?
    不是 “执行速度快”,而是 “切换成本低”。协程的执行速度和线程一致(都是 CPU 执行指令),但高并发场景下,协程因切换成本低,整体吞吐量远高于线程。
  2. 多线程一定比多进程好?
    不一定。线程共享资源需处理同步问题(锁、死锁风险),且受 GIL(如 Python)限制,CPU 密集型任务中多线程无法并行,此时多进程更优。
  3. 协程可以利用多 CPU 吗?
    不能直接利用。协程运行在单个线程中,若要利用多核,需配合多进程(如每个 CPU 核心启动一个进程,每个进程内运行多个协程)。Go 的goroutine例外(runtime 自动调度到多线程)。
  4. 进程间通信一定比线程间复杂?
    是的。进程隔离导致无法直接访问内存,需通过IPC机制,而线程可直接读写共享变量(但需同步)。

总结:

  1. 进程是“资源容器”,负责隔离和分配资源;
  2. 线程是“CPU 调度单元”,负责执行任务;
  3. 协程是“用户态轻量线程”,负责高效处理高并发IO。
    选择的核心原则:
  4. CPU 密集型 → 多进程;
  5. IO 密集型(高并发) → 协程(或协程 + 多进程)。

注意:

  • 只有python这门语言(除了c),才会让我们开启进程,其他像java,go 一般都不开启进程
  • python中为什么开进程?
    -- 因为cpython解释器,不能利用多核优势--->不能利用多核优势的原因在gil锁
    -- 其他语言中开启多线程,如果是多核cpu,能实现并行效果,肯定并发
    -- 其他语言开启多线程,就能利用多核优势
posted @ 2025-11-09 21:29  我会替风去  阅读(7)  评论(0)    收藏  举报