研究Linux分页技术碰到著名的局部性原理,查资料解释如下:
局部性原理(Principle of Locality)是一个由经验得出的结论:“一个程序90%的时间运行在10%的代码上”。
计算机程序从时间和空间都表现出“局部性”:
1)时间的局部性(Temporal Locality):最近被访问的内存内容(指令或数据)很快还会被访问;
2)空间的局部性(Spatial Locality):靠近当前正在被访问内存的内存内容很快也会被访问。
一个典型的例子就是几乎所有的程序都有循环代码。比如:
for(int i=0; i < 1000; i++)
for(int j=0; j < 200; j++)
a[i][j] = i*j;
这段代码从时间和空间上都表现出很强的局部性。
而对于存储器而言,存取速度越快的其成本越高。为了在成本和性能之间进行平衡,现代计算机体系架构往往选择:使用少量性能高但成本也高的存储器作为速度慢而成本也低的存储器的缓存。成本越高的存储器数量越少,但它们被设计为更靠近CPU,所以它们性能要比次级存储器高的多。
所以整个存储器层次是一个金字塔结构,如下图所示:
由于上层存储器是下层存储器的缓冲,基于局部性原理,使用这种架构是正确的选择。因为下层存储器中的数据一旦被装入上层存储器,就很有可能被多次用到,此时CPU则可以在更靠近它的性能也更高的存储器内找到其需要的数据,而不需要每次都要到离它更远,性能也更低的存储器内去存取它们。
在现代计算机软硬件体系架构下,不同层次的程序员看到的存储器层次也是不一样的。对于Application程序员,看到的只有虚拟内存,而对于系统程序员,比如操作系统程序员看到就是普通内存,而对于系统级Hardware Integration程序员,则看到的是二级cache,对于芯片级别的Hardware程序员,看到的则是一级cache。
但无论你是哪个级别的程序员,如果你能够了解更低层的存储器原理,则可能优化你的程序,让你的程序性能更高。而对于OS程序员而言,了解一,二级cache的机制,则可以优化其开发的操作系统。