公众号旧文
“想要进城(进程),得等县城(线程)开门”
很多人刚开始接触计算机时,都会遇到两个看起来很相似的词:
进程(Process) 线程(Thread)
这两个概念几乎出现在所有操作系统和编程语言中,但很多初学者一开始都会觉得很抽象。
如果用生活中的比喻来理解,它们并不难。
一、一个有趣的比喻:进城和县城
我曾经在网上看到一个很有意思的回答。
原话是:想要进城,得等县城开门才行。
也就是:想要进程,得等线程开门才行。
这里利用了一个谐音:
- 进城 ≈ 进程
- 县城 ≈ 线程
虽然是一个玩笑式的类比,但还挺贴切的。
意思就是:
程序真正开始运行,是通过线程来执行的,而线程必须存在于进程之中。
换句话说:
- 进程是运行环境
- 线程是执行动作
如果没有线程,进程就像一座城一样存在,但里面不会有任何活动。
二、进程到底是什么?
简单来说:
进程就是一个正在运行的程序。
比如你在电脑上打开:
- 浏览器
- 音乐播放器
- 文本编辑器
操作系统都会为每一个程序创建一个独立的进程。
每个进程都会拥有自己的一些资源,例如:
- 一块独立的内存空间
- 打开的文件
- 网络连接
- 程序运行需要的各种数据
不同进程之间通常是相互隔离的。
也就是说:
一个程序一般不能随便访问另一个程序的内存。
这样做的好处是:
一个程序崩溃,不会轻易影响其他程序。
三、线程又是什么?
如果说进程是一个运行环境,那么:
线程就是在这个环境里真正执行代码的“工作者”。
线程负责:
- 执行程序指令
- 进行计算
- 处理任务
一个进程里面可以有:
- 一个线程
- 也可以有多个线程
这些线程会共同使用进程里的资源。
四、一个更直观的比喻:房子和人
很多操作系统课程都会用一个经典比喻:
进程像一栋房子,线程像房子里的人。
一栋房子里可以住很多人:
- 大家共用
同样地:
一个进程里的线程会共享:
- 内存
- 文件
- 程序代码
这就是为什么线程之间协作起来比较快。
五、为什么需要多个线程?
假设一个程序只有一个线程。
那么它一次只能做一件事。
但现实中的软件往往需要同时处理很多事情。
比如浏览器:
- 一个线程负责加载网页
- 一个线程负责播放视频
- 一个线程负责响应鼠标操作
这样用户体验才会更流畅。
六、进程和线程的核心区别
用一句在操作系统里非常经典的话总结:
进程是资源分配的单位,线程是CPU调度的单位。
简单理解就是:
进程负责提供资源,线程负责执行任务。
可以总结成下面这个表:
| 概念 | 作用 |
|---|---|
| 进程 | 提供运行环境和资源 |
| 线程 | 真正执行程序代码 |
七、小结
如果用最简单的话总结:
- 进程:程序运行的“空间”
- 线程:程序运行的“动作”
或者用比喻来说:
- 进程像一栋房子
- 线程像房子里干活的人
没有线程,进程就不会真正运行。
也正因为如此,在很多系统设计中:
线程才是程序执行的核心。
扩展阅读: