存储体系

一、存储器的层次结构

1.1 存储层次的性能参数

(1)存储层次的平均每位价格 C

假设存储器M的容量、访问时间、每位价格为S,T,C,则存储层次的平均每位价格C

(2)命中率 H 和不命中率 F

命中率是指CPU在访问存储系统时,在存储器M中找到所需信息的概率。
不命中率=1-命中率。

(3)平均访存时间 T

二、“Cache-主存”和“主存-辅存”层次

2.1 Cache-主存

2.2 主存-辅存

2.3 比较

三、Cache基本工作原理和结构

3.1 Cache的基本结构

在带Cache的存储器中, CPU的访存地址被分割成两部分:
① 块地址(块框架地址、块号):用于查找该块在Cache中的位置。
② 块内位移(块内偏移量):用于确定所访问的数据在块中的位置。

3.2 Cache的工作过程

(1)当CPU需要进行访存时,首先给出主存实地址。
(2)地址映像变换机构接收到主存实地址后,根据块号判定所访问的信息字是否在Cache中。
若在,通过地址变换机构变换为Cache块地址,在根据块内地址,对Cache进行存取。
若不在,则通知访问Cache块失效。然后通过CPU与主存之间的直接数据通路访问主存,将被访问字直接送给CPU,
并将包含该字的新块装入Cache。若Cache已满,则通过替换策略实现机构,调出某一Cache块,然后装入所需的块。

3.3 映像规则

(1)全相联映像

全相联映像是指主存中的任一块可以被放置到Cache中的任意一个位置。

(2)直接映像

直接映像是指主存中的每一块只能被放置到Cache中唯一的一个位置。

(3)组相联映像

组相联映像是指主存中的每一块可以被放置到Cache中固定的一个组中的任何一个位置。

3.4 替换策略

(1)随机法

随机选择被替换的块。

(2)先进先出(FIFO)

选择最早调入的块作为被替换的块。

(3)最近最少使用法(LRU)

选择近期最少被访问的块作为被替换的块。

3.5 写策略

(1)写直达法(WT)

在执行“写”操作时,不仅把信息写入Cache中相应的块,而且也写入下一级存储器中相应的块。

(2)写回法(WB)

在执行“写”操作时,只把信息写入Cache中相应的块,该块只有在被替换时,才被写回主存。

3.6 数据Cache、指令Cache及混合Cache

数据Cache :存放数据的Cache 。
指令Cache:存放指令的Cache。
混合Cache:既存放数据又存放指令Cache。

对数据的访问有读操作和写操作,对指令的访问仅是读操作。所以数据Cache需要进行写操作,而指令Cache则不需要进行写操作。
读入指令Cache的指令在块替换出去时不需将Cache中的指令写回主存,而读入数据Cache的数据,在进行块替换时,通常需要写回主存。

对相同的容量,指令Cache的命中率比数据Cache的高。
将混合Cache分离成指令Cache和数据Cache有助于提高Cache的命中率。

3.7 Cache性能分析

(1)平均访问时间

平均访问时间=命中时间+失效率×失效开销
平均访存时间=指令所占的百分比×(指令命中时间+指令失效率×失效开销)+数据所占的百分比×(数据命中时间+数据失效率×失效开销)

(2)程序执行时间
在考虑存储器对系统性能影响时,可以将系统性能描述为

CPU时间=(CPU执行周期数+存储器停顿周期数)×时钟周期时间
存储器停顿周期数 = “读”的次数 × 读失效率 × 读失效开销 + “写”的次数 × 写失效率 × 写失效开销

如果读、写失效率以及读、写失效开销相差不大

存储器停顿周期数 = 访存次数 × 失效率 × 失效开销
CPU时间 = IC × [CPIexe + 访存次数 / 指令数 × 失效率 × 失效开销] × 时钟周期时间

3.8 Cache优化

(1)8种降低失效率方法

增加Cache块大小
提高相联度
增加Cache的容量
Victim Cache
伪相联映像Cache
硬件预取
编译器控制的预取
编译器优化

(2)5种减少失效开销方法

读失效优于写
写缓冲合并
请求字处理技术
非阻塞Cache技术
采用两级Cache

(3)4种减少命中时间方法

容量小、结构简单的Cache
虚拟Cache
Cache 访问流水化
Trace Cache

3.9 降低Cache失效率的方法

(1)失效的原因

1)强制性失效:当第一次访问一个块时,该快不在Cache中,需从下一级存储器中调入Cache,这就是强制性失效。
2)容量失效:如果程序执行时所需的块不能全部调入Cache中,则当某些块被替换后,若又重新被访问,就是发生失效,
这种失效称为容量失效。
3)冲突失效:在组相联或直接映像Cache中,若太多的块映像到同一组中,则会出现该组中的某个块被别的块替换、然
后又被重新访问的情况,这样就发生了冲突失效。

(2)增加Cache块大小

(3)提高相联度

(4)增加Cache的容量

(5)Victim Cache