前言

进程和线程是操作系统中非常核心的概念,也是面试高频考点。很多人容易混淆两者。简单来说:进程是资源分配的最小单位,线程是CPU调度的最小单位。本文结合操作系统底层原理,梳理进程、线程的概念、联系、区别,以及优缺点与使用场景。

前置知识回顾

  1. 进程:操作系统对运行中程序的抽象,程序的一次运行实例。操作系统以进程为单位分配内存、文件句柄等系统资源。
  2. PCB(进程控制块):操作系统管理进程的数据结构,记录PID、内存映射、打开文件、信号、进程状态等信息。
  3. 进程调度:单核CPU依靠时间片轮转,切换不同进程,实现宏观并发;进程切换需要做完整上下文切换,开销较大。

一、什么是线程

线程(Thread),也叫轻量级进程。
一个进程内部可以拥有多个线程,这些线程共享该进程的绝大部分资源,每个线程拥有自己独立的:

  • 线程ID
  • 程序计数器PC
  • 一组寄存器
  • 栈(栈内存,保存局部变量、函数调用栈)

同一个进程内所有线程共享:

  • 进程的地址空间(堆、全局变量、代码段)
  • 文件描述符、打开的文件
  • 信号处理、权限、内存资源

形象理解:
进程 = 一个工厂;
线程 = 工厂里面的工人;
整个工厂资源(车间、设备、仓库)所有工人共享;每个工人有自己独立工作台(线程栈、寄存器);工人(线程)被CPU调度干活。

二、进程与线程的联系

  1. 线程依附于进程存在:线程不能独立存在,线程必须属于某一个进程。进程消亡,内部所有线程也全部销毁。
  2. 一个进程至少包含1个线程(主线程),程序启动时操作系统默认创建主线程。
  3. 调度单位是线程:CPU调度器实际调度对象是线程,不是进程;进程只是资源容器。
  4. 同一进程下多个线程之间通信非常方便,直接读写共享的全局内存;进程之间天然隔离,通信必须依靠IPC(管道、共享内存、信号、网络等)。
  5. 不管是进程还是线程,都有自己状态:就绪、运行、阻塞,都会参与CPU调度。

三、进程与线程核心区别

对比维度进程(Process)线程(Thread)
资源关系资源分配最小单位,每个进程拥有独立完整资源共享所属进程资源,仅有少量私有资源,CPU调度最小单位
内存地址空间进程之间地址空间完全隔离,互不感知同一进程内所有线程共享同一个地址空间
切换开销进程切换:需要切换页表,刷新缓存,保存完整进程上下文,开销大线程切换:只切换线程私有寄存器、栈,不用切换地址空间,开销小
通信方式进程间通信IPC:管道、共享内存、信号、Socket、文件等,复杂直接读写进程内共享内存,简单,但需要处理线程安全、锁竞争
生命周期影响一个进程崩溃,不会影响其他进程一个线程崩溃,会导致整个所属进程直接崩溃,所有线程一起结束
数据共享数据默认隔离,共享成本高数据天然共享,共享成本低,会带来竞态条件问题
创建销毁创建、销毁进程开销大创建、销毁线程开销更小

四、多进程与多线程优缺点

多进程模型

优点:

  1. 强隔离,一个进程出错崩溃,不干扰其他进程,稳定性高。
  2. 可以充分利用多核CPU,每个进程可以跑在不同CPU核心。

缺点:

  1. 创建、切换开销大,占用内存高。
  2. 进程之间数据共享麻烦,IPC编程复杂。

例子:Nginx多进程模式,Chrome浏览器每个标签页一个进程。

多线程模型

优点:

  1. 切换成本低,并发性能好。
  2. 共享内存,线程之间传递数据简单高效。

缺点:

  1. 线程之间没有隔离,任意一个线程崩溃,整个进程挂掉。
  2. 共享资源会产生竞态条件,需要锁机制保证线程安全,容易出现死锁。

例子:Java程序,整个JVM是一个进程,内部靠多线程处理任务。

五、常见误区澄清

  1. 误区:多线程一定比多进程快

真相:线程切换开销小,但大量锁竞争、上下文频繁切换也会性能很差;多进程隔离好,适合高稳定性场景,要根据业务选择。

  1. 误区:多核CPU上进程才可以并行,线程不能并行

真相:多核CPU上,同一个进程的多个线程可以分配到不同CPU核心,实现真正并行执行。

  1. 误区:线程越多性能越高

真相:线程数量过多,大量时间消耗在线程切换,性能反而下降。

六、总结

  1. 进程:资源分配的最小单位;线程:CPU调度的最小单位。
  2. 线程寄生在进程内部;一个进程至少有一个主线程。
  3. 进程间内存隔离,通信依赖IPC;同进程线程共享地址空间,通信简单,但要处理线程安全。
  4. 进程切换开销大,隔离性强;线程切换开销小,但没有隔离,单线程异常会毁掉整个进程。
  5. 多进程适合追求稳定性场景;多线程适合IO密集、需要大量数据共享的并发场景。
Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