存储器系统

存储器系统是一个具有不同容量、成本和访问时间的存储设备的层次结构。
作为一个程序员,你需要理解存储器层次结构,因为它对应用程序的性能有着巨大的影响。如果你的程序需要的数据是存储CPU寄存器中的,那么在指令的执行期间,在0个周期内就能访问到他们。如果存储在高速缓存中,需要4-75个周期。如果储存在主存中,需要上百个周期。而如果储存在磁盘上,需要大约几千万个周期!
因此,我们了解存储器系统可以优化我们的程序,让程序的数据项存储在存储区层次结构的顶层,或者善于访问邻近的数据项。

1.随机访问存储器(RAM)
RAM分为两种静态的与动态的,静态随机访问存储器(SRAM)一般的速度比动态随机访问存储器(DRAM)要快很多,相对来说SRAM比DRAM快十倍,抗干扰能力也强很多,但是造价也贵很多。
SRAM作用CPU里面的高速缓存,DRAM的芯片一般在内存模块中,SRAM通过内存控制器连接DRAM。中间连接的线路,我们成为总线,具体的如下图:
存储器系统 - 中山爷爷 - 凝聚 的博客
其中I/O桥包含一个内存控制器,负责系统总线与内存总线信号的转换,类似的I/O桥还含有通用串行总线、图形卡、主机总线适配器,这使得计算机外围设备的设计与计算机底层的CPU设计无关。
 
2.非易失性存储器
上述的随机访问存储器在断电后,就失去了数据存储的能力,我们称断电后仍能存储信息的存储器为ROM。目前常用的ROM有普通的磁盘和基于闪存的固态硬盘,固态硬盘比磁盘的访问速度要快,造假也要贵。
一般来说RAM比ROM的访问速度要快很多。排序可得: SRAM > DRAM > 固态硬盘 > 磁盘。

3.存储器系统的层次结构
储存器系统是按照层次结构排列的,最上层的存储器访问速度越快,但是体积越小,容量越小,造假也更贵。
存储器系统 - 中山爷爷 - 凝聚 的博客
从图中可以看出,存储器系统有一个特点,对于在层次结构中的,位于第k层的更快更小的存储设备作为位于k+1层的更大更慢的存储设备的缓存。换句话说,层次结构中的每一层都缓存来自较低一层的数据对象。

存储器系统 - 中山爷爷 - 凝聚 的博客
上图中展示了存储器层次结构中缓存的一般性概念。第k+1层的存储器被划分成连续的数据对象组块,称为块。每个块都有一个唯一的地址或名字,使之区别于其他的块。块可以是固定大小的,也可以是可表大小的。数据总是以块大小为传送单元在第k层和第k+1层之间来回复制的。虽然在层次结构中任何一对相邻的层次之间块大小是固定的,但是其他的层次对之间可以有不同的块大小。
3.1 缓存命中与不命中 
当程序需要第k+1层的某个数据对象d时,他首先在当前存储在第k层的一个块中查找d。如果d刚好缓存在第k层中,那么就是我们所说的缓存命中。该程序直接从第k层读取d,根据存储器层次结构的性质,这要比从第k+1层读取d更快。
另一方面,如果第k层中没有缓存数据对象d,那么就是我们所说的缓存不命中。当发生缓存不命中,第k层的缓存从第k+1层缓存中取出包含d的那个块,如果第k层的缓存已经满了,可能就会覆盖现在的一个块。
 
4.存储器系统的友好的代码
一个编写良好的计算机程序常常具有良好的局部性。也就是,它们倾向于引用邻近于其他最近引用过的数据项的数据项,或者最近引用过的数据项本身。这种倾向性,被称为局部性原理,是一个持久的概念,对硬件和软件系统的设计和性能都有着极大的影响。
局部性通常有两种形式:时间局部性和空间局部性。在一个具有良好时间局部性的程序中,被引用过一次的内存位置很可能在不远的将来再被多次引用。在一个具有良好空间局部性的程序中,如果一个内存位置被引用了一次,那么程序很可能在不远的将来引用附近的一个内存位置。
结合第3个小节,局部性比较好的程序更容易有较低的不命中率,而不命中率较低的程序往往比不命中率较高的程序运行的更快。下面有三个提高局部性的的基本方法:
1.让最常见的情况运行的最快:程序通常把大部分时间都花在少量的核心函数上,而这些函数通常把大部分时间都花在了少量循环上。所以要把注意力集中在核心函数里的循环上,而忽略其他部分。
2.尽量减少每个循环内部的缓存不命中数量。在其他条件(例如加载和存储的总次数)相同的情况下,不命中率较低的循环运行的更快。
存储器系统 - 中山爷爷 - 凝聚 的博客
图中的代码就拥有良好的时间局部性与空间局部性;
存储器系统 - 中山爷爷 - 凝聚 的博客 存储器系统 - 中山爷爷 - 凝聚 的博客

  
  上面这个例子是关于二维数组的,由于二维数组是以行优先的连续地址的存储,所以二维数组的循环应先遍历行,在遍历列。如果数组比缓存还要大的话,那么上述左图的命中率比右图要高,因此,应先按照左图优化。

猜你喜欢

转载自blog.csdn.net/Amesteur/article/details/80279911