上一篇对 CPU 内部结构、CPU 指令集、SMP 和 NUMA 这三个方面做了简单介绍,这篇接着对如下两个知识点做介绍。
超线程与超频
CPU 缓存
1.超线程和超频
很多同学应该听说过超线程这个概念,注意:它与多线程不是一个东西哈。那什么是超线程呢?
通常情况下,一个 CPU 核心同一时刻只能处理一个线程,但是厂商为了能更好的利用 CPU 资源,充分的压榨 CPU 的能力,于是利用核心的寄存器给 CPU 核心多设置了一个上下文,每个上下文就可以运行一个线程,那么在逻辑上就相当于多了一个 CPU 核心,这就是超线程技术的原理。注意,这只是在逻辑上让一个 CPU 核心变成了两个,实际上还是只有一个核心。
如何开启超线程呢?通常是在 BIOS 的设置里面进行开启, 可以在 BIOS 中找找 Hyber Threading 或者 HT 关键字,通常都是默认开启的。开启超线程可以更好的支持我们平时的多任务工作,使得操作系统的响应速度更快。
超频是指人为通过某种技术手段提高 CPU 的频率,CPU 频率提高意味着处理能力更强。通常来说 CPU 在出厂时会将 CPU 的频率上限给锁定到某个阈值,这样可以使得 CPU 工作更稳定,寿命更长久。但是总有些技术爱好者比较喜欢用最少的钱获取较好的产品体验,将 CPU 的这个频率阈值限制破坏掉进行 CPU 超频,强行提升了 CPU 的性价比,这种行为在早几年是比较多见的。以前的 Intel 奔腾系列、赛扬系列经常被用来超频,那时候的制程是 90nm,CPU 主频是 3GHz 左右。现在估计比较少人去做超频了,毕竟在不超频的情况下,个人消费级别的 CPU 都 4 GHz 左右,好一点的甚至 5 GHz 往上,没必要再搞超频。
CPU 被锁频的原因除了商业因素外,主要是因为超频容易导致 CPU 损坏或者由于散热不好带来的问题。
2.CPU 缓存
现代的 CPU 一般来说都会有三级缓存:L1、L2、L3,所以 CPU 并不是直接与内存进行连接的,中间还隔着这几层 CPU 缓存。在金字塔式存储体系中它位于自顶向下的第二层,仅次于 CPU 寄存器,所以它的速度是比内存快很多,比寄存器稍慢一点。在容量上,L1、L2、L3 依次逐渐增大。
CPU 缓存是为了加快CPU读取数据的速度,同时也给内存一个缓冲期,因为 CPU 的速度实在是太快了,内存的速度完全跟不上,而 CPU 缓存的数据交换比内存快多了,如果缓存有对应的数据则直接从缓存读取数据就行。那 CPU 缓存与内存在速度方面究竟相差多大呢,请看下面这张图:
可以看到 CPU 缓存与内存在速度方面相差大概是 100 倍左右(图中的 DRAM 是内存)。CPU 缓存的组成如下图所示:
上面是 CPU 核心,每个 CPU 核心会独占一套 L1 和 L2 缓存,最下面的 L3 缓存是所有 CPU 核心共享的。同时还可以看到 L1 缓存是分成了两个部分:指令缓存、数据缓存,L2/L3 则不分。
CPU 缓存主要是利用局部性原理将 CPU 的性能提升一大截。什么意思呢?想象一下如果没有这些缓存,CPU 每次从内存获取一条指令都需要很久,那如果将 CPU 下一步获取的指令提前加载到这些 CPU 缓存中,CPU 就可以快速获取下一条指令,不用再从内存获取,这不就大大提升了 CPU 的处理速度吗?当 L1 找不到时,继续往 L2 找,如果 L2 找不到则继续往 L3 找,还是找不到的话就到内存里面找,一级级往下肯定能找到。为了让 CPU 下一步想要的指令或者数据能预先加载到缓存,这就需要这些指令或者数据能聚集在一段连续的内存空间里,这就是局部性原理。为了达到这个局部性原理,操作系统在编译源码或者调度进程时都会做大量的优化工作,让局部性原理更好的工作。