大而快:层次化存储(一)

1.写在前面

前面的博客我们简单的介绍了CPU,现在我们开启新的章节了,我们开始来学习存储结构了。

2.引言

从最早的计算开始,编程者就希望有无限大的高速存储。我们先来做一个简单的类比。假设你是一个学生,正在写关于计算机硬件重要发展历史的毕业论文。你坐在图书馆的书桌前,桌子上堆满了从书架上抽出来的各种书籍。你发现许多你要写到的重要计算机能从书中找到,但是唯独没有EDSAC。因此,你回到书架前开始寻找。你找到了一本记录英国早期计算机书籍,里面涉及EDSAC。如果之前摆在你书桌上的那堆书是经过精心挑选的,那么很多你所需要的资料都能从中找到,这样你会把大量的时间花费在阅读上,而不是返回到书架前寻找。相比于书桌上只放一本书返回频繁地在书架和书桌之间往返,在书桌上放置更多的书籍显然会节省时间。

按照这样的原理,我们也可以建立一个大容量的存储,并且其访问速度和小容量存储一样快。就像你不需要同时等概率地阅读图书馆中每一本书一样,程序也不会同时等概率地访问每一段代码或数据。否则,就不可能建立一个容量又大、访问速度又快的存储,就像不可能将图书馆中的所有书搬到你的书桌上还想快速检索任何你想要的资料一样。

不管是在图书馆中工作,还是执行计算机程序,都存在局部性原理。局部性原理表明,在任意一段时间内程序都只会访问地址空间中相对较小的一部分内容,就如你会查阅图书馆的一部分藏书一样。

局部性有两种:

  • 时间局部性:如果某个数据向被访问,那么在不久的将来它可能再次被访问。
  • 空间局部性:如果某个数据项被访问,与它地址相邻的数据项可能很快也将被访问。

我们可以利用局部性原理来构建计算机的存储系统,也称为存储层次结构。存储层次结构包括不同速度和容量的多级存储。存储速度越快,价格越昂贵,但容量越小。

速度越快的存储器越靠近处理器;越慢的存储成本越低,离处理器越远。这样做的目的是以最低的价格为用户提供最大容量的存储,同时访问速度与最快的存储相当。

在这里插入图片描述

同样,数据也有相似的层次性:靠近处理器那一层中的数据是哪些较远层次中数据的子集,所有的数据都被存在最远的那一层。依然使用图书馆的例子进行类比,书桌上的书籍是图书馆藏书的一个子集,也是学校所有图书馆藏书的一个子集。而且,离处理器越远的存储层次访问时间也越长,就像我们在学校图书馆系统中可能遇到的情况一样。

层次化存储可以由不同的层次组成,但是数据只能在两个相邻层次之间进行复制。因此,我们重点关注这两个层次。上一层比下一层容量要小,速度要快,因为上一层存储使用了成本更高的工艺。在相邻两层之间进行信息交换的最小单元称为块或行。

在这里插入图片描述

如果处理器所需的数据在本层的存储中找到,称为命中,类比于你在桌上的某本书中找到了所需信息。如果没在本层存储中找到所需数据,称为失效,将访问下一级存储。可类比于你从书桌来到书架前,寻找想要的书籍。命中率指的是在访问本层存储时命中的次数占总次数的比例,通常作为存储层次结构的性能衡量指标之一。失效率指的是在访问本层存储时失效的次数占总次数的比例。

由于性能是引入层次化存储的主要原因,数据命中和失效的处理时间是非常重要的。命中时间是访问本层存储的时间,包括判断访问命中或失效时间。失效损失指的是将相应的块从下层存储替换到上层存储中的事件,加上该数据块返回给处理器的时间。由于上层存储容量更小,并由速度更快的存储组成,命中时间也比下层存储的访问时间短,而访问下层存储的时间是失效损失的重要组成部分。

3.存储技术

在当今的层次化存储中有四种主要技术。主要采用动态随机访问存储(DRAM)器件实现,靠近处理器的存储层次使用静态随机访问存储(SRAM)器件实现。DRAM的访问速度慢于SRAM,但它的每比特成本也要低很多。两者的价格差主要源于DRAM的每比特占用的面积远远小于SRAM,因而DRAM能在等量的硅上实现更大的存储容量。第三种技术称为闪存。这种非易失性存储一般作为个人移动设备的二级存储。第四种技术是磁盘,用来实现服务器上最大的也是最慢的存储层次。

