《CSAPP》 6.2 局部性
1、局部性分类
局部性原理对硬件和软件系统的设计和性能都有极大的影响。
局部性通常分为:时间局部性和空间局部性。
1)时间局部性
时间局部性是指被引用过一次的内存位置很可能在不远的将来再被多次引用。
2)空间局部性
空间局部性是指如果一个内存位置被引用了一次,那么程序很可能在不远的将来引用其附近的一个内存位置。
3)局部性原理举例
- 在硬件层,局部性原理允许计算机设计者通过引入小而快的高速缓存存储器来保存最近被引用的指令和数据项,从而提高对主存的访问速度。
- 在操作系统级,局部性原理允许系统使用主存作为虚拟地址空间最近被引用块的高速缓存。
- 类似的,操作系统用主存来缓存磁盘文件系统中最近被使用的磁盘块。
- 在应用程序的设计,如Web浏览器将最近被请求的文档放在本地磁盘上,利用的就是时间局部性。大容量的Web服务器将最近被请求的文档放在前端磁盘高速缓存中,不需要服务器的干预就可满足对这些文档的请求。
2、对程序数据引用的局部性
比如,一个多维数组,我们按照行优先遍历的方法即一行完了再下一行的方式就是具有良好的空间局部性,因为计算机存储这些数据时也是按照行优先的方式进行的,所以行优先遍历就是依次访问相邻位置的数据。如果用列优先遍历,空间局部性就很差,因为它不是访问相邻单元的数据。
3、评价局部性
- 重复引用相同的变量的程序具有良好的时间局部性。
如下数组求和的程序,for循环每次都要使用sum,这就是一个具有良好的时间局部性的程序,并且对于数组v的数据,是依次顺序访问,和其在计算机中存储的顺序相同,所以空间局部性也好。
int sumvec(int v[N])
{
int i, sum = 0;
for(i = 0; i < N; i++)
sum += v[i];
return sum;
}
- 对于步长为k的引用模式的程序,步长越小,空间局部性越好。
就是多维数组的例子,在内存中大步跳来跳去的程序空间局部性会很差。
提出问题:为什么有良好局部性的程序通常比局部性差的程序运行得更快?
下一篇进行解答。
参考
《深入理解计算机系统》第6章.存储器层次结构