6.4高速缓存存储器

早期的计算机系统存储器结构只有寄存器,主存,磁盘存储三部分,但是后来由于CPU和主存间的访问速度差距越来越大,不得不引用高速缓存(L1,L2)插入到寄存器和主存之间,形成存储器典型的层次模型来弥合硬件间巨大的速度隔阂。
******
通用高速缓存存储器的机构
主要注意两个部分:
一、高速缓存存储器结构
高速缓存存储器是高速缓存组的数组,我们记为memory[S],其中共有S=2^s个缓存组,每组由E个缓存行,每行又包括三部分:有效位(1bit)+标记位(tbits)+高速缓存块(B=2^b个字节)。高速缓存的大小或容量指的是其中所有块的大小(不包括有效位和标记位),记为C=S*E*B
二、存储器地址的高速缓存地址解析
如果存储器地址共有m位,则最多可以标识2^m个存储地址。高速缓存存储器会用自己的方式来解释通用的m位地址表示。其中结构如下:
m bits[H]-t bits---s bits---b bits-[L]  其中,
s bits用来表示位于高速缓存存储器中的哪一组;
t bits用来标识位于高速缓存存储组中的哪一行;
b bits用来标识位于高速缓存行中数据块的偏移量(每个块中有多个字节)
并且,t=m-s-b得到
******
高速缓存读取过程——以直接映射高速缓存为例
@所谓的直接映射高速缓存,即位E=1的高速缓存存储器结构
@组联高速缓存,即1@全相联高速缓存,即E=C/B(这时候只有一个缓存组,所有的行均位于一个组中,地址位中s=0)
高速缓存工作过程:
Step1--CPU发出读取地址m处的字word的指令;
Step2--首先搜索高速缓存,遵循以下流程
            Read s of m and locate the s group in 高速缓存;
            if(有效位=1&&行标识位==缓存中的行标识位)
                 Read(b-offset) and 提交给寄存器;
                 Return 缓存命中;
           else
                 Return 缓存不命中;
                 Read word from memory to 高速缓存;
                 高速缓存put forward the word to Register;
Step3--CPU request new word Goto Step2;
*******
在实际读取中有可能出现高速缓存冲突不命中的情况,这种情况源于虽然有足够的高速缓存空间,但是我们的程序却交替地引用映射到同一个组的块,使得每次搜寻缓存都因为反复替换而不命中,降低了程序执行效率。解决方法是添加某些位使冲突的数据映射到高速缓存不同的行。
******
在通过高速缓存向存储器中写入数据的时候,有两种方式:
直写(write-through):每次更改了缓存中的数据,就立即更新到更低一层。这种方式虽然简单,但是每次都会引起总线流量(系统总线/存储器总线)
写回(write-back):尽可能推迟存储器更新,只有当替换算法驱逐更新过的块时才将其写入更低一层。这种方法显著地减少总线流量,但是却需要额外标记修改位(dirty bit)。
@建议使用写回方法@
真实的高速缓存层次结构——
如Inter Core i7,
CPU包中含有4个核,
核0-                                                              核3-
Registers                                                      Registers
     ||                                                            ||
L1(d-cache)+L1(i-cache)                            L1(d-cache)+L2(i-cache)
     ||                                                            ||
L2(unified cache)                                        L2(unfied cache)
              |||                                                  |||
                               L3(unified cache)
                                   ||||
                                 Primary Memory

PS:这里的一级缓存细化为两个独立缓存,d-cache仅仅用来存储程序数据,i-cache仅仅用来存储程序指令








12-22 21:49