CSI-VII:存储器层次结构-神秘“金字塔”

前言

  我们大多数的编码者并不清楚存储器层次结构和编写程序到底如何联系起来,或者只是简单的以为程序的执行无非和内存或者磁盘有关系。的确,我们可以把程序的执行简单的理解为从磁盘加载,然后再到内存中执行。但我们通过第一篇(CSI-I)的内容应该已经知道,程序的执行其实贯通了整个存储器层次结构,如果我们理解了系统是如何将数据在存储器层上上下下移动的,这将对我们提高程序的性能有所帮助。因为数据越靠近存储器层次结构的顶层,其访问的速度会越快,而我们得学会如何使用这个特性,使得我们程序的数据项能够存储在较高的地方。这里我们把存储器层结构称为-金字塔,这不只是形象的比喻,更表明存储器层次结构在系统中的重大意义。

1.存储技术

在我们了解存储层次结构之前,我们先简单了解下构成存储系统的介质有哪些:常见的有RAM(随机访问存储器),磁盘,闪存等。

         随机访问存储分为两类:静态的和动态的。静态RAM(SRAM)比动态RAM(DRAM)更快,通常为1~10ns但也贵得多。SRAM用来作为高速缓存存储器。DRAM用来作为主存或者显存。如果断电,RAM会丢失他们的信息,因此,它们是易失。对应着,也存在非易失性存储器,即使在断电后也能保存信息。只读存储器(ROM)就是非易失性存储器。

         磁盘是广为应用的保存大量数据的存储设备,存储数据的数量级可以达到几百到几千千兆字节。不过相比RAM,从磁盘读取信息的时间为毫秒级,从DRAM读比从磁盘读快10万倍,从SRAM读比从磁盘读快100万倍。

         闪存是一种非易失性存储器,基于电子可擦除的可编程ROM(EEPROM),它已经成为一种重要的存储技术。闪存已经应用到大多数的移动数码领域以及台式机服务器计算机系统,我们最新了解到的一种新型磁盘驱动器——固态硬盘(Solid State Disk,SSD),也是基于闪存技术。

2.局部性

         一个编写良好的计算机程序常常具有良好的局部性,也就是说,它们倾向于用邻近于其他最近引用过的数据项的数据项,或者最近引用过的数据项本身。这种倾向性,被称为局部性原理,是一个持久的概念,对硬件和软件的设计和性能都有极大的影响。

      局部性通常有两种不同的形式:时间局部性和空间局部性。在一个具有良好时间局部性的程序汇总,被引用过一次的存储器位置很可能在不远的将来再被多次引用。在一个具有良好空间局部性的程序中,如果一个存储器位置被引用那么程序很可能在不远的将来引用附近的一个存储器位置。

      所以作为程序员应该理解局部性原理,因为,有良好局部性的程序比局部性差的程序更快。我们可以看个例子

Int sumarrayrows1(int a[M][N])
{
         Int I,j,sum = 0;
         For(i=0;i<M;i++)
             For(j=0;j<N;j++)
                   Sum+=a[i][j];
         Return sum;
}        
Int sumarrayrows2(int a[M][N])
{
         IntI,j,sum=0;
         For(i=0;i<M;i++)
               For(j=0;j<N;j++)
                   Sum+=a[j][i];
         return sum;
}

            对比两个方法,我们看到只是访问的数组元素的次序不同,我们说sumarrayrows1具有步长为1的引用模式,而sumarrayrows2具有步长为k的引用模式,步长为1的引用模式是程序中空间局部性常见和重要的来源,一般而言,随着步长的增加,空间局部性下降。

       相比程序中数据存取的局部性,因为指令也是存取在存储器中的,CPU必须取出这些指令,因此我们也关心取指令的局部性,如上for循环体里的指令是按照连续的存储器顺序执行的,因此循环具有良好的空间局部性,因为循环体会被多次执行,所以它也有很好的时间局部性。

3.存储器层次结构

         前面我们了解了对于不同的存储介质在计算机中的访问时间差异很大。速度较快的技术每字节的成本要比速度慢的技术高,而且容量小。CUP和主存之间的速度差距在不断增大。而幸运的是,程序本身倾向于展示良好的局部性。因此,硬件和软件的

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值