当前位置: 首页 > news >正文

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

角度1:举个栗子

假设我是一个CPU,我现在需要process(吃)一些食物,我现在只有一张嘴。

假如我有多张嘴,肯定就可以process更多的食物。这就是multi-core processor所要想要完成的任务。但是由于某些原因及限制,有时候无法实现这种方式。

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

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

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


与之相反的,吃很多糖果。吃红色的糖和吃蓝色的糖之间,是没有任何先后关系的。如果现在我有多张手、多张嘴,肯定是可以更多吃完这糖果的。

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

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

比如编辑视频,视频是一帧一帧的,完全可以在编辑这一帧的时候同时编辑另外一帧。

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

角度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线程的性能还要相对好一点。

相关文章:

  • linux awk命令详解
  • 常用的math函数
  • Apache的基本使用
  • 『飞行路线 分层图最短路』
  • 操作系统
  • 《Java编程思想》读书笔记-对象导论
  • 烟波钓叟歌
  • React-setState杂记
  • Android开发学习笔记:浅谈GridView
  • 我从来不理解JavaScript闭包,直到有人这样向我解释它...
  • ExtJs自学教程(1):一切从API開始
  • Create React App 使用
  • 演练5-5:Contoso大学校园管理系统5
  • [USACO12DEC]逃跑的BarnRunning Away From…
  • SpiderData 2019年2月13日 DApp数据排行榜
  • 【译】JS基础算法脚本:字符串结尾
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • [译]Python中的类属性与实例属性的区别
  • 【RocksDB】TransactionDB源码分析
  • 【翻译】babel对TC39装饰器草案的实现
  • android 一些 utils
  • CSS居中完全指南——构建CSS居中决策树
  • ES6语法详解(一)
  • IDEA常用插件整理
  • JS创建对象模式及其对象原型链探究(一):Object模式
  • Linux中的硬链接与软链接
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • PHP面试之三:MySQL数据库
  • python学习笔记-类对象的信息
  • TypeScript实现数据结构(一)栈,队列,链表
  • UMLCHINA 首席专家潘加宇鼎力推荐
  • windows下如何用phpstorm同步测试服务器
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 分布式熔断降级平台aegis
  • 规范化安全开发 KOA 手脚架
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 深入浏览器事件循环的本质
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 算法系列——算法入门之递归分而治之思想的实现
  • 详解NodeJs流之一
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • 1.Ext JS 建立web开发工程
  • ​LeetCode解法汇总2182. 构造限制重复的字符串
  • ​queue --- 一个同步的队列类​
  • # include “ “ 和 # include < >两者的区别
  • #QT(一种朴素的计算器实现方法)
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • $GOPATH/go.mod exists but should not goland
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (BFS)hdoj2377-Bus Pass
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (八)c52学习之旅-中断实验
  • (附源码)springboot工单管理系统 毕业设计 964158
  • (附源码)ssm码农论坛 毕业设计 231126