进程-线程-程序 | 并发-并行

参考:

  1. 指令级并行,线程级并行,数据级并行区别?线程的概念是什么?

1 进程与线程

首先,由一个小例子:

小明的一天,可分为:上午、下午、晚上。

由小明的例子,同理可得,对于一个 程序 来说,它分为若干个进程。而进程是操作系统处理一个程序时的抽象

我假设有下面这个程序,把它用来参照小明的这个例子:

  • 进程A --用来处理用户登录
  • 进程B --用来提供服务,比如播放视频什么
  • 进程C --用来和用户交互

补充:

1、程序文件

程序是什么,是一堆代码文件吗?不是的:

  • 程序有生命,有自己的诞生,执行和消亡的生命史。

  • 文件是没有生命的;

2、程序进程

我们没法描述这个程序的生命过程,无法描述是一件糟糕的事情,因而引入进程的概念可以很好的描述一个运行中的程序


再回到刚才的例子,小明的一天分为“上午、下午、晚上”(进程分为A,B,C)。但是太过于粗糙了,我们可以在细分,将小明的上午继续划分为实实在在的小事:

上午: 洗脸刷牙,吃早饭,听音乐,坐公交

下午:打篮球

晚上:…

那么对一个程序来说,它的线程就像同样发生在小明这些实实在在的小事。线程(对进程而言)= 实实在在的小事(比如一个图片解码的线程,再比如一个单线程的脚本)。这些线程大多逻辑简单清晰,做着每一个实实在在的小事,就像一个工人

那么对于小明而言:

线程1 = 刷牙洗脸
线程2 = 吃饭
线程3 = 听音乐
线程4 = 坐公交

在这个层面上:一个程序包含着若干个进程,一个进程包含着若干个线程

1.1 Windows中任务管理器看进程

我们可以卡一下Windows中的任务管理器:

image-20210629233047886

image-20210629233218247

每一个进程都有自己唯一的编号,叫做PID(process id)。从上图可以看出,浏览器有很多个进程,因为我开了很多个网页。这些进程又是由许许多多的线程组成。

但是,因为普通用户只能看得见进程,而操作系统才可以看到线程层次。

1.2 进程是线程在一定时间内的有序集合

img

这个进程就只有两个线程,#1#2。但是#1没执行完,就被#2强势抢占了,然后#1只好让#2爽了会。最后#2匆匆完事之后,#1又恢复活力,开始执行了。这里隐含了个术语:上下文切换。 其实还有更晦涩的东西,如果你想了解更多,你可以搜索:线程的五大状态

关于这个图片的圆
空余的部分其实就是系统分配给这个进程的资源,就像朋友聚会时酒店上的饭菜,你只能吃你自己桌子上这么多,不要想别人桌子上的。

1.2 小结

我门应记住:程序>进程>线程,这样的包含关系。

  • 程序 ≠ 文件

  • 一个程序 可由若干个 进程组成;一个进程 又可由若干个 线程组成。

    • 一个进程:在系统层面上分析,进程它是由大量的可执行的单元组成,叫做线程(Threads)

    • 一个进程不仅仅可能包含这个多个线程,进程还包含着:被操作系统分配的资源空间,比如操作系统在内存中分配给它的栈,数据区域等。这些资源空间被多个线程所共享。

      比如你和朋友们一次聚餐,这就很像一个进程。桌子上那些饭菜就是资源,你们每个人都是一个线程,每个人每次伸手去夹菜就是在使用这个共享的资源。

2 并发与并行

再次来看小明的例子:

并发:

并发 = 小明可以一边玩手机一边看电视。
但是在事实上,他的眼睛在看电视的时候不能看手机,他在看手机没法盯着电视屏幕。
他的眼睛飞快在两个屏幕上切换。⭐,即并不是真正意义上的同时进行⭐。

这不是真正意义上的同时进行,但又是客观存在同时进行两件事,这叫并发

并行:

