美文网首页
CPU高速缓存的数据结构和读取过程

CPU高速缓存的数据结构和读取过程

作者: airmy丶 | 来源:发表于2019-11-08 20:02 被阅读0次

    来自深入浅出计算机组成原理

    根据摩尔定律,CPU的处理速度每18个月就会翻一倍。虽然内存的访问速度随着硬件条件和软件条件也在不断地额提示,但是远远不如CPU提升的那么快。随着CPU和内存速度差异越来越大,CPU的性能并不能被利用的很高(CPU会主要等待从内存中读取数据)。所以为了CPU的处理性能能被高效利用,现代CPU都引入了高速缓存。


    CPU和内存性能提升图

    所谓的高速缓存(CPU Cache),就是我们常说的一级,二级,三级缓存。也是嵌入在CPU芯片中的芯片组。访问速度逐级减小而容量增加增大。

    因为CPU会花上很多时间等待从内存中读取数据来执行,加载到 CPU Cache 里。CPU 从内存中读取数据到 CPU Cache 的过程中,是一小块一小块来读取数据的,而不是按照单个数组元素来读取数据的。这样一小块一小块的数据,在 CPU Cache 里面,我们把它叫作 Cache Line(缓存块)

    在CPU读取数据的时候,会先去访问Cache,只有当Cache中没有数据时,CPU才会去访问内存。并将读取到的数据写入到Cache中(局部性原理,每一层Cache中都缓存最近使用的数据)。由于Cache的访问速度比内存快很多,所以CPU就不必花太多的时间在数据读取上,这个过程就好像我们在Web开发中的加一个缓存层。


    image.png

    那么问题来了,一段程序,经过编译汇编之后会分配对应的内存地址,并没有对应的高速缓存地址,CPU可以直接根据这个内存地址去读取所需要的数据,如果是在Cache中,那CPU是如何知道对应内存地址的数据,是在Cache中哪个位置呢?

    直接映射 Cache(Direct Mapped Cache)

    CPU读取数据是按内存块来读取,CPU读取内存的地址,首先肯定是定位到地址所在的内存块(有点像数据库的页)。直接映射采用策略是,任何一个内存块的地址,始终映射到一个固定的CPU Cache地址 (CPU Line),这个映射关系就是通过mod运算来实现的。


    Cache和内存的映射

    加入内存被划分为32个内存块,Cache被划分为8个 Cache Line,想要访问第29号内存块,就用第N个 Cache mod 8(总Cache Line数量),于是发现29号内存块的数据在 Cacle Line 5 上面。

    一般来说,内存和 Cache 会被划分为2^N 块,这样做的好处是,假设 Cache 被划分为8块为 2^3 内存被划分为32块为 2^5,那么低N个内存块的二进制数的低3位就是对应的 Cache Line 的位置。


    image.png

    那么问题又来了,上面得例子,29号内存块映射到了5号 Cache Line 3号内存块也映射到了相同的位置,21号内存块也是,那么怎么从第5号的 Cache Line 区分到底是哪个内存块的数据呢?这个时候二进制数的好处又来了,前面说过内存块二进制数低N位表示的是 Cache Line 的位置,那么其余的高位就可以作为组标记(Tag)标识是具体哪个内存块的数据。

    但是仅仅有组标记还是不够的,我们只是确定了内存被映射到的 Cache 的块中,这个块中还存储着很多来自这个内存中的很多数据。那么怎么确定想要读取的具体数据呢?所以缓存块中还需要记录更多的信息一个是偏移量(offset),就是数据在块中的相对位置

    还有一个就是有效位(valid bit)。有效位就是来标记对应的缓存块中的数据是否是有效的,确保不是机器刚刚启动时候的空数据。如果有效位是 0,无论其中的组标记和 Cache Line 里的数据内容是什么,CPU 都不会管这些数据,而要直接访问内存,重新加载数据。

    内存和Cache实际映射

    所以 Cache 中通过索引(偏移量)+有效位+组标记+数据的组合,可以让CPU准确的直接从 Cache 中加载内存地址对应的 Cache 中的数据。而CPU从 Cache 中读取数据需要经过以下步骤:

    1.通过内存地址的低位确定对应 Cache 中的位置。

    2.判断有效位,数据有效就进行下面操作,无效则从内存中读取。

    3.对比内存地址的高位和Cache中的组标记,判断是否就是要访问的内存数据,如果是就从 Cache 块中读取数据。

    4.通过偏移位读取具体的数据。

    现代CPU高速缓存已经不再使用直接映射这种方式,取而代之的是全相连 Cache(Fully Associative Cache)、组相连 Cache(Set Associative Cache)这样的策略。但是原理都是差不多想通的,能理解直接映射这种策略,其他的策略都应该还可以。

    阅读思考

    CPU高速缓存的接口和读取过程,和mysql数据库的页存储结构真的很像。查找流程也是。而且缓存层的思想也很现代的很多编程思想非常的类似。真的是获益匪浅。

    相关文章

      网友评论

          本文标题:CPU高速缓存的数据结构和读取过程

          本文链接:https://www.haomeiwen.com/subject/rzhibctx.html