在这里插入图片描述

3.1SRAM存储技术

SRAM存储时一种存储阵列结构的简单集成电路,通常有一个读写端口。虽然读写操作的访问时间不同,但对于任意位置的数据,SRAM的访问时间是固定的。

SRAM不需要刷新电路,所以访问时间可以和处理器的时钟周期接近。为防止读操作时信息丢失,典型的SRAM每比特采用6个或8个晶体管来实现。在待机模式下,SRAM只需要最小的功率来保持电荷。

过去,大多数个人电脑和服务器使用独立的SRAM芯片作为一级、二级甚至三级高速缓存。如今,感谢摩尔定律,所有的高速缓存都被集成到处理器芯片上,因此独立SRAM芯片的市场已经消失。

3.2DRAM存储技术

在SRAM中,只要提供电源,数值会被一直保存。而在DRAM中,使用电容保存电荷的方式来存储数据。采用单个晶体管来访问存储的电荷,或者读取它,或者改写它。DRAM的每个比特仅使用单个晶体管来存储数据,它比SRAM的密度更高,每比特价格更低廉。由于DRAM在单个晶体管上存储电荷,因此不能长久保持数据,必须进行周期性的刷新。与SRAM相比,这也是该结构被称为动态的原因。

为了刷新数据单元,我们只需要读取其中的内容并再次写回,DRAM中的电荷可以保持几微秒。如果每一比特数据都从DRAM中读出再被一一写回,就必须不停进行刷新操作,那么就会没有时间进行正常的数据访问。幸运的是,DRAM使用两级译码电路,这使我们可以使用一个读周期紧跟一个写周期的方式一次性完成整行刷新。

在这里插入图片描述

行(row)结构有助于DRAM的刷新,也有助于改善性能。为提高性能,DRAM中缓存了行数据以便重复访问。该缓冲区有点类似SRAM:通过改变地址,可以访问缓冲区中任意位置的数据,直到换行。这个功能显著改善了访问时间,因为确定行数据的访问时间将被大幅度降低。让芯片变得更宽也能改善存储带宽。当某行已在缓冲区中,无论DRAM的数据宽度是多少,可以通过发送后续列地址进行数据传输,或者通过指定缓冲区中的起始地址进行块传输。

为更好地优化与处理器的接口,DRAM添加了时钟,因此被称为同步DRAM。SDRAM的好处在于,使用时钟消除了内存和处理器之间的同步问题。同步DRAM的速度优势来自于,进行突发传输时无须指定额外地址位,而是通过时钟来突发传输后续数据。速度最快的结构称为双倍数据传输率SDRAM,这名字意味着在时钟的上升沿和下降沿都可以进行数据传输。因此,如果根据时钟频率和数据位宽测算,使用该结构可以获得预想中双倍的数据带宽。该技术的最新架构称为为DDR4。

要维持这样的高带宽,需要对DRAM的内部结构进行精心组织。DRAM可以在内部组织对多个bank进行读或写,每个bank对应各自的行缓冲,而不仅仅是添加一个快速行缓冲。对多个bank发送一个地址允许同时对这些bank进行读或写。例如,对于4个bank的结构,只需要一次访问时间,之后以轮转的方式对这4个bank进行访问,这样就获得了4倍的带宽。这种轮转的访问方式称为交叉地址访问。

虽然如iPad这样的个人移动设备都会使用单独的DRAM,但是服务器的存储通常都是集成在小电路板上售卖,这种结构被称为双列直插式内存模块。

3.3闪存

闪存是一种电可擦除的可编程只读存储器。与磁盘和DRAM不同,但与其他EEPROM技术相似,闪存的写操作会对器件本身产生磨损。为应对这种限制,大多数闪存产品都包括一个控制器,用来将发生多次写的块重新映射到较少被写的块,从而使得写操作尽量分散。该技术被称为耗损均衡。通过该技术,个人移动设备不太可能超过闪存的写次数限制。这样的技术虽然降低了闪存的潜在性能,但却是非常必要的,除非使用更高层次的软件来监控损耗情况。具有损耗均衡的闪存控制器也能够通过重新映射,将生产制造中出现故障的存储单元屏蔽掉,从而改善产品的良率。

3.4磁盘

