文章目录
存储器结构层次
RAM 随机访问存储器
- SRAM
高速缓存存储器 - DRAM
主存、图形系统的帧缓冲区
存储器层次结构中的缓存
图:存储器层次结构中基本的缓存原理
高速缓存存储器
在一个每个存储器地址有 m 位的计算机系统中,形成 M = x ^ m 个不同的地址。
此时高速缓存被组织成一个有 S = 2 ^ s 个高速缓存组(cache set)的数组,每个组包含 E 个高速缓存行(cache line)。
每个行是由一个 B = 2 ^ b 字节的数据块(block)组成的,一个有效位(valid bit)指明这个行是否包含有意义的信息,还有 t = m - (b + s) 个标记位(tag bit)(是当前块的内存地址的位的一个子集),唯一的标识存储在这个高速缓存行中的块。
图:高速缓存(S,E,B,m)的通用组织
参数 S 和 B 将 m 个地址位分为了三个字段:
- s 个组索引位
- t 个标记位
- b 个块偏移位
为什么用中间位来作为高速缓存的索引?以中间位作为索引,相邻的块总是映射到不同的高速缓存行。
图:直接映射高速缓存(E = 1)
当程序访问大小是 2 的幂的数组时,直接映射高速缓存中通常会发生冲突不命中。
图:组相联高速缓存(1 < E < C / B)
图:组相联高速缓存(E = C / B)
- 写命中( 假设要写一个已经缓存了的字 w 在高速缓存更新了它的 w 的副本之后,如何更新 w 在层次结构中紧接着第一层中的副本呢?)
- 直写
立即将 w 的高速缓存块写回到紧接着的第一层中,缺点是每次写都会引起总线流量 - 写回
尽可能的推迟更新,只有当替换算法要驱逐这个更新过的块时,才把它写到紧接着的低一层中。显著地减少了总线流量,但是增加了复杂性(需要维护块是否被修改过)
- 直写
- 写不命中
- 写分配
加载相应的低一层得块到高速缓存中,然后更新这个高速缓存块。写分配试图利用写的空间局部性,缺点是每次不命中都会导致一个块从低一层传送到高速缓存 - 非写分配
避开高速缓存,直接把这个字写到低一层中
- 写分配
只写<==>非写分配
写回<==>写分配
实现FIFO、LRU、LRU-K、LFU
使用分块来提高时间局部性(提高内循环的时间局部性)
标签:缓存,存储器,更新,层次结构,命中,高速缓存 From: https://blog.csdn.net/liu_shibo/article/details/139276487