线程与进程
进程:一个正在运行的程序。是程序的一次执行过程,是操作系统进行资源分配和调度的基本单位。每个进程拥有独立的内存空间(代码段、数据段、堆、栈)、文件描述符、信号处理等资源。
线程 :进程内部的一条执行路径(序列),是进程内的一个执行单元 ,是操作系统进行调度的最小单位。一个进程可以包含多个线程,所有线程共享进程的内存空间和资源(如文件描述符、全局变量),但每个线程有独立的栈和寄存器。
| 特性 | 进程(Process) | 线程(Thread) |
|---|---|---|
| 资源占用 | 独立内存空间(大)、独立文件描述符等 | 共享进程资源(内存、文件描述符等),仅私有栈和寄存器(小) |
| 创建 / 销毁开销 | 大(需分配内存、初始化资源) | 小(仅需创建栈和寄存器,共享进程资源) |
| 切换开销 | 大(需切换页表、刷新 TLB 等) | 小(仅切换栈和寄存器,共享内存空间) |
| 通信方式 | 复杂(需跨进程机制,如管道、信号量、共享内存) | 简单(直接读写共享内存中的全局变量) |
| 独立性 | 高(一个进程崩溃不影响其他进程) | 低(一个线程崩溃可能导致整个进程崩溃) |
| 并发粒度 | 粗(进程间并发) | 细(进程内线程间并发) |
| 调度单位 | 操作系统调度的基本单位 | 操作系统调度的最小单位 |
- 资源与内存
进程 :每个进程有独立的虚拟地址空间,进程间的内存是隔离的(如进程 A 无法直接访问进程 B 的内存)。例如,打开两个终端窗口运行
ls命令,会创建两个独立进程,各自占用独立内存。线程:同一进程的所有线程共享进程的虚拟地址空间(代码段、全局变量、堆等),但每个线程有自己的栈(用于函数调用和局部变量)和寄存器(记录当前执行状态)。例如,浏览器的 "多标签页" 通常由同一进程的多个线程实现,共享浏览器的内存资源。
- 开销与效率
进程:创建 / 销毁时需操作系统分配 / 释放内存、文件描述符等资源,开销较大(毫秒级);进程切换时需保存整个进程的状态(内存映射、文件句柄等),切换成本高。
线程:创建 / 销毁仅需分配 / 释放线程栈和寄存器,开销小(微秒级);线程切换只需保存线程私有状态(栈、寄存器),切换成本低,适合高频并发场景。
单进程单线程:单进程单线程指程序仅包含一个进程,且该进程内仅运行一个线程,所有任务串行执行,是最基础的程序架构。
单进程多线程:单进程多线程指程序包含一个进程,且该进程内运行多个线程,线程共享进程的内存资源(代码段、数据段、堆),但拥有独立的线程栈,可并行执行任务。
| 对比维度 | 单进程单线程 | 单进程多线程 |
|---|---|---|
| CPU 利用 | 仅用一个核心,多核性能无法发挥 | 可利用多核,并行处理提升效率 |
| 资源共享 | 无线程间共享问题(仅一个线程) | 共享进程资源,需锁保护共享数据 |
| 调度成本 | 无线程切换开销,调度效率高 | 存在线程切换开销,频繁切换影响性能 |
| 并发能力 | 串行执行,无并发能力 | 支持并行并发,可处理多任务 |
| 故障容忍 | 单线程崩溃→进程终止 | 单线程崩溃→进程终止(与单线程一致) |
| 开发复杂度 | 逻辑简单,无需处理线程同步 | 需处理线程同步(锁、信号量),避免数据竞争 |
| 资源占用 | 进程资源 + 1 个线程栈,总占用少 | 进程资源 + 多个线程栈,总占用略高 |

内核级线程
用户级线程:用户创建管理,开销小,可以很多,并发
内核级线程:内核用创建管理,开销大,分配在两个处理器,并行
组合模式:(多对多线程模型)是对用户级线程和内核级线程的优化整合
以用户级线程应对 "大量线程" 和 "低开销" 需求,解决内核级线程数量有限、开销高的问题;
以内核级线程应对 "多核并行" 和 "阻塞处理" 需求,解决用户级线程无法利用多核、一阻全阻的问题;
通过线程库实现两层线程的动态映射和调度,成为现代多核环境下高并发、高性能程序的主流线程模型。
| 特性 | 用户级线程(ULT) | 内核级线程(KLT) | 组合模式(多对多) |
|---|---|---|---|
| 管理主体 | 用户线程库(用户态) | 操作系统内核(内核态) | 线程库(用户态)+ 内核(内核态) |
| 映射关系 | 多对一(多个 ULT 映射 1 个 KLT) | 一对一(1 个 KLT 映射 1 个 ULT) | 多对多(多个 ULT 映射少量 KLT) |
| 上下文切换开销 | 低(用户态切换,无需内核干预) | 高(内核态切换,需保存内核上下文) | 低(ULT 切换在用户态,KLT 切换少) |
| 并行能力 | 差(多个 ULT 共享 1 个 KLT,无法利用多核) | 好(1 个 KLT 对应 1 个 CPU 核心,支持多核并行) | 好(KLT 数量匹配 CPU 核心,支持并行) |
| 阻塞处理 | 差(1 个 ULT 阻塞,整个 KLT 阻塞) | 好(1 个 KLT 阻塞,不影响其他 KLT) | 好(ULT 阻塞时,线程库切换其他 ULT 到 KLT) |
| 线程数量上限 | 高(可创建数千个,开销小) | 低(创建过多会消耗大量内核资源) | 高(基于 ULT 扩展,数量无明显限制) |
