电脑计算机论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1681|回复: 0

进程、线程、并行、并发的区别与形象化解释

[复制链接]
admin 发表于 2022-9-2 17:17:44 | 显示全部楼层 |阅读模式

可能很多人在学习编程中都看到过进程、线程、并行、并发这种看起来很像的词汇,但是又分辨不清它们到底是什么意思。其实这些概念都与程序的运行方式相关,合理的安排程序的运行方式可以让我们的程序运行得更高效。那么今天我们就来好好聊一下这些概念。




程序运行的关键是什么呢?当然是CPU,没有CPU程序就无法执行。CPU的角色就像打工人,比如你想买一套煎饼馃子,早餐摊上得有人给你摊才行,那些原料不会自己组装成一套煎饼馃子。

按照我们通常的认识,如果我们想扩大业务,常规的思路就是多招人。比如煎饼馃子摊再招个人来做鸡蛋灌饼,这样就可以同时让一个人摊煎饼馃子,一个人做鸡蛋灌饼。按程序的运行来说就是多加CPU,这种运行模式被称为并行

但是多加CPU很合适吗?给电脑安装五六个CPU,感觉像在给主板贴瓷砖,实在是太占地方了。不过随着技术的发展我们可以把多个CPU的核心封装到一个CPU里,这就是CPU核心数的意义。经常能看到哪个CPU宣传自己是“八核十六线程”,这里的“八核”就是指一个CPU里有八个核心,四舍五入等于八个CPU。




那“十六线程”是什么意思呢?不急,我们先来看看现在这种状况有什么不合适的。如果我们的煎饼馃子摊有一个人专做煎饼馃子,一个人专做鸡蛋灌饼,会有什么后果?假如这一波顾客都只要煎饼馃子,那么做大饼鸡蛋的员工就是在带薪摸鱼,相当于抢劫我们资本家了。一个打工人上班只有一件事,那这个公司不是在创业,是在搞慈善。所以关键问题就是员工的利用率太低了。

实际上我们只让一个员工来做这两件事就好了。而在程序运行中,每件事被称为进程。摊煎饼馃子,做鸡蛋灌饼都是进程。我们运行一个QQ,再运行一个微信,这两者也都是进程。




然而俗话说得好,一心不能二用。一个员工如何能同时即摊煎饼馃子又做鸡蛋灌饼呢?最简单的办法就是一个一个地做,摊完煎饼馃子再做鸡蛋灌饼,这种模式被称为串行。但缺点就是不能同时出餐,有些客人可能要等很长时间。那该怎么优化流程呢?




其实我们可以把每件事拆分成很多子任务,比如摊煎饼馃子就可以分为加糊,摊匀,加蛋,撒葱花,翻面,刷酱,加馃子,折叠,装袋等任务。我们尽可能地细分任务,分到不能再分。这样执行这种最小任务的单位就被称为线程。我们可以让员工执行一下摊煎饼馃子的任务,再执行一下做鸡蛋灌饼的任务,在这两个进程中反复横跳,只要速度够快,人分辨不出来,就可以实现两件事“同时”进行的效果。(有点像七龙珠里的残象拳)

特别是有些任务是需要等时间的,比如在摊煎饼馃子时把面糊摊匀后需要等个十几秒,这个时候让员工去打鸡蛋为做鸡蛋灌饼做准备,时间的利用率就又提高了,出餐的速度也就更快了。那么这样以“反复横跳”的方式用一个人同时完成多个任务的模式就被称作并发。




不过并发并非适合所有情况,毕竟“反复横跳”也是要花时间的,如果需要切换的频率太高,可能效率反而不如串行。



那么再回到我们刚才的“八核十六线程”。一个CPU的核心只能同时进行一个线程,在以前CPU的核心数等于线程数。但2002年英特尔研发出了超线程技术,将单个核心模拟成多个核心,就像鸣人开了影分身。

但模拟的毕竟是模拟的,不但运行起来有软硬件的限制,单个线程的效率还比物理核心低下,因此所谓的“八核十六线程”不能等同于十六核。

虽然我们刚才使用早点摊来解释这些概念,但在一台电脑中实际的运行状况要远比早点摊复杂,想想你打开电脑,登上微信,打开QQ,启动迅雷,再放个音乐,加上很多后台运行的程序,进程数轻松破百。这更像是在一个大企业中(电脑主机)有非常多的项目组(进程),企业的员工(CPU核心/线程)在各个项目组中来回奔波,某些项目在同时进行(并行),某些项目在来回切换着做(并发),某些项目在按着顺序一步一步来(串行),而我们作为资本家需要的是合理地设置业务结构,让所有员工时时刻刻都有活干。

在我们之前的编程学习中,我们都是按照串行的方式来进行的。在一定条件下,串行是效率低下的代表,我们以后也会接触到并行和并发编程。比如在爬虫中,我们可能一次循环爬取多个网页,但获取网页涉及到网络连接,磁盘读写,需要花费的时间就比较长了,我们就可以在上一个网页还在获取的过程中直接切换到下一个网页并进行获取,这样就可以大幅加快爬虫的速度。




最后我们来总结一下:




进程:每一个程序,每一件事都是一个进程,像是一个企业中的项目组。




线程:执行进程中最小任务的单位,相当于项目组中的岗位。一个CPU核心或线程只能同时执行一个线程。




串行:按照顺序一步一步执行进程,做完一个再做另一个,二者不同时进行。




并行:用多个线程同时执行多个进程,多个进程完全同时进行。




并发:用单个线程以反复横跳来回切换的方式假装多个进程在同时进行。











您需要登录后才可以回帖 登录 | 注册

本版积分规则


QQ|手机版|小黑屋|电脑计算机论坛 ( 京ICP备2022023538号-1 )

GMT+8, 2024-12-28 09:20 , Processed in 0.108072 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表