寄存器可以在一个时钟周期内访问
SRAM可以在几个CPU时钟周期访问
DRAM主存可以在几十到几百个时钟周期访问
1、存储器层次结构中的缓存
存储器层次结构的中心思想是,对于每个k,位于k层的更快更小的存储设备作为位于k+1层的更大更慢的存储设备的缓存。
下图展示了存储器层次结构中缓存的一般性概念。第k+1层的存储器被划分成连续的数据对象组块,称为块。每个块都有一个唯一的地址或名字,使之区别于其他的块。块可以是固定大小的(通常是这样的),也可以是可变大小的(例如存储在Web服务器上的远程HTML文件)。
数据总是以块大小为传送单元在第k层和第k+1层之间来回复制的。虽然在层次结构中任何一对相邻的层次之间块大小是固定的, 但是其他的层次对之间可以有不同的块大小。
1. 缓存命中
当程序需要第k+1层的某个数据对象d 时,它首先在当前存储在第k层的一个块中查找d。如果d刚好缓存在第k层中, 那么就是我们所说的缓存命中。
2.缓存不命中
顾名思义,也就是第k层中没有缓存数据d。此时第k层的缓存从第k+1层缓存中,取出d的块,如果k满了,会通过一定的策略,选出一个k中的块进行替换。
1.强制不命中(冷不命中)
如果第k层的缓存是空的, 那么对任何数据对象的访问都会不命中。
2. 冲突不命中
只要发生了不命中, 第k层的缓存就必须执行某个放置策略, 确定把它从第k+1层中取出的块放在哪里。随机放置是最灵活的方式,但是对于某些靠近cpu的缓存来说,实现代价很高,通常会使用更加严格的放置策略。这个策略将第k+1层的某个块限制放置在第k层块的一个小的子集中(有时只是一个块)。例如确定第k+1层的块t必须放置在第k层的块(i mod 4) 中。
这种策略会引起一种,冲突不命中,也就是虽然缓存空间还有不少,但是,却不能命中缓存。比如上面的例中,我反复请求0,和8块,这两个块在上层缓存中共享一个位置,即便还有别的位置,也不能缓存这两个块的内容。
3.容量不命中
缓存太小了,不能处理这个工作集。
程序通常是按照一系列阶段(如循环)来运行的, 每个阶段访问缓存块的某个相对稳定不变的集合。例如, 一个嵌套的循环可能会反复地访问同一个数组的元素。这个块的集合称为这个阶段的工作集(working set)。当工作集的大小超过缓存的大小时, 缓存会经历容量不命中。
3.缓存管理
所有缓存都必定有某种逻辑负责管理缓存,当发生不命中或者各种情况时如何操作缓存。