cpu、核、进程与线程之间关系

参考博文:
https://www.cnblogs.com/52mm/p/p2.html#_labelTop

首先我们需要了解一些基础概念:

串行,并发与并行

串行
多个任务,执行时一个执行完再执行另一个。
并发
多个线程在单个核心运行,同一时间一个线程运行,系统不停切换线程,看起来像同时运行,实际上是线程不停切换。
并行
每个线程分配给独立的核心,多个线程同时运行。

一、多核多线程

cpu的超线程技术
以2核4线程的电脑为例,电脑只有一个处理器(cpu)芯片,2个核是指在一个cpu中集成了两个完整的计算引擎(内核)。
多核

仅仅提高单核芯片的速度会遇到很多问题,英特尔工程师转而“横向发展”,提高计算机性能。线程应用能够充分利用多个内核,在同样的时间内完成更多的任务,大大提高cpu的性能。多核处理器是单枚芯片,可以插入一个处理器卡槽内,操作系统会利用相关资源将单枚芯片中的多个执行内核分立为多个处理器。

多线程(不同于程序中的多线程)
事实上单个执行内核的性能并没有被充分利用,因此工程师们又采用了另一个思路去提高cpu性能,即让单个执行内核可以同时执行多重线程,从而进一步提高cpu性能,这就是所谓的超线程技术。

虽然单线程核心每秒能处理成千上万条指令,但任一时刻,内核只能对一条线程进行操作,而其实这个内核还有很多性能没有被利用到,空闲着。超线程技术就是在一个执行内核上同时执行两个线程,两个线程共享这一个内核的资源。理论上来说就像两个独立的执行内核分别同时执行两个线程一样,但其实并不是这样。当两个线程同时需要同一个内核资源时,其中一个线程必须等待另一个线程使用完后释放资源,才能继续执行。所以超线程性能并不等于两个执行内核的性能。这里的多线程只是逻辑上的多线程,并不是真正意义上独立的多线程。

二、多进程与多线程

1. 多任务
思考这样一个场景,你正在使用电脑一边播放音乐,一边浏览网页,同时还在聊QQ。此时电脑上至少有三个任务在“同时”运行,其实还有许多任务在后台执行只是你看不到罢了。任务数远大于cpu核心数,所以这里的多任务同时运行往往指的是并发执行,而不是并行执行。大量任务在cpu的多个内核上交替切换执行,但由于cpu执行速度太快,以至于我们感觉不到任务的切换,让人感觉所有任务都是在同时运行着。事实上,如果cpu是2核2进程的,则同一时刻只能有2个任务同时执行;如果cpu是2核4进程的,理论上同一时刻能够同时执行4个任务,实际上往往并不会达到4个任务并行执行,原因上节已经讲述在此不再赘述。
2. 多进程与多线程
对于操作系统来说,一个任务就是一个进程。比如打开一个world就是一个进程,打开两个world就是两个进程,打开浏览器也是一个进程。但有些进程不单单只完成一件事,比如在浏览器上看电影时,浏览器既要播放视频又要播放音频还要播放字幕等,这样在一个进程内就要做多件事,这多个子任务实际上就是进程中的线程。

由于每个进程至少要干一件事,多以每个进程至少有一个线程。多个线程的执行方式和多进程执行方式一样,是由操作系统在多个线程间切换执行的,切换速度极快导致我们感觉多个线程是同时执行的,事实上,现代操作系统都将线程作为最小的调度单位,而将进程作为资源分配的最小单位。一个进程内的多个线程是可以并行运行在多个核上的,但这也并不是一定的,比如python的线程模型并不支持并行运行在多个核上。

3. 多任务与多进程,多线程的关系
结合以上两节我们可以总结出同时执行多个任务的3种解决方案:
  • 多进程模式:开启多个进程,每个进程开启一个线程,每个线程完成一件事,多个进程就完成多件事
  • 多线程模式:开启一个进程,一个进程里开启多个线程,每个线程完成一件事,1个进程就完成多件事
  • 多进程和多线程组合模式:开启多个进程,每个进程内开启多个线程,每个线程完成一件事,多个进程就完成多件事

以上三个解决方案中,方案三实现起来很复杂,需要解决的问题很多,使用的较少。而方案二,看似很好,一个进程就能完成多件事,那我们是不是可以将多个任务都在一个进程内的多个线程上完成呢?事实上,一个进程内不能无限制地开启很多个线程,当线程数量超过一定上限时,进程内线程间的切换,上下文环境的保存恢复需要占用大量时间,导致cpu性能下降。

4. 多进程与多线程的关系及优缺点

进程与线程间的关系:

  • 一个进程至少有一个线程,可以有多个线程,但不可有过多的线程,否则性能下降
  • 一个进程内的多个线程可以并行运行在多核多线程的处理器上
  • 一个线程只属于一个进程,不可能两个或多个进程拥有同一个线程
  • 进程是操作系统资源分配的最小单位,一个进程内的多个线程共享该进程的资源
  • 线程是操作系统调度的最小单位,即cpu分配给线程,真正在cpu上执行的是线程

在这里插入图片描述

多进程的优缺点

优点:每个进程间是相互独立的,一个进程的崩溃不会影响到其他进程的执行,稳定性高。

缺点:进程创建,调度等开销大。

多线程优缺点

优点:多线程直接共享进程资源,创建调度等开销小。

缺点:正是由于多线程共享进程资源导致任何一个线程挂掉都可能导致整个进程奔溃。

不管是多进程还是多线程,如果数量一多,效率就会下降,因为系统调度会占用大量cpu时间。

三、python中的多线程

前面说到一个进程内的多个线程可以并行运行在多个cpu内核上,但Python程序的线程不能运行在多个内核中,所有线程都只能在一个cpu内核中交替执行。因为Python的线程虽然是真正的线程,但解释器执行代码时,有一个GIL(Global interpreter Lock)锁,python线程在执行前必须先获得GIL锁,而一个进程中只有唯一的一个GIL锁,导致python线程不能实现并行。即使是100个线程在100个核的cpu上执行,真正能用到的也只有一个核。python中虽然可以使用多线程,但无法利用多核的性能。

解决方案:

  • 重写python的解释器,实现一个不带GIL锁的解释器
  • 对线程并行要求较高的程序,核心代码使用C,C++或java来编写
  • 使用多进程来替代多线程,充分利用多核的性能。多个python进程各自有自己的GIL锁,互不影响。

四、IO密集型 vs 计算密集型

是否需要开启多进程,多线程?开启多少个进程,线程?这与任务的类型有关。我们可以将任务分成IO密集型和计算密集型两种。

计算密集型
  • 程序主要为复杂的逻辑判断和复杂的运算。
  • cpu的利用率高,不用开太多的线程,开太多线程反而会因为线程切换时切换上下文而浪费资源。
IO密集型
- 程序主要为IO操作,比如磁盘IO(读取文件)和网络IO(网络请求)。 - 因为IO操作会阻塞线程,cpu利用率不高,可以开多点线程,阻塞时可以切换到其他就绪线程,提高cpu利用率。
  • 6
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

隔壁de小刘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值