存储器的层次结构

 

#AskCpp11 存储器的层次结构是怎样的?

一个简单的计算机系统模型是:CPU 执行指令,而存储器系统为 CPU 存放指令和数据。

作为一个程序员,你需要理解存储器层次结构,因为它对应用程序的性能有着巨大的影响。如果你的程序需要的数据是存储在 CPU 寄存器中的,那么在指令的执行周期,在 0 个周期内就能访问到它们。如果存储在高速缓存中,需要 4~75 个周期。如果存储在主存中,需要上百个周期。而如果存储在磁盘上,需要大约几千个周期!

由此产生出计算机系统中一个基本而持久的思想:如果你理解了系统是如何将数据在存储器层次结构中上上下下移动的,那么你就可以编写自己的应用程序,使得它们的数据项存储在层次中较高的地方,在那里 CPU 能更快地访问他们。

这个思想围绕着计算机程序的一个称为局部性(locality)的基本属性。具有良好局部性的程序倾向于一次又一次地访问相同的数据项集合,或是倾向于访问邻近的数据项集合。这使得程序运行更快。

存储器层次结构

存储器的层次结构是基于缓存的,如下图:

img

存储器层次结构的本质是,每一层存储设备都是较低一层的缓存。

那么什么是缓存?

一般而言,高速缓存是一个小而快速的存储设备,它作为存储在更大、也更慢的设备中的数据对象的缓冲区域。使用高速缓存的过程称为缓存。

存储器层次结构的中心思想是每一层(第 k 层)都缓存来自较低一层(第 k + 1 层)的数据对象。

数据总是以块大小为传递单元在第 k 层和第 k + 1 层之间来回复制。

  • 缓存命中

    当程序需要第 k + 1 层的某个数据对象 d 时,它首先在当前存储在第 k 层的一个块中查找 d。如果 d 刚好缓存在第 k 层中,那么就是我们所说的缓存命中(cache hit)。

  • 缓存不命中

    另一方面,如果第 k 层没有缓存数据对象 d,那么就是我们所说的缓存不命中(cache miss)。

局部性原理

基于缓存的存储器层次结构行之有效,是因为较慢的存储设备比较快的存储设备更便宜,还因为程序倾向于展示局部性:

时间局部性

由于时间局部性,同一频数

空间局部性

Google 数据中心是怎样的?

参考

https://www.jianshu.com/p/fa9aa1db0c0f

《深入理解计算机系统》