公众号旧文

“想要进城(进程),得等县城(线程)开门”

作者:胖子阅读 —

很多人刚开始接触计算机时,都会遇到两个看起来很相似的词:

进程(Process) 线程(Thread)

这两个概念几乎出现在所有操作系统和编程语言中,但很多初学者一开始都会觉得很抽象。

如果用生活中的比喻来理解,它们并不难。

一、一个有趣的比喻:进城和县城

我曾经在网上看到一个很有意思的回答。

原话是:想要进城,得等县城开门才行。

也就是:想要进程,得等线程开门才行。

这里利用了一个谐音:

  • 进城 ≈ 进程
  • 县城 ≈ 线程

虽然是一个玩笑式的类比,但还挺贴切的。

意思就是:

程序真正开始运行,是通过线程来执行的,而线程必须存在于进程之中。

换句话说:

  • 进程是运行环境
  • 线程是执行动作

如果没有线程,进程就像一座城一样存在,但里面不会有任何活动。

二、进程到底是什么?

简单来说:

进程就是一个正在运行的程序。

比如你在电脑上打开:

  • 浏览器
  • 音乐播放器
  • 文本编辑器

操作系统都会为每一个程序创建一个独立的进程。

每个进程都会拥有自己的一些资源,例如:

  • 一块独立的内存空间
  • 打开的文件
  • 网络连接
  • 程序运行需要的各种数据

不同进程之间通常是相互隔离的。

也就是说:

一个程序一般不能随便访问另一个程序的内存。

这样做的好处是:

一个程序崩溃,不会轻易影响其他程序。

三、线程又是什么?

如果说进程是一个运行环境,那么:

线程就是在这个环境里真正执行代码的“工作者”。

线程负责:

  • 执行程序指令
  • 进行计算
  • 处理任务

一个进程里面可以有:

  • 一个线程
  • 也可以有多个线程

这些线程会共同使用进程里的资源。

四、一个更直观的比喻:房子和人

很多操作系统课程都会用一个经典比喻:

进程像一栋房子,线程像房子里的人。

一栋房子里可以住很多人:

  • 大家共用

同样地:

一个进程里的线程会共享:

  • 内存
  • 文件
  • 程序代码

这就是为什么线程之间协作起来比较快。

五、为什么需要多个线程?

假设一个程序只有一个线程。

那么它一次只能做一件事。

但现实中的软件往往需要同时处理很多事情。

比如浏览器:

  • 一个线程负责加载网页
  • 一个线程负责播放视频
  • 一个线程负责响应鼠标操作

这样用户体验才会更流畅。

六、进程和线程的核心区别

用一句在操作系统里非常经典的话总结:

进程是资源分配的单位,线程是CPU调度的单位。

简单理解就是:

进程负责提供资源,线程负责执行任务。

可以总结成下面这个表:

概念 作用
进程 提供运行环境和资源
线程 真正执行程序代码

七、小结

如果用最简单的话总结:

  • 进程:程序运行的“空间”
  • 线程:程序运行的“动作”

或者用比喻来说:

  • 进程像一栋房子
  • 线程像房子里干活的人

没有线程,进程就不会真正运行。

也正因为如此,在很多系统设计中:

线程才是程序执行的核心。

扩展阅读:


当论坛一键部署之后,真正的战场在哪里?

你每天上网都在使用的IP,是谁分配给你的?

如何一键获取你在公众号发表过的文章数据?

VPS商家怎么知道哪个新用户是你带来的?