对超线程几个不一样角度的解释

角度1:举个栗子

假设我是一个CPU,我如今须要process(吃)一些食物,我如今只有一张嘴。linux

假如我有多张嘴,确定就能够process更多的食物。这就是multi-core processor所要想要完成的任务。可是因为某些缘由及限制,有时候没法实现这种方式。程序员

我只有一张嘴,我能够用手抓一片食物,送到嘴边,而后在嘴busy的时候,抓起下一片食物,继续送到嘴边。若是出现这种状况:当个人嘴已经吃完那一片食物了,这个时候手尚未将食物送到嘴边,这时候个人嘴就处于空闲状态。假如我有两只手,即便个人嘴并不能吃得更快,但个人嘴也不须要浪费任什么时候间,能够一直处于busy的状态。这就是hype-threading(超线程),一个processor,而后加上很智能的调度系统,使得processor能够一直处于busy的状态。api

超线程对单线程的任务,也就是后面一部分任务必须依赖于前面一部分任务,并无太大做用。 缓存

好比你要吃一个两勺冰淇淋锥,你必须先吃掉上面的部分,而后才能吃下面的部分。在这种状况下,增长更多的嘴或者手,都是没有什么意义的。微信

与之相反的,吃不少糖果。吃红色的糖和吃蓝色的糖之间,是没有任何前后关系的。若是如今我有多张手、多张嘴,确定是能够更多吃完这糖果的。

在现实生活中,受益于超线程和多核处理器的常见任务有:多线程

  • 编辑视频
  • 3D渲染
  • 繁重的多线程任务

好比编辑视频,视频是一帧一帧的,彻底能够在编辑这一帧的时候同时编辑另一帧。性能

总结一下:超线程的目的,就是使得processor busy,充分利用CPU资源。因此,超线程并无他名字听上去那么神奇,fetch

角度2:超线程之于CPU的意义

首先须要理清楚CPU核core的关系: 操作系统

上面这张图一图胜千言,CPU(processor)是一个物理上的小盒子,里面在物理上又分为多个core,每一个core在功能上市独立的,能够独立运行本身的线程。不一样的core之间共享一个3级缓存、共享common bus。相比多CPU单核,单CPU多核的优点在于不一样的core之间能够共享一部分资源,之间通讯也要相对容易不少;缺点在于复杂度提高,由于共享天然就会牵涉到不一样线程之间的协调、管理、锁等问题。

超线程是intel开发的,已经有10多年的历史了,它能够在同一时刻,执行两个线程,从而提升了单个CPU core的效率。以下图所示: 线程

来简略看一下CPU的发展阶段: 刚开始,一个CPU只有一个core,一个CPU只能同时运行一个线程:

接着,CPU设计师开始往一个CPU里面添加更多的core,如今一个CPU就能够同时运行多个线程了:

为了进一步提升CPU的性能,Intel又发明了超线程。超线程把一个物理的core,在逻辑上分红了两个虚拟核(two virtual cores)。如今,在操做系统的眼里,这个2核CPU实际上就是一个4核CPU了。

在操做系统眼里,如今CPU有4个核,她能够把工做分摊给这4个(虚拟的)核。每一个core均可以独立地执行指令。 总结一下:超线程就是提升虚拟核的一种手段,减小了CPU处于空闲状态的时间。

角度3:超线程是如何实现的

咱们仍是从最开始、最简单的提及。

首先是单核CPU,树莓派使用的就是单核CPU,可是树莓派依然能够运行多任务的linux系统。为何呢?实际上在底层,操做系统在不停地切换不一样的任务,速度之快到让你以为他们是真的同时运行的。

而后是多核CPU,如上所说的,不一样的core之间在逻辑上是独立的,他们会共享一些资源。操做系统就能够给不一样的core分发不一样的任务,若是你要运行一个多线程的任务,你拥有的core越多,速度就会越快。

再而后就是超线程了。要在一个core上面实现两个线程,那么这个core该怎么设计呢?

把一个core的前半部分复制一下,而后合在一块儿,再和后半部分拼接一下,这种状况下,咱们就有了一个能够同时执行两个线程的FRONTEND,或者以一个程序员更容易理解的角度来讲,有了一个能够执行双线程的api接口,对于操做系统来讲,他能够"调用"这个接口,同时分两个任务给这个core!这样不就在一个core的基础上实现了双线程吗?(固然,在最后,这两个线程最终是须要合并的。)

把这种core组合一下,就成了多核CPU,且每一个CPU都支持超线程技术。

接着再来看一个现实生活中的栗子:地铁过安检。

排了有两个队,可是只有一个安检员。分三种状况讨论:

  • 对面那队是空的,这种状况下我这一对能够很快经过。
  • 对面那队阻塞了,这对我这一队没有影响,咱们能够不受影响地经过。
  • 两队都是正常的,这个时候在安检员那儿,就会产生竞争核堵塞。

把队伍换成前面说的两个FRONTEND接口,把安检员看成是core,每一个接口都能独立得fetch指令,而后把指令传递给core。core在真正执行指令的时候,是会产生竞争的,**因此在性能上来讲,一个有超线程能力的单核CPU,是没法和一个双核CPU相比的。**只有当其中一个queue阻塞的时候,才能获得双倍的性能。通常而言,有超线程的核,性能上是没有超线程的核的1.25倍。

那么咱们来作一个计算题:一个6核12线程的CPU,和一个8核8线程的CPU,哪个综合性能要好一点?

  • 6核12线程,也就是6个有超线程能力的物理核,实际上能够相等于6 * 1.25 = 7.5个核
  • 8核8线程,就是8个核

因此,8核8线程的性能还要相对好一点。

关注个人微信公众号

相关文章
相关标签/搜索