CPU 的性能往往受限于相对较慢的主内存访问速度。缓存(Cache Memory)通过存储经常使用的数据和指令来提升速度。它的效率依赖于“引用局部性”原则。
- 引用局部性 意味着程序往往倾向于重复使用相同的数据或相邻的指令,而不是随机访问内存位置。
- 它帮助缓存预测下一步需要哪些信息。
- 这减少了平均内存访问时间,从而提高了 CPU 的整体效率。
- 这一概念是缓存设计和运行的基础。
- 表现出强局部性的程序能更有效地利用缓存,从而获得更高的命中率并减少缓存缺失。
!<a href="https://media.geeksforgeeks.org/wp-content/uploads/20251029123113195462/mainmemory.webp">mainmemoryCache Memory
形式化定义
引用局部性是程序的一种属性,描述了在执行过程中内存引用如何在时间和空间上聚集在一起。
主要有两种类型的引用局部性:
时间局部性
时间局部性指出,如果在某个时刻访问了特定的内存位置(数据或指令),那么在不久的将来很可能再次访问它。
- 程序通常包含循环、计数器和经常使用的变量。
- 由于这些在短时间内被重复使用,将它们存储在缓存中可以确保更快的访问。
!<a href="https://media.geeksforgeeks.org/wp-content/uploads/20251029124100882879/currentdatastored.webp">currentdatastoredTemporal Caching
> 示例:
>
>
> for (int i = 0; i
>
> – 变量 INLINECODEb2a96676、INLINECODE8e8f0da3 和数组 a[i] 的元素被重复访问。
> – 将这些存储在缓存中有助于避免多次访问主内存。
基于时间局部性的缓存操作:
当 CPU 从主内存获取一个数据项时,它也会在缓存中保留一个副本,假定很快就会用到它。如果这个假设是正确的,随后的访问就会导致缓存命中。
空间局部性
空间局部性指出,如果访问了特定的内存位置,那么附近的内存位置也很可能很快被访问。指令和数据存储在连续的内存位置中。
- 当程序访问一个位置时,接下来的几条指令或数据项通常位于它旁边。
> 示例:
>
>
> for (int i = 0; i
>
> – 这里,数组 arr[i] 的连续元素被访问。
> – 一旦获取了 INLINECODEc0424cc4,CPU 很可能会访问存储在附近内存位置的 INLINECODE7e5e0292、arr[2] 等。
基于空间局部性的缓存操作:
缓存利用块获取技术。当访问一个块中的一个字时,整个块(包含附近地址)会被加载到缓存中,以预判未来的访问。
平均内存访问时间 (AMAT) 的数学表示
我们通常使用 平均内存访问时间 来评估缓存系统的性能。它代表了 CPU 访问数据或指令所需的平均时间,同时考虑了缓存命中和缓存缺失的情况。
设:
- Tc = 访问缓存的时间
- Tm = 访问主内存的时间
- h = 缓存命中率(在缓存中找到所需数据的概率)
那么,平均内存访问时间可以表示为:
> Average Memory Access Time (AMAT)= h × Tc + (1−h) × Tm
这里,
- 项 (h × Tc) 代表缓存命中贡献的时间。
- 项 (1 − h) × Tm 代表缓存缺失贡献的时间,此时必须从主内存获取数据。
更高的命中率(h)表示更好的缓存利用率和更强的引用局部性,从而带来更低的 AMAT 和提升的整体系统性能。