CPU缓存基础知识(一)|Java 开发实战

257 阅读7分钟

 目录结构

一、CPU缓存基础知识

二、缓存命中

三、缓存的一致性

四、典型用例

五、队列伪共享

image

 前言导读

基本上cpu缓存知识是进入大厂的一个基本知识点了,而且也相当看重,这部分的知识掌握的比较好的话,会很加分的!

说下历史:

在计算的前几十年中,主内存非常慢且昂贵得令人难以置信,但是CPU也不是特别快。从1980年代开始,差距开始迅速扩大。微处理器的时钟速度飞速发展,但是内存访问时间的改善远没有那么明显。随着这种差距的扩大,越来越明显的是需要一种新型的快速存储器来弥合这种差距。

1980及以前:cpu没有cache

1980~1995:  cpu开始有2级缓存

至今:有过L4,有些有L0,普遍有L1、L2、L3

image

 实战演练

CPU缓存基础知识

寄存器(Register)是中央处理器内用来暂存指令、数据和地址的电脑存储器。寄存器的存贮容量有限,读写速度非常快。在计算机体系结构里,寄存器存储在已知时间点所作计算的中间结果,通过快速地访问数据来加速计算机程序的运行。

寄存器位于存储器层次结构的最顶端,也是CPU可以读写的最快的存储器。寄存器通常都是以他们可以保存的比特数量来计量,举例来说,一个8位寄存器或32位寄存器。在中央处理器中,包含寄存器的部件有指令寄存器(IR)、程序计数器和累加器。寄存器现在都以寄存器数组的方式来实现,但是他们也可能使用单独的触发器、高速的核心存储器、薄膜存储器以及在数种机器上的其他方式来实现出来。

寄存器也可以指代由一个指令之输出或输入可以直接索引到的寄存器组群,这些寄存器的更确切的名称为“架构寄存器”。例如,x86指令集定义八个32位寄存器的集合,但一个实现x86指令集的CPU内部可能会有八个以上的寄存器。

CPU 缓存

在计算机系统中,CPU高速缓存(英语:CPU Cache,在本文中简称缓存)是用于减少处理器访问内存所需平均时间的部件。在金字塔式存储体系中它位于自顶向下的第二层,仅次于CPU寄存器。其容量远小于内存,但速度却可以接近处理器的频率。

当处理器发出内存访问请求时,会先查看缓存内是否有请求数据。如果存在(命中),则不经访问内存直接返回该数据;如果不存在(失效),则要先把内存中的相应数据载入缓存,再将其返回处理器。

缓存之所以有效,主要是因为程序运行时对内存的访问呈现局部性(Locality)特征。这种局部性既包括空间局部性(Spatial Locality),也包括时间局部性(Temporal Locality)。有效利用这种局部性,缓存可以达到极高的命中率。

在处理器看来,缓存是一个透明部件。因此,程序员通常无法直接干预对缓存的操作。但是,确实可以根据缓存的特点对程序代码实施特定优化,从而更好地利用缓存。

目前的计算机普遍都有3级缓存(L1、L2、L3),来看看结构:

image

其中:

  • L1缓分成两种,一种是指令缓存,一种是数据缓存。L2缓存和L3缓存不分指令和数据。

  • L1和L2缓存在每一个CPU核中,L3则是所有CPU核心共享的内存。

  • L1、L2、L3的越离CPU近就越小,速度也越快,越离CPU远,速度也越慢。

  • 再往后面就是内存,内存的后面就是硬盘

再来看看它们的速度:

image

看下我工作用的处理器吧,虽然有点垃圾~

image

具体的信息我们可以看到:

L1的速度是主存的约27~36倍,L1、L2都是KB级别的,L3是M级别的,L1分为数据和指令缓存分别为32KB。想一想为什么没有L4?

下面来看一张图

image

来自Anandtech的Haswell评论的这张图表很有用,因为它说明了添加巨大的(128MB)L4缓存以及常规L1 / L2 / L3结构对性能的影响。每个阶梯代表一个新的缓存级别。红线是带有L4的芯片-请注意,对于大文件,它的速度仍然几乎是其他两块英特尔芯片的两倍。但是较大的缓存需要更多的晶体管既慢又昂贵,而且还要增加芯片的尺寸。

那有没有L0呢?

答案是:有的。现代CPU通常还具有非常小的“ L0”高速缓存,其大小通常只有几KB,用于存储微操作。AMD和Intel都使用这种缓存。Zen的缓存为2,048 µOP,而Zen 2的缓存为4,096 µOP。这些微小的缓存池在与L1和L2相同的通用原则下运行,但是代表的是甚至更小的内存池,CPU可以以比L1更低的延迟来访问它们。通常,公司会相互调整这些功能。Zen 1和Zen +(Ryzen 1xxx,2xxx,3xxx APU)具有一个64KB L1指令高速缓存,该指令高速缓存是4路关联的,并具有一个2,048 µOP L0高速缓存。Zen 2(Ryzen 3xxx台式机CPU,Ryzen Mobile 4xxx)具有一个32KB L1指令高速缓存,该指令高速缓存是8路关联的,并且具有4,096 µOP高速缓存。将设置的关联性和µOP缓存的大小加倍,可以使AMD将L1缓存的大小减少一半。

说了这么多,cpu缓存到底是怎么工作的嘛?

cpu缓存存在的目的:我cpu这么快,我每次去主存去取数据那代价也太大了,我就在我自己开辟一个内存池,来存我最想要的一些数据。那哪些数据可以被加载到cpu缓存道中来呢?复杂的计算和编程代码呗。

如果我在L1的内存池当中没有找到我想要的数据呢?就是缓存未命中

还能怎么办,去L2找呗,一些处理器使用包含性缓存设计(意味着存储在L1缓存中的数据也将在L2缓存中重复),而其他处理器则是互斥的(意味着两个缓存永不共享数据)。如果在L2高速缓存中找不到数据,则CPU会继续沿链条向下移动到L3(通常仍在裸片上),然后是L4(如果存在)和主内存(DRAM)。

又引出一个问题:怎么找才是比较高效的呢?cpu不可能挨着挨着遍历吧

下面一篇就会讲怎么缓存命中,敬请期待吧~

真心感谢帅逼靓女们能看到这里,如果这个文章写得还不错,觉得有点东西的话

求点赞👍 求关注❤️ 求分享👥 对8块腹肌的我来说真的 非常有用!!!

如果本篇博客有任何错误,请批评指教,不胜感激 !❤️❤️❤️❤️