磁性硬盘由一堆盘片组成,这些盘片绕着轴心每分钟转动5400~15000周。这些金属盘片的每一面都被磁性记忆材料锁覆盖,与磁带上的磁性材料相似。为从硬盘上读写信息,一个可移动的转臂正位于这些盘面的上方,其中包括一个称为读写头的小型电磁线圈。整个驱动器严格密封,以控制驱动器内部的环境,从而使磁头更接近驱动器的表面。

每个磁盘表面被分为若干的同心圆,称为磁道。每个盘面上通常有几万条磁道。每条磁道按序划分为上千个保存信息的扇区。扇区的容量一般为512~4096字节。记录在磁介质上内容依次为:扇区号,间隙,该扇区的信息,间隙,下一个扇区的扇区号。

每个盘面都配有一个磁头,这些磁头互相连接并一起移动。每个磁头都可以读写每个盘面的每一个磁道。术语柱面用来表示某磁头在给定点能够访问到所有的磁道集合。

操作系统通过三步完成对磁盘的数据访问。第一步,将磁头定位在正确的磁道上方。这个操作称为寻道,将磁头移动到所需磁道上方的时间称为寻道时间。

一旦磁头到达正确的磁道,我们需要等待所需扇区旋转到读写磁头下,这段时间被称为旋转延时。获得所需信息的平均延时为磁盘旋转半周的时间。

磁盘访问的最后一部分是传输时间,即传输数据块的时间。传输时间是扇区大小、旋转速度和磁道记录密度的函数。2012年,磁盘的传输速率大约在100~200MB/s

复杂的是,大多数磁盘控制器内置一个缓存,用来保存刚刚读取过的扇区的数据。从该缓存中读取数据的传输速率会高很多。

现在,块号的位置不能再凭直觉了。上述的扇区-磁道-磁柱模型有如下的假设:相邻的数据块在同一个磁道上;由于无须寻道时间,在同一磁柱上的数据块的访问开销更少;不同的磁道与磁头的距离也不同。如此变化的原因在于磁盘接口的层次提升。为加速磁盘的串行的传输速度,这些高层次接口将磁盘组织得更像磁带,而不是随机访问设备。逻辑块以弯曲的方式排列在盘片表面,尽可能使每个扇区的记录密度相同,以获得最佳性能。因而,顺序的数据块可能会在不同的磁道上。

综上所述,磁盘与半导体存储器件的两个主要区别是:由于存在机械装置,磁盘的访问速度更慢。

4.cache基础

在上文的图书馆例子中,书桌扮演了cache(高速缓存)的角色:一个存储考试所需信息(书籍)的安全场所。在第一台商用计算机中,cache就被用来表示位于处理器和主存之间的特殊存储层次。

我们先从一个简单的cache开始,处理器每次请求为一个字,且每个数据块由单个字组成。下图给出了这样简单cache在响应数据访问请求前后的情况,且被访问的数据初始时并不在cache中。在响应请求前,该cache中包含了最近访问的数据集合x1 x2 … xn-1,处理器请求的字xn并不在cache中。这个请求会产生一次失效,字xn从内存取到cache中。

在这里插入图片描述

上面的例子,我们有两个问题需要回答:如何知道数据项是否存在于cache中?进一步来说,如果知道数据项存在于cache中,又该如何找到这个数据项呢?这两个答案是有关联的。如果每个字能够位于cache中确定位置,只要它在cache中,那么找到它则是很简单的,在cache中为每个存储中的数据字进行位置分配的最简单方式,就是基于它在存储中的地址来分配cache中的位置。这种cache结构被称为直接映射,这是因为每个存储地址都被直接映射到cache中的确定位置。直接映射cache中,存储地址和cache位置之间的典型映射关系通常都非常简单。例如,几乎所有的直接映射cache使用下述映射方法来找到对应的数据块:

(块地址)mod(cache中的数据块数量)

由于每个cache块中能够保存不同存储地址的内容,如何知道对应请求的数据字是否在cache中呢?回答这个问题前,需要在cache中添加一组标签(tag)。这些标签保存了所需的地址信息,这些信息用来确定请求字是否在cache中。标签中只需要保存地址的高位部分,这部分地址不会用来作为cache的索引。

同时,还需要一种方法能够判断cache中的数据块中是否保存有效信息。当处理器启动时,cache中没有有效数据,标签为都是无意义的。即使在执行了许多指令后,cache中的一些表项内容仍可能为空,因此,对于这些表项中是否保存有效的数据。如果该位未被置位,则对应的数据块不能使用。

5.写在最后

本篇博客的篇幅有限,就到此结束吧。后面的内容,我们下个章节再写。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值