计算机组成原理·Cache和主存的映射替换算法和写策略
Cache和主存的映射·替换算法·写策略
映射
Cache行中的信息是主存某个块的副本
地址映射:将主存地址空间映射到Cache地址空间,按某种规则将主存的信息装入Cache
Cache的行数比主存块少的多,只有一部分主存块的信息可以装入Cache中,因此在Cache中需要为每块加一个标记,指明它是主存的哪一块的副本,此标记相当于主存块的编号。为了说明Cache行中的信息是否有效还需要一个有效位,地址映射以下3种:
- 直接映射
- 全相联映射
- 组相联映射
直接映射
Cache 行号 = 主存块号 mod Cache 总行数
假设 Cache : \(2^c\)行 主存 : \(2^m\)块
\(0,2^c,2^{c+1},\dots\)块映射到第0行
\(1,2^c+1,2^{c+1}+1\)块映射到第1行
低c位为装入的Cache行号,给每行设置一个长为t=m-c的标记,当某个主存块调入Cache后,将主存块号的高t位设置为对应Cache行中的标记
t | c | b |
---|---|---|
标记 | Cache行号 | 块内地址 |
CPU访存过程:
- 根据访存地址中间的c位找到对应Cache行
- Cache行标记与主存地址高t位标记比较,确定是否有效
- 相等且有效位为1,访问Cache命中,根据主存地址低b位的块内地址,在对应Cache行中存取信息
- 不相等或有效位为0,不命中,CPU将主存读出该地址所在的一块信息送到相应的Cache行中,置有效位1,并将标记设置为地址高t位,同时将地址中的内容送CPU
全相联映射
主存的每一块可以装入Cache中的任何位置,每行标记用于指出该行取自主存的哪一块,CPU访存时需要与所有Cache行的标记进行对比
t | b |
---|---|
标记 | 块内地址 |
组相联映射
将Cache分为Q个大小相等的组,每个主存块可以装入固定组的任意一行,即组间采用直接映射,而组内采用全相联映射,Q=1变为全相联映射,Q=Cache行数变为直接映射
假设r个Cache行,则称之为r路组相联映射
Cache组号=主存块号 mod Cache组数(Q)
t | g | b |
---|---|---|
标记 | 组号 | 块内地址 |
CPU访存:
- 根据访存地址中间的g位组号找到对应的Cache组
- 将对应的Cache组的每个行标记与主存的高t位标记进行比较
- 相等且有效位为1,命中,根据主存地址中的低b位块内地址,在对应的Cache行中存取信息
- 不相等或有效位为0,未命中,CPU从主存读出该地址所在的一块信息送到对应的Cache组的任意一个空行,有效位置1,设置标记,同时将地址中的内容送CPU
替换算法
在采用全相联映射或组相联映射方式时,主存向Cache传送一个新块,Cache或Cache组空间已满替换的策略
- RAND
- FIFO
- LRU
写策略
因为Cache中的内容是主存块副本,当对Cache中的内容进行更新时,就需选用写操作策略,使Cache内容和主存保持一致
对于Cache写命中:
- 全写法:当CPU对Cache写命中时,必须八数据同时写入Cache和内存。当某一块需要替换时,不必把这一块写回主存,用新调入的块直接覆盖。
- 回写法:当CPU对Cache写命中时,只把数据写入Cache,而不立即写入主存,只有当此块被换出时,才写入主存。每个Cache行设置一个修改位(脏位),若修改位为1,Cache行被修改过,替换时需要写回主存,若为0,则说明Cache行中的块未被命中,替换时无需写回
对于Cache写不命中:
- 写分配法:加载主存中的块到Cache中,然后更新这个Cache块
- 非写分配法:只写入主存,不进行调块