关于缓存那点事(二)| 8月更文挑战

关于缓存那点事

这是我参与8月更文挑战的第4天,活动详情查看:8月更文挑战

引言:上一节我们先了解了缓存的定义、为什么要用缓存以及局部性原理等,这一节我们继续将关于缓存的那些事。

cpu如何访问缓存中的数据

CPU CatchRedis 缓存访问类似,都是先访问缓存,如果缓存不存在就访问内存或者数据库

高速缓存存储器

  • 直接映射高速缓存
  • 全相联高速缓存
  • 组相联高速缓存

地址映射的定义:

主存地址按某种规律(函数)映射到cache中,当cpu访问的时候,其内存会自动转换成cache地址。
复制代码

直接映射高速缓存

CPU访问内存数据时按缓存行大小进行读写,一般为64字节。将内存将缓存行大小切分,每个内存地址必定会落到某个内存块上,数据在这个内存块的偏移量也是确定的,然后通过索引号映射关系进行确定。

索引号:CPU直接映射是通过取余运算实现的,要求缓存行个数必须为2^n,这样可以直接用低位表示索引行。
偏移量:根据块大小进行确定偏移量。
复制代码

在这种映射方式下,每个主存块至于一个缓存块相对应,映射关系为:
i=j mod C 或 i=j mod 2^c
其中,i为缓存块号,j为主存块号。在这种取模方式下,很容易就知道每个缓存块对应若干个主存块。

其存储类似下图:

image.png

根据上图很容易发现,该存储肯定存在碰撞也就是冲突,为了应对这个问题,我们需要向高速缓存中添加标记,通过内存的高位来提供标记位,并将中间位作为组索引,以使我们能够区分映射到同一高速缓存块的不同存储位置。我们通过将高速缓存块标记与块索引组合起来,就可以准确的知道主存储器的哪些地址存储在高速缓存中。

高速缓存用中间位做索引:原因是如果高位做索引,那么一些连续内存块可能会被映射到相同的高速缓存块,这就无法提供良好的空间局部性,导致性能下降。如下图:

image.png

直接映射优点:硬件简单、成本低、地址变换快

直接映射缺点:Cache的存储空间得不到充分利用,容易产生冲突。
复制代码

全相联高速缓存

主存中的一个地址可以映射进任意cache line,但是判断地址是否在缓存中的时候需要遍历每一个cache line。 全相联高速缓存由一个包含所有高速缓存行的组组成。如下是其基本结构:

image.png

全相联映射方式比较灵活

组相联高速缓存

直接映射高速缓存中冲突不命中造成的问题源于一个组只有一行,组相连高速缓存放松了这个限制,也就是说一个组有多个高速缓存行。具体结构如下:

image.png

全相联高速缓存中的行匹配和字选择

image.png

因为组相连中高速缓存中的行匹配要检查多个行的标记位和有效位,所以要比直接映射复杂。相联存储器是一个(key,value)对的数组,所以我们可以把组相联中的每个组看成一个小的相联存储器,key是标记位和有效位,而value就是块的内容。

image.png

结语:至此高速缓存中的三种通用存储器介绍完毕!

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享