一文读懂进程与线程:操作系统最核心的两个基础概念
导语进程与线程是操作系统最基础、也是面试高频考察的核心知识点。很多初学者容易混淆二者:分不清资源分配与 CPU 调度的区别,搞不懂并发和并行,也不理解为什么多线程开销更小,但稳定性会更差。
本文结合通俗生活化比喻,同时兼顾技术定义,讲清楚进程、线程的组成、特性,区分并发与并行,梳理二者通信、切换、故障的差异,最后附对比表格与真实业务场景,适合编程初学者、后端 / 前端开发求职者阅读。
一、什么是进程:操作系统的资源容器
程序是保存在硬盘上的静态文件(.exe、可执行二进制文件)。进程是程序被加载到内存之后,正在运行的动态实例。
通俗比喻:进程就像一家独立工厂。
[*]厂房 = 内存空间
[*]机器设备 = CPU、文件句柄、网络资源
[*]生产手册 = 程序代码
技术定义
进程是操作系统资源分配的基本单位。操作系统以进程为单位分配内存、文件描述符、寄存器等全套软硬件资源。每一个进程拥有完全独立的虚拟内存地址空间,进程之间内存互相隔离,不能随意互相读写对方的数据。
进程内部由 PCB(进程控制块)、代码段、数据段、堆、栈构成:
[*]PCB 进程控制块:进程的身份档案,记录 PID 进程 ID、运行状态(就绪、运行、阻塞、终止)、内存映射、寄存器现场,操作系统依靠 PCB 完成对进程的全部管理。
[*]代码段:存放程序的指令。
[*]数据段:存放全局、静态变量。
[*]堆:程序运行时动态申请的内存。
[*]栈:保存函数调用、局部变量。
进程三大核心特性
[*]独立性:每个进程地址空间相互隔离。微信进程不能直接读写浏览器进程内存。如果进程之间需要交换数据,必须使用IPC 进程间通信:管道、消息队列、共享内存、Socket 套接字等机制,不能直接访问对方内存。
[*]动态生命周期:进程拥有完整生命周期:创建 → 就绪 → 运行 → 阻塞(等待 IO、网络)→ 终止。例如浏览器等待网页下载时,进程进入阻塞,CPU 会切换执行别的程序;下载完成重新回到就绪队列;关闭软件则进程终止。
[*]并发性:操作系统同时管理大量进程。
[*]并发(单核 CPU):CPU 采用时间片轮转,极快速度在多个进程之间来回切换,给用户 “同时运行” 的错觉;
[*]并行(多核 CPU):多个进程在不同 CPU 核心真正同时执行。
重点区分:并发是快速切换 “看起来同时跑”;并行是物理上同一时刻多核真正一起跑,面试高频考点。
二、什么是线程:进程内部真正干活的执行单元
通俗比喻:线程就是工厂里面的工人。一家工厂(进程)至少要有一名工人(主线程);可以同时雇佣多名工人协同干活。工厂的厂房、机器设备所有工人共享;但每个工人拥有自己独立工具箱。
线程是 CPU 调度的最小执行单元,隶属于进程。CPU 时间片分配的对象是线程,而不是进程稀土掘金。
同一个进程内部全部线程,共享进程的代码段、全局数据、堆内存、打开的文件、网络句柄;但是每一条线程拥有自己独立:TID 线程 ID、程序计数器 PC、线程栈、寄存器上下文,用来保存自己函数局部变量与调用现场。
线程两大核心特点
[*]轻量、切换开销低创建、销毁线程只需要分配线程栈,不需要重新分配整套内存资源;线程上下文切换只需要保存寄存器、栈现场,不用切换虚拟内存地址空间。线程切换开销比进程低一个数量级。
[*]资源共享带来竞争风险同一个进程多个线程可以直接读写共享内存,通信非常方便;但多线程同时修改同一个全局变量,会出现竞态条件(数据竞争),必须依靠互斥锁 Mutex、信号量做同步保护,否则数据错乱,这是多线程开发最主要的难点UW Compute...。
重要故障特性:某一个线程发生致命错误,会把整个所属进程直接搞崩溃,同进程其他线程全部终止。而一个进程崩溃,不会影响操作系统其他进程。
举一个浏览器的真实例子:浏览器主进程内部,网页渲染、下载文件、播放音频,分别由不同线程完成,共享页面资源;如果其中一条渲染线程出现严重内存错误,整个浏览器窗口直接闪退。
三、进程与线程核心对比表
表格
对比维度进程 Process线程 Thread
核心定位资源分配的最小单位CPU 调度执行的最小单位
资源空间拥有独立完整虚拟内存地址空间共享所属进程全部资源;仅拥有独立栈、寄存器、TID
创建销毁开销大,需要分配整套内存资源很小,复用进程资源,仅创建线程栈
上下文切换开销高,需要切换页表、刷新 TLB 快表低,只切换寄存器与线程栈
通信方式必须 IPC 进程间通信:管道、共享内存、socket、消息队列直接读写进程共享内存;需要锁做同步
故障隔离性一个进程崩溃,不影响其他进程一个线程崩溃,整个进程全部退出
包含关系一个进程至少包含 1 个主线程线程不能独立存在,必须归属某一个进程
四、真实工程场景怎么选:多进程 vs 多线程
[*]优先选多进程场景:追求稳定性、强隔离典型案例:Chrome 浏览器早期设计,每一个网页标签页为独立进程。某一个网页页面崩溃、恶意脚本异常,只会关闭这一个标签,不会把整个浏览器搞挂。代价:内存占用高,进程间通信复杂。
[*]优先选多线程场景:追求高并发、减少资源开销后端服务网络 IO、文件处理。大量任务之间数据交互频繁,希望减少创建销毁开销,用多线程。比如 web 服务器同时处理上百个用户请求,使用多线程模型。代价:需要处理锁、竞态条件,代码复杂度上升,一个线程异常全部挂掉。
工程现实:很多现代软件采用混合模式,进程做隔离,进程内部使用多线程提升并发吞吐量。
五、大众 & 面试高频认知误区澄清
误区 1:并发 = 并行
纠正:并发是 CPU 快速切换模拟同时运行(单核也可以并发);并行是多核 CPU 物理上同一时刻同时执行任务。
误区 2:多线程一定跑得更快,线程开越多性能越高
纠正:线程过多,上下文切换会带来巨大损耗。CPU 密集任务线程数建议接近 CPU 核心数;IO 等待型任务可以适当多开线程,不是无限制开越多越快。
误区 3:线程共享内存,所以线程之间通信完全没有成本
纠正:虽然内存访问快,但为了解决数据竞争,互斥锁会带来同步开销,锁竞争激烈的时候性能会大幅下降。
误区 4:线程崩溃只会影响自己,其他线程不受影响
纠正:同一进程内部线程共享地址空间,线程发生段错误等致命异常,操作系统会回收整个进程资源,全部线程一起终止。
误区 5:程序等于进程
纠正:程序是磁盘上静态文件;进程是加载到内存正在运行的实例,同一个程序可以同时启动多个进程。
全文总结
一句话记住核心定义:进程是资源容器,线程是干活的工人。进程是操作系统分配内存、文件等资源的基本单位,相互强隔离,切换开销大,但是稳定性高;线程属于进程内部,是 CPU 真正调度执行的最小单元,共享进程资源,轻量高效,但线程出错会毁掉整个进程。
并发和并行需要分清;多线程共享内存带来通信便利,同时引入数据竞争,需要锁同步。实际开发中,追求故障隔离优先多进程;追求高并发、低开销优先多线程,大量项目会把两者结合使用。
进程与线程是操作系统、后端开发的地基,不管是前端、后端、客户端开发,还是面试笔试,都绕不开这套基础概念。
页:
[1]