缓存Cache

发布时间 2023-09-22 14:58:59作者: Xxaj5

研究生课程老师给了一篇论文,是关于缓存的,看完Abstract一脸懵逼之后决定来恶补一下,视频是观看的计算机组成原理(哈工大刘宏伟),这个随笔里的截图什么也都是视频里直接截图的,我只是想做个笔记自己之后再看~~~。

一、缓存存在的目的
image
程序局部性原理:通俗来讲就是一个变量在程序运行过程中,如果被引用过一次,那后续很有可能会再被引用到。在这里如果CPU访问一个块,那就将其调入缓存,我们认为CPU后边还会多次访问这个块,这样速度就能提高。

二、工作原理
(1)内存与缓存的编址
image
内存与Cache的块大小相同,但是数量不同,内存中的块的个数会远远大于Cache中的块的个数。两者的块内大小完全相同,两者传输数据的单位就是一个块,所以块内字节顺序不变,两者一一对应。Cache上的标记,标记了内存块和Cache块的对应关系,如果内存块要调入到Cache中,那么Cache相应的块的标记就是内存块号,CPU想要找内存中的块的话就先利用标记从Cache中找。

(2)命中与未命中
image

(3)Cache-内存系统效率

\[效率e = \cfrac{访问Cache 的时间}{平均访问时间} \times 100\% \]

设Cache命中率为\(h\),访问Cache的时间为\(t_c\),访问主存的时间为\(t_m\),那么:

\[效率e = \cfrac{t_c}{h \times t_c + (1 - h) \times t_m} \times 100\% \]

\(h = 0\)时,说明一次都没有命中,\(e\)达到最小值\(\cfrac{t_c}{t_m}\)
\(h = 1\)时,说明全部命中,\(e\)达到最大值\(1\),即\(100\%\)命中率。

三、Cache基本结构
image
CPU访问内存,需要给出地址(块号 + 块内地址),其中块内地址相同,Cache块号需要将内存块号输入到映射变换机构获得,然后判断是否命中,如果命中,则直接从Cache中调入CPU;如果不命中,则需要访问内存,同时判断内存块是否能够调入Cache,如果Cache满,则需要进入替换机构执行替换算法,如果Cache没满,则直接调入。

四、Cache的读写操作
(1)读操作
image
(2)写操作
image

四、Cache的地址映射

  • 直接映射
  • 全相联映射
  • 组相联映射
    (1)直接映射
    image
    根据Cache长度和内存长度,把内存划分为若干个分区,每个分区大小与Cache的大小相同,就是包含的字块数相同,所以每个分区中的第0块就只能调入到Cache的第0块,每个分区的第1块,就只能调入到Cache的第1块......,Cache每一块前边的标记就是当前块在内存(主存储体)的分区号,CPU给出的访问地址就是主存子块标记(分区号) + Cache子块地址(块号) + 字块内地址,比较器就可以直接比较主存子块标记和Cache子块标记即可(分区号),缺点就是容易发生冲突,导致Cache利用率很低,因为内存的每一块能够调入Cache的位置只有一块,假如现在Cache中只有内存分区0中的第1块,现在CPU想要内存分区1中的第1块,这样就只能把Cache中第1块挤出去,但是明明Cache还有很多其他位置,这就导致了利用率低。

(2)全相联映射
image
内存的每一块都可以存放到Cache的任何一块,Cache中的标记是当前块在内存中的块号,这样Cache利用率高了,但是找起来就麻烦了,当CPU给出访问地址后,需要从头到尾在Cache中对着标记挨着找。

(3)组相联映射
image
就是直接相联和全相联的折衷。
先将Cache分成块,然后再分成组,每组中可以包含2,4,6......块,Cache分成了多少组,内存中每个分区就包含了多少块,就是内存中每个分区的第0块就只能去Cache的第0组,第1块就只能去Cache的第1组,......,去到Cache的组里之后就属于是全相联了,就可以随便选位置。

四、替换算法
(1)FIFO先进先出算法
最早进入Cache的块会在Cache满后最早被替换出去。
(2)近期最少使用算法LRU算法
最近一段时间里是用最少的块会被替换走,比较好的体现了程序的局部性(时间局部性)。