一、通用的高速缓存存储器组织结构
首先让我们了解一下基本结构、
考虑一个计算机系统,其中每个存储器地址有m位,形成M=2^m个不同的地址。
·高速缓存被组织成一个有S=2^s个高速缓存组的数组。(即一共有S个组)
·每个组包含E个高速缓存行。(即一组里有E行)
·每一行是包括一个B=2^b字节的数据块(block)(又称偏移位),一个有效位(valid bit)指明这个行是否包含有意义的信息(即判断是否命中),还有t=m-(b+s)个标记为(tag bit),他们唯一地标识存储在这个高速缓存行中的块。
对于任意一个地址来说,我们可以把地址拆分成以下形式
· 高速缓存的大小(或容量)C指的是所有块的大小的和,标记位和有效位不包括在此内,
几个比较重要的公式
内存地址的最大数量 | |
组索引位 | |
块偏移量 | |
标记位数量 | |
容量 |
我们可以做一个简单的练习
高速缓存 | m | C | B | E | S | t | s | b |
1 | 32 | 1024 | 4 | 1 | 1024÷4÷1=256 | 32-8-2=22 | 8 | 2 |
2 | 32 | 1024 | 8 | 4 | 32 | 24 | 5 | 3 |
二、直接映射高速缓存
每个组只有一行(E=1)的高速缓存成为直接映射高速缓存
我们来简单看一下,一个值怎样判断他的t、s、b位
接下来我们来做一个练习
假设 M=16Bytes, S=4 , E=1, B=2 ,将以下数值读入高速缓存时是一种什么情况?
首先,由以上条件可以知道 m=4,s=2, b=1 , 可以得知地址address of word为
然后将0,1,7,8,0转换为二进制
1、 “0”,s为00,所以要把它放进第0组。可是我们发现,此时高速缓存中第0组为空,所以此时并没有命中。再看b=0,说明偏移量为0,因为B=2,所以我们可以放两个字节进去,即M[0-1]
.2、接着我们看“1”,s为00,所以我们要把他放进第0组,此时第0组已经存有值,并且tag相吻合,可以直接读到M[1],此时命中
3、“7” ,s为11,所以我们要把他放进第3组,此时第3组为空,所以没有命中。因B=2,放两个字节,即M[6-7]
4、“8” ,s为00,所以我们要把它放进第0组,可这是可以发现,“8”的t,即表示为时1,与0组标识为不相符,所以也没有命中。
接下来,我们就要把第0组原有的值踢走,换进新的值。
5、“0”,s为00,所以我们要把他放进第0组,与上一组一样,二者的标识为并不相符,所以我们继续踢走原有的值,放入新的值
二、组相联高速缓存
直接映射E=1,而组相联告诉缓存放宽了这个限制,E可以>1,我们通常称之为E路组相联高速缓存
假设 M=16Bytes, S=2 , E=2, B=2 ,将以下数值读入高速缓存时是一种什么情况?
1、“0”,s为0,所以我们将他们放在第0组,优先考虑放入第一行,偏移量为0,即放入M[0-1],没有命中
2、“1”,s为0,所以放到第0组,这是我们发现二者标志位相吻合,所以命中
3、“7“,s为1,所以我们放到第1组,偏移量为1,没有命中。可以放入的值可以稍稍计算,偏移为可以取0或1.当b=0时,放入的值为0110,即6;当b=1时,值为0111,即7,所以放入的是M[6-7]。之后的同理
4、”8“,s为0,所以放到第0组,第一行标志位位00,所以不吻合,我们将其放入第二行,没有命中。
5、”0“,s为0,所以放到第0组,第一行标识位与t相吻合,所以命中