当前位置: 首页 > 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数据排行榜
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • GraphQL学习过程应该是这样的
  • iOS | NSProxy
  • JS变量作用域
  • oschina
  • PAT A1120
  • SSH 免密登录
  • underscore源码剖析之整体架构
  • uni-app项目数字滚动
  • 机器学习学习笔记一
  • 入口文件开始,分析Vue源码实现
  • 原创:新手布局福音!微信小程序使用flex的一些基础样式属性(一)
  • 做一名精致的JavaScripter 01:JavaScript简介
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • ###C语言程序设计-----C语言学习(3)#
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • $.ajax,axios,fetch三种ajax请求的区别
  • $L^p$ 调和函数恒为零
  • (13):Silverlight 2 数据与通信之WebRequest
  • (3)选择元素——(17)练习(Exercises)
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (论文阅读11/100)Fast R-CNN
  • (四)c52学习之旅-流水LED灯
  • (太强大了) - Linux 性能监控、测试、优化工具
  • (新)网络工程师考点串讲与真题详解
  • (转)setTimeout 和 setInterval 的区别
  • (转)可以带来幸福的一本书
  • ***测试-HTTP方法
  • .NET Core IdentityServer4实战-开篇介绍与规划
  • .net 重复调用webservice_Java RMI 远程调用详解,优劣势说明
  • .net的socket示例
  • .sh
  • /boot 内存空间不够
  • @31省区市高考时间表来了,祝考试成功
  • @test注解_Spring 自定义注解你了解过吗?
  • [ Linux Audio 篇 ] 音频开发入门基础知识
  • [ NOI 2001 ] 食物链