Skip to content

进程线程和协程的区别是什么

进程 (Process)

  • 定义: 进程是计算机中已运行程序的实体。它是操作系统进行资源分配和调度的基本单位。程序是静态的指令集合,而进程是程序的一次动态执行过程。
  • 特征:
    • 独立性: 每个进程都有自己独立的地址空间,包括文本区域(程序代码)、数据区域(变量和数据)等,进程之间彼此隔离。
    • 动态性: 进程是临时的,有生命周期的,是动态产生和消亡的。
    • 并发性: 任何进程都可以与其他进程并发执行。
    • 资源拥有: 进程是系统分配资源(如CPU时间、内存、文件和I/O设备)的基本单位。
  • 切换开销: 进程间的切换涉及系统为之分配或回收资源(如内存空间、I/O设备),开销远大于线程切换。进程切换由操作系统决定,用户无感知.

线程 (Thread)

  • 定义: 线程是进程中的一个执行单元,是CPU调度和分派的基本单位。它是进程内可调度的实体。一个进程中至少有一个线程,也可以有多个线程。
  • 特征:
    • 轻量级: 线程的创建与撤销、线程之间的切换所占用的资源比进程少很多。
    • 共享资源: 线程基本不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器、一组寄存器和栈),但它可与同一进程的其他线程共享进程所拥有的全部资源,包括内存地址空间。
    • 并发执行: 同一个进程中的多个线程之间可以并发执行。
    • 调度: 线程是系统(处理器)调度的基本单位。线程的调度是抢占式的,由操作系统决定。
  • 切换开销: 线程切换涉及用户态现场(上下文、寄存器、用户栈等)的保存和恢复,并可能涉及内核态和用户态的切换,开销比协程大。

协程 (Coroutine)

  • 定义: 协程(Coroutine)是计算机程序的一类组件,推广了协作式多任务的子例程,允许执行被挂起与被恢复。它是一种用户态的轻量级线程,也被称为微线程或纤程。
  • 特征:
    • 用户态调度: 协程的调度完全由用户控制,在用户态执行。这意味着协程之间的切换不需要涉及任何系统调用或内核态切换,性能开销相较于线程更小。
    • 协作式: 协程是协作式的任务,意味着它们需要显式地将控制权交给其他协程(通过 yield 等机制),而不是由操作系统抢占式调度。
    • 轻量级: 每个协程的体积比线程要小得多,一个线程可以容纳数量相当可观的协程。
    • 上下文保存: 协程拥有自己的寄存器上下文和栈。当协程调度切换时,可以直接保存当前协程的状态,然后直接恢复另一个协程的状态。
    • 并发而非并行: 协程提供并发性(看上去是同时执行,实际为交替执行)而非并行性。一个线程可以有多个协程。
    • 无锁: 由于协程是在单线程内协作执行,不需要多线程的锁机制,可以不加锁地访问全局变量,从而提高执行效率。
  • 适用场景: 协程特别适合于用来实现彼此熟悉的程序组件,如协作式多任务、异常处理、事件循环、迭代器、无限列表和管道。在 I/O 密集型任务中,协程的性能优势尤为明显。
特性 进程 (Process) 线程 (Thread) 协程 (Coroutine)
资源 操作系统资源分配的基本单位,拥有独立的地址空间和资源。 共享进程的地址空间和资源,只拥有少量必需资源。 共享所在线程的资源,拥有自己的寄存器上下文和栈。
调度 操作系统调度,抢占式调度。 操作系统调度,抢占式调度。 用户(程序)调度,协作式调度。
开销 创建、销毁、切换开销最大。 创建、销毁、切换开销中等。 创建、销毁、切换开销最小。
独立性 独立性强,进程间互相隔离。 依赖于进程,同进程内线程共享资源。 依赖于线程,协程之间协作。
并发/并行 既可并发也可并行。 既可并发也可并行。 并发(宏观上),但单线程内是协作式交替执行,非并行。
通信 主要通过 IPC 机制(如管道、消息队列)。 通过共享内存、锁等机制。 在单线程内直接共享变量,无需锁机制。
数量 数量有限,开销大。 数量比进程多,但仍有一定开销。 数量可观,开销极小。