很多刚入门多线程的人,包括我在内,都会被下面的几个概念劝退:

线程、进程、并发、并行、串行
这些词看起来很像,但是又不像。这篇文章我不讲复杂的定义,只用最简单的例子,并配上一个可视化的视图来一次性讲清楚这几个词。

一、进程与线程

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并行可视化

并发可视化

Logo

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

更多推荐