先来解释一下上面这张图片,从图中可以看出首先主存与CPU之间的存取速度的差异非常大,而主存中存放的,是每个程序运行时所需要的数据,CPU需要从主存中存取这些数据,但是由于主存与CPU存取速度的差异,导致了限制程序运行效率的因素并非CPU的速度不够快,而是由于存储设备准备数据较慢导致的,因此为了充分发挥CPU的行能,现代存储体系选择在CPU与主存之间增加一个高速缓存(Cache),高速缓存与CPU才用同一种材料制成,因此CPU与缓存之间的访问几乎没有时延(所以缓存的容量非常小,因为非常贵).如下所示是我电脑的CPU所拥有的缓存.
缓存是如何提高程序的运行效率的呢?
缓存容量小,功耗大,但是其速度快于主存.
缓存中存放的,是主存(也就是程序所存放数据的地方)部分数据的副本,CPU可以通过访问缓存,来访问主存,这是因为缓存可以访问主存.假象如果CPU所需要的数据与指令都能在缓存中得到满足,那么CPU访问主存的次数就将减少,那么被主存的拖累就会减少,效率因此也就提高.
那么一个缓存也就几KB,能存放的数据非常有限,它却为什么能减少CPU去主存这个大仓库中取数据的次数呢?
这时候就需要引入一个名词程序的局部性原理.
程序的局部性原理是指程序在执行时呈现出局部性规律,即在一段时间内,整个程序的执行仅限于程序中的某一部分。相应地,执行所访问的存储空间也局限于某个内存区域。局部性原理又表现为:时间局部性和空间局部性。时间局部性是指如果程序中的某条指令一旦执行,则不久之后该指令可能再次被执行;如果某数据被访问,则不久之后该数据可能再次被访问。空间局部性是指一旦程序访问了某个存储单元,则不久之后,其附近的存储单元也将被访问。
也就是说如果一个数据能在缓存中被使用,那么这个数据可能会经常的被使用.
并且由于主存与缓存是能进行数据交互的,因此当CPU这一次没有在缓存中找到数据(未命中),那么CPU就会去主存中引入数据,同时这次引入的数据也将更新原有的缓存,因此缓存能保证其当前存储的数据都是CPU最有可能使用到的.