6.2 局部性
局部性原理 :倾向于引用邻近于其他最近引用过的数据项的数据项,或者最近引用过的数据项本身。
- 时间局部性 :被引用过一次的内存位置很可能在不远的将来再被多次引用。
- 空间局部性 :一个内存位置被引用了一次,很可能在不远的将来引用附近的一个内存位置。
硬件层面 ,局部性原理允许计算机设计者通过引入称为 高速缓存存储器 来保存最近被引用的指令和数据项,从而提高对主存的访问速度。
操作系统层面 ,局部性原理允许系统使用主存作为虚拟地址空间最近被引用块的高速缓存。
6.3 存储器层次结构
6.3.1 存储器层次结构中的缓存
对于每个 k
,位于 k
层的更快更小的存储设备作为位于 k+1
层的更大更慢的存储设备的缓存。
第 k+1
层的存储器被划分成连续的数据对象组块,称为 块 。对于第 k
层的存储器被划分成较少的块的集合,每个块的大小与 k+1
层块的大小一样。数据总是以块大小为传送单元在第 k
层和第 k+1
层之间来回复制。另外,在层次结构中任何一对相邻的层次之间块大小是固定的,但是其他层次对之间可以有不同的块大小。
1 缓存命中
2 缓存不命中
当读取数据对象d时,第 k
层没有d,那么需要从第 k+1
层缓存中取出包含d的那个块,如果第 k
层的缓存已经满了,可能就会覆盖现存的一个块。
覆盖一个现存的块的过程称为替换或驱逐这个块。被驱逐的块有时也称为牺牲块。决定该替换哪个块是由缓存的替换策略来控制的。
3 缓存不命中的种类
冷不命中 当缓存为空时称为 冷缓存 ,此类不命中称为 强制性不命中 或 冷不命中。(短暂的事件)
冲突不命中 这种不命中出现的前提是在不命中时采用了 限制性放置策略 ,即在第 k
层不命中时从第 k+1
层取数据d,放置d的位置是有限制的。例如:第 k
层缓存只能放置四个块,第 k+1
层的第 x
块,只能放在第 k
层的第 xmod4
块。这种情况下,程序循环地取第0、4块时,每次都会不命中。
容量不命中 程序按照一系列阶段(如循环)来运行的,每个阶段访问缓存块的某个相对稳定的集合。这个块的集合称为该阶段的工作集。例如:当程序中某个循环反复地访问同一个数组的元素。当工作集的大小超过了缓存的大小时,就会出现 容量不命中 。