🏠 首页 攻略 进程和线程是什么?操作系统里最基础的执行单位

进程和线程是什么?操作系统里最基础的执行单位

进程是资源容器,线程是执行单元。理解它们的区别,写代码不再踩坑。

你有没有遇到过程序卡死的情况?

打开一个网页,浏览器没反应了。点保存,文档半天不动弹。

这时候你可能会重启程序——重启的本质,就是杀掉一个进程,再启动一个新的。

但你知道"进程"到底是什么吗?它跟"线程"又是什么关系?

这篇文章用最短的话,把这两个概念讲清楚。


什么是进程?

进程 = 程序的一次运行实例。

打个比方:你写了一本书(源代码),这本书本身不是故事。只有当有人打开书、开始读的时候,故事才真正发生。那个"正在读"的状态,就是进程。

每个进程都有自己独立的空间:

  • 内存:存放变量、数据
  • 文件描述符:打开的文件、网络连接
  • 环境变量:运行时配置信息
  • CPU状态:当前执行到哪条指令

进程之间互不干扰。关掉微信,不会影响你的浏览器。因为它们是两个独立的进程。

操作系统用进程表管理所有进程,每个进程有一个唯一的ID(PID)。你在终端输入 pstop,看到的就是这些进程的列表。


什么是线程?

线程 = 进程内的执行流。

继续用书的比喻:进程是那本正在被阅读的书,线程则是"读者"。一本书可以同时被多个人读——每个人读不同的章节,互不冲突。这就是多线程。

一个进程至少有一个线程(主线程)。它可以有多个线程共享同一块内存。

线程的特点:

  • 轻量级:创建和销毁比进程快得多
  • 共享内存:同进程的所有线程共享同一块数据空间
  • 独立栈:每个线程有自己的调用栈和局部变量

进程 vs 线程,核心区别

进程线程
资源独立内存空间共享进程内存
创建开销大(需要分配内存)小(只需栈和寄存器)
通信方式复杂(IPC机制)简单(直接读写共享变量)
崩溃影响只影响自己可能拖垮整个进程
数量系统能跑几十个就很多了一个进程可以有上百个

一句话总结:进程负责隔离,线程负责效率。


实际开发中怎么用?

场景一:服务器要处理大量请求

假设你在写一个Web服务器。如果每个请求都起一个新进程——来1000个请求就创建1000个进程,内存直接爆掉。

解决方案:用线程池。启动时创建50个线程,请求来了就分配给空闲线程处理。省资源,速度快。

场景二:爬虫同时抓多个页面

单个线程按顺序抓页面,慢。用多线程同时抓10个URL,速度翻10倍。

但要注意:多个线程同时修改同一个变量,可能会打架(竞态条件)。需要用锁来协调。

场景三:GUI程序不能卡界面

你点了按钮,程序在计算大数据。如果用主线程计算,界面会冻结,用户以为程序死了。

正确做法:把计算放到子线程,主线程只管刷新界面。


现代操作系统的演进

早期的Unix系统只有进程。线程是后来加的特性。

现在的趋势是:

  • Linux:线程实际上是"轻量级进程",内核统一调度
  • Windows:线程是核心调度单位,进程只是线程的容器
  • Go语言:用Goroutine替代传统线程,一个进程可以跑上万个协程

不管怎么变,核心思想不变:隔离靠进程,并发靠线程。


总结

进程和线程是操作系统最基础的概念。理解了它们,你就理解了为什么程序会卡、为什么多线程要加锁、为什么微服务要用进程隔离。

下次程序卡死的时候,别急着重启。想想是不是某个线程死锁了,或者内存不够用了。

你的程序里用过线程吗?踩过什么坑?