讲讲线程、进程和CPU中的超线程,超线程

我们先来回顾一下之前的内容。CPU其实就是执行指令的器件,指令从哪读取要看PC寄存器,取得的指令需要翻译成电路的控制信号,最后输出一条指令的结果,这个结果可能会对下一条指令产生影响,也可能会对内存或地址空间中的某个值产生影响。

今天我们来讲讲线程、进程和CPU中的超线程。

我们通过不计其数的指令的组合,可以形成一个完整的线程。线程之间通过少量的必要的沟通组合形成一个进程,也就是我们通常意义上的应用程序。比如说音乐播放器中,音乐的播放是一个线程,用户的操作界面是另外一个线程,两个线程合起来构成了音乐播放器。当然,一个应用程序(进程)也可以只有一个线程。

早期的计算机不像现在如此发达,一般一台计算机一段时间内只运行一个线程,比如说计算导弹轨迹什么的,在计算完成后输出结果,线程结束。然而时代在改变,在写这段文字的时候,我的平板一边打开着wps,一边播放着音乐。这两个进程的运行是连续的、同时的。

为什么会连续、同时呢?

首先,当今的CPU的核心数早已不是单核心,一个非超线程(一会会讲)的核心可以运行一个线程,现在的八核CPU就可以同时运行八个线程。但是这样够吗?我们现在的电脑同一时刻需要运行的线程可远不止八个。那看来光有核心数还不够,我们还需要别的办法。

第二个办法便是分时间片。CPU运算速度极快,我们能不能让CPU在这一些线程上反复横跳,快速切换并轮流执行这些个线程,营造出一种这些线程是同时进行的错觉。具体怎么操作呢?可以设置一个“闹钟”,当倒计时结束的时候强行停止CPU当前的线程(中断),PC寄存器跳转到相应的地址,将当前未处理完的线程的PC值、寄存器组数据等信息用一种数据类型保存到内存中,CPU将根据操作系统给出的决定切换到接下来要运行的下一个线程。CPU此时要将接下来要运行的线程从内存中读取,恢复该线程到CPU内核心中,就像它之前被切换出去时的样子,然后开始执行这个线程。(暂不细讲)

第三个方法则是今天的主角--超线程技术。这个技术我没记错的话是Intel率先提出来的,他们声称增加5%的晶体管数量可以提升20%的性能。

具体怎么操作呢?首先我们先要考虑一下为什么一个核心只能同时运行一个线程。

1.只有一个PC寄存器,只能指示一个线程目前运行到哪了。

2.无法区分对寄存器组的操作。比如线程A要把第一个寄存器的值写成0,B要读出第一个寄存器的值,现在也就是0。但这个0是B想要的吗?肯定不是。

3.还有一些涉及到线程的栈指针和页表基地址的寄存器,也只能支撑一个线程的运行。

因此,超线程简单来讲就是把这些不能公用的资源加倍。而那些流水线上的操作逻辑电路、ALU单元等则可以不用复制。以此实现多个线程同时在一个CPU的核心中进行处理。注意,不一定一个核心只能虚拟出两个线程,IBM的某款CPU甚至一个核心虚拟出了八个线程。

那为什么性能会提升呢?共用了这么多资源,性能应该会有所下降才对。是的,有些时候性能确实会下滑,尤其是某个线程需要很大计算量的时候,因为共用,可能会导致该线程运行速度减慢。那Intel是瞎吹他们的超线程技术吗?并不是,往往CPU限制运行速度的不是计算而是读写。读写要做的就是等待数据的传输,这个过程CPU没事可做,只能空等。但有了超线程就不一样了,CPU可以在本该空等的地方择机执行另外一个线程的指令,实现了时间管理,缩短了两个程序执行的总体时间。


审核编辑:刘清

相关推荐

相关文章