深入浅出:进程和线程的区别与联系
大家是否好奇过,为什么电脑可以同时运行浏览器、音乐播放器和Word文档而互不干扰?又为什么在浏览器里,可以一边下载文件一边滚动页面?这背后的功臣,就是操作系统中的两个核心概念:进程和线程。
1、什么是进程
进程是操作系统进行资源分配和调度的基本单位。
当你双击一个程序图标时,操作系统就为你创建了一个进程。它会为这个进程分配:
- 独立的内存空间:存放代码、数据和堆栈。
- 系统资源:如打开的文件、网络端口等。
- 管理信息:进程ID(PID)、优先级、状态等。
关键特性:
- 独立性:每个进程都运行在各自受保护的内存沙箱中。一个进程崩溃,一般不会波及其他进程。这提供了出色的稳定性和安全性。
- 优缺点:稳定、安全,但开销大,切换慢。
- 开销大:创建、销毁或切换进程,需要分配或回收大量资源,成本较高。
- 生命周期:创建、就绪、运行、阻塞、终止
简单来说,进程是程序的“一次执行过程”,它为我们提供了程序运行的独立舞台。
2、什么是线程
2.1、为什么要有线程
线程是进程中的一个执行流,是CPU调度和执行的基本单位。
一个进程可以包含多个线程,这些线程“寄生”在进程内部。
首先,"并发编程" 成为 "刚需"
- 单核 CPU 的发展遇到了瓶颈,要想提高算力, 就需要多核 CPU,而并发编程能更充分利用多核 CPU资源
- 有些任务场景需要 "等待 IO",为了让等待 IO 的时间能够去做⼀些其他的工作, 也需要用到并发编程
其次,虽然多进程也能实现并发编程,但是线程比进程更轻量
- 创建线程比创建进程更快
- 销毁线程比销毁进程更快
- 调度线程比调度进程更快
最后,线程虽然比进程轻量,但是人们还不满足,于是又有了 "线程池" 和 "协程"【这部分后面还会单独介绍】
关键特性:
- 共享资源:所有线程共享其所属进程的全部资源和内存空间。
- 独立资源:有自己的栈和寄存器
- 并发执行:在多核CPU上,多个线程可以真正并行运行;在单核CPU上,通过时间片轮转,它们可以并发执行,从而提高程序的响应能力和效率。
- 轻量级:创建、销毁、切换线程的开销远小于进程,因为它们不需要新的内存空间。
- 高效通信:线程间可以直接读写同一个全局变量,通信极其方便。
- 风险共存:便利带来风险。多个线程同时修改同一数据可能导致数据混乱(竞态条件)。因此需要引入“锁”等同步机制来确保数据安全,这也增加了编程的复杂性。
- 优缺点:切换快,通信方便,但一个线程崩溃可能影响整个进程。
- 生命周期:与进程类似,但更简单。
3、进程与线程的区别与联系
- 进程是包含线程的,每个进程至少有⼀个线程存在,即主线程
- 进程和进程之间不共享内存空间,同⼀个进程的线程之间共享同⼀个内存空间
- 进程是系统分配资源的最小单位,线程是系统调度的最小单位
- 一个进程挂了⼀般不会影响到其他进程,但是⼀个线程挂了,可能把同进程内的其他线程⼀起带走(整个进程崩溃)

| 特性 | 进程 | 线程 | 联系 |
|---|---|---|---|
| 定义 | 操作系统资源分配和调度的基本单位 | 进程内的一个执行路径,是CPU调度和执行的基本单位 | 线程是进程的一部分 |
| 资源分配 | 拥有独立的地址空间、代码段、数据段、堆栈、打开的文件句柄等资源 | 共享所属进程的所有资源(地址空间、代码、数据、文件等) | 线程共享进程的资源 |
| 创建与销毁开销 | 较大、需要分配和初始化大量资源 | 较小,主要是创建堆栈和寄存器上下文 | 线程的创建和切换比进程更高效 |
| 切换开销 | 较大、需要切换地址空间、刷新TLB等 | 较小,只需保存和恢复少量寄存器信息 | 线程切换成本低,进程切换成本高 |
| 通信方式 | 相对复杂,需要使用进程间通信机制,如管消息队列、共享内存、套接字等 | 相对简单,可以直接访问进程的共享内存空间,也可以使用线程间同步机制(如互斥锁、条件变量、信号量等) | 线程间通信更高效 |
| 独立性 | 高。进程间相互独立,一个进程崩溃通常不会影响其他进程 | 底,线程共享进程资源,一个线程崩溃可能导致整个进程崩溃 | 线程依赖于进程存在 |
| 并发程度 | 可以实现进程级并发 | 可以实现线程级并发,并发程度更高 | 多线程并发是进程并发的补充和细化 |
4、总结
进程是资源的容器,强调隔离与安全;线程是执行的流程,强调协作与效率。
在选择使用进程还是线程时,可以遵循以下原则:
需要高度稳定性和安全性,任务间隔离要求高,优先使用进程(如Chrome浏览器为每个标签页开一个进程)
需要频繁创建和销毁,或需要极高效的数据共享和通信,优先使用线程(如Word文档中同时处理打字和拼写检查)
