早期的计算机系统存储器结构只有寄存器,主存,磁盘存储三部分,但是后来由于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