一篇文章讲清楚:线程、进程、并发、并行,串行到底是什么
文章目录
很多刚入门多线程的人,包括我在内,都会被下面的几个概念劝退:
线程、进程、并发、并行、串行
这些词看起来很像,但是又不像。这篇文章我不讲复杂的定义,只用最简单的例子,并配上一个可视化的视图来一次性讲清楚这几个词。
一、进程与线程
1.进程(Process)
在开始学多线程的时候,我最先卡住的就“进程”和“线程”,书中一般就这样解释:
- 进程是操作系统分配资源的最小单位
嗯,好像懂了,又好像没懂。
简单一句话:就是一个正在运行的程序
比如:现在电脑上打开的这些软件:CSDN,微信QQ,各种开发工具
每一个运行中的软件,背后其实都是一个独立的进程
最重要的一点就是:它们之间是互相隔离的 。
也就是说,每个进程都有自己的内存空间,数据,系统资源。
所以,在一般情况下:
- 一个程序崩溃,不会影响另一个程序
2. 线程(Thread)**
线程这个东西,看着下面这个概念更加懵逼了
- 线程是 CPU 调度和执行的最小单位
依旧是说得有道理,,但对初学者没什么帮助,后面我是这样理解的:
如果说进程是一个程序,那么线程就是这个程序里面,真正干活的那部分
比如:我们打开一个浏览器,会发现:
- 网页正在加载
- 视频可以点击播放或者暂停
- 我们可以用鼠标点击滑动
这些事情显然不是“一个东西”在做,而是有不同的“执行流程”在分别处理不同的任务,也就是说:
- 一个进程里,可以有多个线程同时在工作
而且线程有一个非常关键的特点:它们共享同一个进程的内存,但这也是很多问题(线程安全)产生的原因。
3.用一个类比彻底串起来
如果上面还是有点抽象,可以用一个更形象的理解:
把计算机想象成一个工业园区,
里面的有着许多不同的工厂(进程),
还有工厂里的流水线工人(线程)
- 进程(Process) = 工厂
工厂有着自己的独立厂房,仓库和设备,对应到程序里就是进程有着内存,数据,系统资源。
不同工厂之间是独立的
一个工厂出问题,不会影响其他工厂
所以当我们双击打开任意一个软件时,操作系统就会为他们各自创建一个进程。不同进程之间是完全独立,互不影响的,这保证了一个程序的崩溃一般情况下不会带走另一个程序,就和工厂一样,不同工厂也是如此,总不能其中一个工厂被炸了,导致另一个工厂也被炸了。
- 线程(Thread) = 工厂里的流水线工人
工厂本身是不会干活的,真正干活的是里面的工人。
同理:
进程只是资源的载体,线程才是执行的主体
所以,一个工厂至少要有一个工人(主线程),也可以招聘多个工人一起干活(多线程)。
多个线程存在于同一个进程中,共享这个进程的内存空间和系统资源,也正因为这样,多线程的效率高,但是这样也引发了“线程安全”问题(后续讲解)(比如两个工人抢一个扳手🔧)
二、串行、并发、并行
1.串行
这个最简单:
- 一件一件做,做完一个再做下一个
比如:
只有一个工人,面对一堆任务,只能做完 A,再做 B,最后做 C
必须按顺序来
优点就是简单不会出错,缺点就是慢。
1.2串行可视化

2.并发
这是一个很容易误解的概念,我刚开始就以为:
并发 == 同时进行
实则不然,
- 并发的本质是:你看起来是同时进行的,但实际上确实轮流执行的
举一个例子,一个海后谈了三个男朋友,她说我这一年同时谈了三个男朋友,但如果细分下来:
- 第一天和A去逛街
- 第二天和B去游乐园
- 第三天和C去看电影
…看起来是同时谈,实际上是来回切换,一天谈一个。
2.1并发可视化

3.并行
这才是真正的“同时执行”
但是有一个很重要的前提:必须是多核CPU
比如:
核心1跑任务A
核心2跑任务B
这时候就不是“切换”,而是“真的一起干”。
3.2并行可视化

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐



所有评论(0)