进程/线程

进程(Process)和线程(Thread)是操作系统中最基本的执行单元,核心区别在于:进程是资源分配的基本单位,线程是 CPU 调度的基本单位。简单说,进程管“内存、文件、资源”,线程管“跑代码”。

一、进程(Process)

  • 定义:一个正在运行的程序实例,拥有独立的内存空间(代码段、数据段、堆、栈)。
  • 特点
    • 独立地址空间,进程间互不干扰,一个进程崩溃不会影响其他进程
    • 创建/销毁/切换开销大(要分配内存、页表等)。
    • 进程间通信(IPC)需借助管道、消息队列、共享内存、Socket 等机制。
  • 类比:一间独立的工厂,有自己的地皮、仓库、水电。

二、线程(Thread)

  • 定义:进程内的一个执行流,是 CPU 调度的最小单位。同一进程的线程共享该进程的内存和资源
  • 特点
    • 共享进程的地址空间(代码、全局变量、堆),但各有独立的栈和寄存器
    • 创建/切换开销小,通信方便(直接读共享变量,但要加锁防竞态)。
    • 一个线程崩溃(如段错误)可能导致整个进程挂掉。
  • 类比:工厂里的工人,共享工厂的地皮和设备,各自干不同的活。

三、核心对比

维度 进程 线程
资源归属 资源分配基本单位 不独占资源,共享所属进程
地址空间 独立 共享进程空间
调度单位 不是(内核调度进程,再选线程) 是(CPU 调度线程)
开销
通信 IPC 复杂 直接共享内存,需同步
隔离性 强,互不影响 弱,一损俱损
典型数量 几十~几百 成百上千

四、为什么要有线程

单进程里想同时做多件事(比如边下载边渲染界面),早期只能开多进程,但太重。线程让**“在一个地址空间内并发执行多个任务”**成为可能,既保留并发能力,又把切换成本降下来。

五、常见变体

  • 协程(Coroutine):用户态轻量级线程,由程序自己调度,不进内核,切换成本极低(如 Go 的 goroutine、Python asyncio)。
  • 纤程(Fiber):Windows 下的用户态线程概念,类似协程。
  • 多线程模型
    • 1:1(一个用户线程对应一个内核线程,Linux pthread 默认)—— 真并行,但创建有上限。
    • N:1(N 个用户线程对应 1 个内核线程)—— 切换快,但一个阻塞全阻。
    • N:M(Go 运行时采用)—— 兼顾并行与开销。
上一篇
下一篇