并行 = 小明可以一天坐公交一边听音乐。
这两件事同时进行互不干扰,做到真正意义的同步同时进行,这叫并行。

3 [补] 线程级并发(Thread-Lever Concurrency)

在计算机发展的早期,计算机每次只能运行一个进程,在操作系统(OS)中能拥有资源和独立运行基本单位。因此用户想运行下一个进程必须等上一个进程运行完。

比如:你想浏览这个网页就必须关闭上个网页,你想运行这个线程就必须关闭别的。那也太头疼了,是不是?

后来随着发展,1967年首次实现了多线程(Multiprogamming with a Variable Number of Tasks) ,那时候还没有建立线程(Thread)的概念,他们称之为任务(Tasks)

如下图所示,这些单核的CPU中的进程。可以看到这些进程并不是同时进行的,而是进行上下文切换(process context switch),来交替进行的:

img
对cpu而言,这两个进程其实不是同时进行的;并发
对用户而言,由于P1和P2切换的速度非常快,所以用户觉得是“是同时进行的”。

4 [补] 线程级并行(Thread-Lever Parallelism)

虽然IBM实现了并发,但这对CPU而言并不是真正意义上的同时进行,只是让它的效率更高而已。因此人们期望能同时处理多个线程,实现线程的并行。

CPU的晶体管也遵循摩尔定律高速发展。但问题是:依旧不能同时处理多个线程,仅仅提高单核芯片的速度会产生过多热量且无法带来相应的性能改善,也永远不能实现真正意义上的同时处理多任务。

英特尔和AMD也都意识到,当主频接近4GHz时,速度也会遇到自己的极限:那就是单靠主频提升,已经无法明显提升系统整体性能。因此迫切需要一个能支持同时处理2个线程以上的处理器,来提升CPU的瓶颈。需求推动了技术**,线程级并行应运而生**。主要由下面两种技术的支撑:

4.1 超线程技术(Hyper-Threading,HT)

超线程技术实现了单个物理核心同时两个线程,也就是别人常说的虚拟内核数。比如单物理核心实现的双线程,它同时可以处理两个线程,它的物理核心数其实是是1个,通过Hyperthreading技术实现的线程级并行(Thread Lever Parallelism)。至于技术细节的实现,这涉及到高速缓存的知识。

4.2 多核技术——物理核心

CPU的核心由单核变为多核心。如比如拥有Core i7有4个物理核心。

而且还带有超线程技术,每个核心可以同时处理2个线程。所以,Core i7的处理器可以同时让 4*2=8个线程 并行

Core i7

img

4.3 小结

  1. 当运行多任务时,它减少了之前的模拟出来的并发,那么用户进行多任务处理时可以运行更多的程序进行并发了。
  2. 它可以使单个程序运行更快。(仅当该程序有大量线程可以并行处理时)

4 [补] 指令集并行(Instruction-Level Parallelism)

指令集的是更低层次的概念。计算机处理问题是通过指令实现的,每个指令都是交给CPU执行。在1978年的 Intel 8086 处理器都只能一次执行单指令。 Intel首次在486芯片中开始使用,原理是:
当指令之间不存在相关时,它们在流水线中是可以重叠起来并行执行

指令集并行基于**流水线(Pipeline)技术**。

通过一个例子理解什么是流水线技术。

img

比如洗车,分为以下步骤:

  1. 检查工作
  2. 撤掉脚垫清洗干净
  3. 预洗
  4. 用水枪冲洗车身
  5. 上洗车液
  6. 擦抹。。
  7. 后面略

现在有两个顾客A和B准备要洗车。那么“流水线技术”可以这样安排:

洗车点让A先进流程①,
等A到了流程②,立马让顾客B开始流程①
等A到了流程③,立马让顾客B开始流程②
………依次往复                          

该洗车例子使用的方案,就像车间的流水线,所以叫流水线技术。因为指令1和指令2,实际上不同指令,但是正式因为他们可以互不干扰,因此可以这么执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值