在计算机系统中,我们利用“引用局部性”这一概念来提高缓存的效率,其核心在于尝试预测数据的后续使用情况。引用局部性主要分为两类:空间局部性和时间局部性。理解这两种局部性表示之间的区别,对于提升缓存效率和系统的整体运行流程至关重要。
空间局部性(Spatial Locality)是指程序在给定的时间段内,访问物理位置上彼此相邻的内存单元的特征。时间局部性(Temporal Locality)则是指程序在某个时间段内再次访问同一内存地址的概率。
编译器、处理器和缓存系统都会利用这两个概念,通过将数据预取到缓存中来提高缓存命中率,从而减少访问时间并加快执行速度。
空间局部性(Spatial Locality)
空间局部性意味着,所有存储在最近执行的指令附近的指令,都有很高的被执行几率。它指的是使用存储位置相对接近的数据元素(或指令)。
空间局部性的优势
- 提高缓存利用率:空间局部性具有更好的缓存可预测性,因为数据块被预加载到缓存中,从而减少了对内存的进一步访问需求。
- 优化数据预取:当存在空间局部性时,系统可以提前将数据预取到缓存中,预测后续靠近当前内存地址的缓存地址将被访问。这最大限度地减少了归因于内存访问时间的周期数。
- 适用于顺序访问模式:例如访问数组的循环中的顺序数据访问模式,能从主动的空间局部性中获益良多,在这种情况下,缓存中的数据通过加载相邻数据为未来的访问做好了准备(即“预热”)。
空间局部性的劣势
- 对非顺序访问的益处有限:非顺序访问是另一个可能无法通过增强空间局部性来改善的问题,因为如果调用者从未使用预加载的相邻数据,那么这可能会造成代价(浪费带宽)。
- 复杂访问模式下的缓存未命中增加:如果程序对内存进行随机或不可预测的访问,那么空间局部性可能会变得有害,因为它可能导致缓存未命中,加载进来的数据可能不再有用。
时间局部性(Temporal Locality)
时间局部性意味着最近执行的指令很有可能会再次被执行。因此,该指令被保存在缓存内存中,以便可以轻松获取,并且无需花费时间再次搜索相同的指令。
时间局部性的优势
- 非常适合重复操作:通常,循环类表现出良好的时间局部性,因为应用程序在执行过程中会反复使用相同的数据和指令。
- 提高频繁使用数据的性能:时间局部性将频繁访问的数据保留在缓存中,从而提高了系统性能,并减少了通常归因于从主检索数据的延迟。
- 减少缓存未命中:时间局部性这一属性确保了缓存未命中的数量非常有限,因为最近使用过的任何数据很可能再次被使用,因此它保留在缓存中,不需要再次从内存中获取。
时间局部性的劣势
- 仅限于频繁重用:虽然时间局部性只倾向于那些重复使用相同数据或指令的程序。然而,在数据很少被调用或仅仅被声明一次的上下文中,时间局部性有时是无效的,因为所需的数据在内存中不一定相邻。
- 缓存驱逐问题:如果基于时间局部性的假设导致缓存中填充了过多的信息,可能会导致重要数据被过早地从缓存中移除,从而导致缓存未命中。
时间局部性
—
在时间局部性中,最近执行的指令很有可能在不久的将来再次被执行。
它指的是最近使用的内存位置被再次访问的执行趋势。
它也被称为时间局部性。
它在短时间内反复引用相同的数据。