存储体系(即存储层次)是让构成存储系统的几种不同的存储器(M,~M,)之间,配上辅助软、硬件或辅助硬件,使之从应用程序员角度来看,它们在逻辑上是一个整体。让存储层次的等效访问速度是接近于M,的,容量是M,的,每位价格是接近于M,的。
基本的二级存储体系是虚拟存储器和Cache存储器,这是存储体系的两个不同的分支。
虚拟存储器是因主存容量满足不了要求而提出来的。在主存和辅存之间,增设辅助的软、硬件设备,让它们构成一个整体,所以也称为主存一辅存存储层次,如图4-1所示。
因主存速度满足不了要求而引出了Cache存储器。在CPU和主存之间增设高速,小容量、每位价格较高的Cache,用辅助硬件将Cache和主存构成整体,如图4-2所示,称为Cache存储器(或称为Cache-主存存储层次)。
程序执行时所用到的指令和数据是相对簇聚成自然的块或页(存储器中较小的连续单元区)。这样,层次的M1级不必存入整个程序,只需将近期用过的块或页(根据时间局部性)存入即可。在从M,级取所要访问的字送M,时,一并把该字所在的块或页整个取来(根据空间的局部性),就能使要用的信息已在M1的概率显著增大。这是存储层次构成的主要依据。
虚拟存储器通过增设地址映像表来实现程序在主存中的定位。将程序分割成若段或页,用相应的映像表指明该程序的某段或某页是否已装入主存。若已装入,同时指明其在主存中的起始地址;若未装入,就去辅存中调段或调页,装入主存后在映像表中建立好程序空间和实存空间的地址映像关系。这样,程序执行时通过查映像表将程序(虚)地址变换成实(主)存地址再访主存。
根据存储映像算法的不同,可有多种不同的存储管理方式的虚拟存储器,其中主要有段式、页式和段页式3种。
①段式管理
段表长度字段指明该道程序所用段表的行数,即程序的段数。
②页式管理
页式存储是把主存空间和程序空间都机械地等分成固定大小的页(页面大小随计算机而异,一般在512B到几KB之间),按页顺序编号。这样,任一主存单元的地址n,,就由实页号n,和页内位移n,,两个字段组成。每个独立的程序也有自己的虚页号顺序。
③段页式管理
段页式存储是把实(主)存机械地等分成固定大小的页,程序按模块分段,每个段又分成与实主存页面大小相同的页。每道程序通过一个段表和相应的一组页表进行定位。段表中的每一行对应一个段。其中,“装入位”表示该段是否已装入主存。
在虚拟存储器中,每访问一次主存都要进行一次程序地址向实(主)存地址的转换。段页式的主要问题是地址变换过程至少需要查表两次,即查段表和页表。
页式虚拟存储器是采用页式存储和管理的主存一辅存存储层次。它将主存空间和程序空间都按相同大小机械地等分成页,并让程序的起点总是处在页的起点上。
1、地址的映像和变换
地址的映像是将每个虚存单元按某种规则(算法)装入(定位于)实主存,建立起多用户虚地址Ns与实(主)存地址n,之间的对应关系。
提高页表的空间的利用率的方法有:
一种:解决办法是将页表中装人位为“O”的行用实页号n,字段存放该程序此虚页在辅存中的实地址,以便调页时实现用户虚页号到辅存实地址的变换。
另一种:方法是把页表压缩成只存放已装入主存的那些虚页与实页位置(n,)的对应关系,该表最多为2n,行。我们称它为相联目录表法,简称目录表法。该表采用按内容访问的相联存储器构成。
替换算法的确定主要看主存是否有高的命中率,也要看算法是否便于实现,辅助软、硬件成本是否低。目前已研究过多种替换算法,如随机算法、先进先出算法、近期最少使用(近期最久未用过)算法等。
(1)先进先出算法(FIFO)
先进先出算法(FIFO)是选择最早装入主存的页作为被替换的页。
这种算法实现方便,只要在操作系统为主存管理所设的主存页面表中给每个实页配一个计数器字段。每当一页装入主存时,让该页的计数器清零,其他已装入主存的那些页的计数器都加“1”。需要替换时,计数器值最大的页的页号就是最先进入主存而现在准备替换掉的页号。虽然它利用了主存使用的“历史”信息,但不一定能正确地反映出程序的局部性。因为最先进入的页很可能正是现在经常在用的页。
(2)近期最少使用算法(LRU)
近期最少使用算法(LRU)是选择近期最少访问的页作为被替页。这种算法能比较正确地反映程序的局部性。一般来说,当前最少使用的页,未来也将很少被访问。但完全按此算法实现比较困难,需要为每个实页都配一个字长很长的计费器。所以一般用其交形,把近期最久未访问过的页作为被替换页,将“多”和“少”变成“有”和“无”,实现就方便多了。
(3)优化替换算法(OPT)
根据未来实际使用情况将未来的近期里不用的页替换出去,一定会有最高的主存命中率,这种算法称为优化替换算法(OPT)。
它是在时刻t找出主存中每个页将要用到的时刻t;,然后选择其中t;+t最大的那一页作为替换页。优化替换算法是一种理想算法,可以被用来作为评价其他替换算法好坏的标准。
结论:
①.命中率与所选用替换算法有关。
LRU算法要优于FIF0算法。命中率也与页地址流有关。
②.命中率与分配给程序的主存页数有关。
根据各道程序运行中的主存页面失效率,由操作系统动态调节分配给各道程序的实页数。当主存页面失效率超过某个值时,就自动增加分配给该道程序的主存页数,以提高其命中率;而当主存页面失效率低于某个值时,就自动减少分配给该道程序的主存页数,以便释放出这部分主存页面位置供其他程序用,从而使整个系统总的主存命中率和主存利用率得到提高。我们称此算法为页面失效频率(PFF)算法。
高速缓冲(Cache)存储器是为弥补主存速度的不足,在处理机和主存之间设置一个高速、小容量的Cache,构成Cache-主存存储层次,使之从CPU角度来看,速度接近于Cache,容量却是主存的。
虚拟存储器中使用的地址映像变换及替换算法基本上也适用于Cache存储器。
对Cache存储器而言,地址的映像就是将每个主存块按某种规则装入Cache中;地址的变换就是每次访Cache时怎样将主存地址变换成Cache地址。
映像规则的选择除了看所用的地址映像和变换硬件是否速度高、价格低和实现方便外,还要看块冲突概率是否低、Cache空间利用率是否高。
所谓块冲突是指出现了主存块要进入Cache中的块位置已被其他主存块所占用了。
1、全相联映像和变换
全相联映像的主存-Cache地址变换过程如图4-27所示。给出主存地址nm访存时,将其主存块号nm,与目录表中所有各项的nmb字段同时相联比较。若有相同的,就将对应行的Cache块号n,取出,拼接上块内地址nm.形成Cache地址n.,访Cache;若没有相同的,表示该主存块未装入Cache,发生Cache块失效,由硬件调块。
2、直接映像及其变换
把主存空间按Cache大小等分成区,每区内的各块只能按位置一一对应到Cache的相应块位置上,即主存第1块只能唯一映像到第i mod 2"cb块位置上,如图4-28所示。
3、组相联映像及其变换
将Cache空间和主存空间都分成组,每组为S块(S= 2s)。Cache共有2nca个块,分成Q组(Q= 24),整个Cache是一区。主存分成为与Cache同样大小的2nd个区,其地址按区号、组号、组内块号、块内地址分成对应的4个字段,主存地址的组号、组内块号分别用q、s'字段表示,它们的宽度和位置与Cache地址的q、s是一致的。
在Cache块失效时才将要访问的字所在的块取进。适当选择好Cache的容量、块的大小、组相联的组数和组内块数,是可以保证有较高的命中率的。如再采用在信息块要用之前就预取进Cache的预取算法,还可能进一步提高命中率。
多数的计算机系统既有虚拟存储器又有Cache存储器。程序用虚地址访存,要求速度接近于Cache,容量是辅存的。这种三级存储体系可以有3种形式,分别是:
①物理地址Cache
物理地址Cache是由“Cache-主存”和“主存一辅存”两个独立的存储层次组成,图4-38就是这种形式。
②虚地址Cache
虚地址Cache是将Cache-主存一辅存直接构成三级存储层次形式,其组成形式如图4-39所示。CPU访存时,直接将虚地址送存储管理部件MMU和Cache。如果Cache命中,数据与指令就直接与CPU传送;如果Cache不命中,由存储管理部件将虚地址变换成主存物理地址访主存,将含该地址的数据块或指令块与Cache交换的同时,将单个指令和数据与CPU之间传送。
③全Cache
全Cache是最近出现的组织形式,尚不成熟,尚未商品化。它没有主存,只用Cache与辅存中的一部分构成“Cache-辅存”存储体系。全Cache存储系统的等效访问时间要接近于Cache的,容量是虚地址空间的容量。