1、4.1 存贮体系的形成与性能 4.2 虚拟存贮器 4.3 高速缓冲存贮器(Cache) 4.4 主存保护,第 4 章 存 贮 体 系,4.1 存贮体系的形成与性能,4.1.1 发展存贮体系的必要性存贮器容量SM=Wlm。其中,W为存贮体的字长(单位为位或字节), l为每个存贮体的字数, m为并行工作的存贮体个数。,存贮器的速度可以用访问时间TA、存贮周期TM和频宽(也称带宽)Bm来描述。TA是存贮器从接到访存读申请,到信息被读到数据总线上所需的时间。这是确定处理机与存贮器时间关系的一个重要指标。这段时间是处理机在启动访存申请后必须等待的时间。TM则是连续启动一个存贮体所需要的间隔时间,它一般总
2、比TA大。存贮器频宽是存贮器可提供的数据传送速率,一般用每秒钟传送的信息位数(或字节数)来衡量,又分最大频宽(或称极限频宽)和实际频宽。最大频宽Bm是存贮器连续访问时能提供的频宽。单体的Bm=W/TM。m个存贮体并行工作时可达到的最大频宽Bm=Wm/TM。由于存贮器不一定总能连续满负荷地工作, 所以,实际频宽往往要低于最大频宽。,存贮器的价格可以用总价格C或每位价格c来表示。具有SM位的存贮器每位价格c=C/SM。存贮器价格包含了存贮单元本身及为该存贮器操作所必须的外围电路的价格。 计算机系统总希望存贮器能在尽可能低的价格下,提供尽量高的速度和尽量大的存贮容量。在速度上应尽量和CPU匹配,否则
3、CPU的高速性能难以发挥。容量上应尽可能放得下所有系统软件及多个用户软件。同时,存贮器的价格又只能占整个计算机系统硬件价格中一个较小而合理的比例。然而,价格、速度和容量的要求是互相矛盾的。在存贮器件一定的条件下,容量越大,因其延迟增大而使速度越低。容量越大,存贮器总价格当然也就会越大。 存取速度越高,价格也将越高。同等容量的情况下存贮器的速度大体上按双极型、MOS型、电荷耦合器件(CCD)、 磁泡、 定头磁盘、 动头磁盘、 磁带的顺序依次下降。,4.1.2 并行主存系统频宽的分析,图 4.1 单体单字存贮器,图4.1是一个字长为W位的单体主存,一次可以访问一个存贮器字,所以主存最大频宽Bm=W
4、/TM。假设,此存贮器字长W与CPU所要访问的字(数据字或指令字,简称CPU字)的字长W相同, 则CPU从主存获得信息的速率就为W/TM。我们称这种主存是单体单字存贮器。 ,要想提高主存频宽Bm,使之与CPU速度匹配,显然可以想到,在同样的器件条件(即同样的TM)下,只有设法提高存贮器的字长W才行。 例如,改用图4.2的方式组成,这样,主存在一个存贮周期内就可以读出4个CPU字, 相当于CPU从主存中获得信息的最大速率提高到原来的4倍,即Bm=4W/TM。我们称这种主存为单体多字存贮器。,图 4.2 单体多字(m=4)存贮器,图 4.3 多体(m=4)交叉存贮器,表 4.1 地址的模4低位交叉
5、编址,图 4.4 4个分体分时启动的时间关系,设p(k)表示申请序列长度为k的概率密度函数,其中k=1, 2, , m。 即p(1)是k=1的概率,p(2)是k=2的概率,p(m)是k=m的概率。 k的平均值用B表示,则,它实际上就是每个主存周期所能访问到的平均字数,正比于主存实际频宽(只差一个常数比值TM/W)。p(k)与程序的状态密切相关,如果访存申请队都是指令的话,那么影响最大的是转移概率,它定义为给定指令的下条指令地址为非顺序地址的概率。,申请队中如果第一条就是转移指令且转移成功,与第一条指令并行读出的其他m-1条指令就是没用的,相当于k=1,所以p(1)=(1-)0;k=2的概率自然
6、是第一条没有转移(其概率为1-),第二条是转移指令且转移成功的情况,所以,p(2)=(1-p(1)=(1-)1;同理,p(3)=(1-p(1)-p(2)=(1-)2。如此类推,p(k)=(1-)k-1,其中1km。如果前m-1条均不转移,则不管第m条是否转移,k都等于m,故p(m)=(1-)m-1。,这样,,经数学归纳法化简可得,这是一个等比级数, 因此,图 4.5 m个分体并行存取的B=f()曲线,4.1.3 存贮体系的形成与分支,图 4.6 主存辅存存贮层次,图 4.7 Cache主存存贮层次,图 4.8 多级存贮层次,4.1.4 存贮体系的性能参数,图 4.9 二级存贮体系的评价,设ci
7、为Mi的每位价格,SMi为Mi的以位计算的存贮容量,TAi为CPU访问到Mi中的信息所需要的时间。为评价存贮层次的性能,引入存贮层次的每位价格c、命中率H和等效访问时间TA。 存贮层次的每位平均价格,命中率H定义为CPU产生的逻辑地址能在M1中访问到(命中到)的概率。命中率可用实验或模拟方法来获得,即执行或模拟一组有代表性的程序,若逻辑地址流的信息能在M1中访问到的次数为R1,当时在M2中还未调到M1的次数为R2,则命中率,存贮层次的等效访问时间,设CPU对存贮层次相邻二级的访问时间比r=TA2/TA1,则,图 4.10 对于不同的r, 命中率H与访问效率e的关系,4.2 虚 拟 存 贮 器,
8、4.2.1 不同的虚拟存贮管理方式,1. 段式管理,图 4.11 段式管理的定位映象机构及其地址的变换过程,图 4.12 段式存贮分配算法,图 4.13 采用页式存贮后D道程序仍可装入,2. 页式管理,图 4.14 页式管理的定位映象机构及其地址的变换过程,3. 段页式管理,图 4.15 段页式管理的定位映象机构及其地址的变换过程,例如,若程序虚地址为24位,其中页内地址Nr为10位,即,程序虚地址,则页表就需要2Nv,即214行,而页面大小只有2Nr=210。因此, 页表本身就可能要分存于16个页面。为此要建立多级页表, 用页表基址寄存器指明第一级页表的基址,用第一级页表中各行的地址字段指明
9、第二级各个页表的基址,依次类推。 用树的概念很容易得出这种页表级数i和Nv、Nr的关系为,如果页表中的每一项(行)需要Be个编址单元,而Be是2的幂, 则Be需用Ne=log2Be个地址位表示,这样就有,例如,Multics地址是以字节为单位的,其Nv=26,而映象表每一行(项)需要两个字节,即Ne=1,Nr=10,所以表的级数为26/(10-1)=3。 就是说,光有段、页二级表不够,必须采用三级表。,4.2.2 页式虚拟存贮器构成,1. 地址的映象和变换,图 4.16 虚实地址对应关系及空间的压缩,所谓地址的映象是将每个虚存单元按某种规则(算法)装入(定位于)实存,即建立多用户虚地址Ns与实
10、主存地址np之间的对应关系。对于页式而言,实际上就是将多用户虚页号Nv的页可以装入主存中的哪些页面位置,建立起Nv与nv的对应关系。而地址的变换则指的是程序按照这种映象关系装入实存后,在执行时,多用户虚地址Ns如何变换成对应的实地址np。对页式而言就是多用户虚页号Nv如何变换成实页号nv。,图 4.17 全相联映象,图 4.18 目录表法,要想把该道程序的虚页调入主存,必须给出该页在辅存中的实际地址。为了提高调页效率,辅存一般是按信息块编址的, 页且让块的大小通常等于页面的大小。以磁盘为例,辅存实(块)地址Nvd的格式为,Nvd,图 4.19 虚地址到辅存实地址的变换,2. 替换算法,替换算法
11、的确定主要是看按这种替换算法替换是否有高的主存命中率,其次要看算法是否便于实现,辅助软、硬件成本是否低。到目前为止,已研究过各种替换算法,如随机法、先进先出法和近期最少使用(近期最久未用过)法等。,图 4.20 主存页面表,替换算法一般是通过用典型的页地址流模拟其替换过程, 再根据所得到的命中率的高低来评价其好坏的。当然影响命中率的因素除了替换算法外,还因地址流、 页面大小、主存容量等不同而不同。 设有一道程序,有1至5共5页,执行时的页地址流(即执行时依次用到的程序页页号)为:,2, 3, 2, 1, 5, 2, 4, 5, 3, 2, 5, 2,图 4.21 3种替换算法对同一页地址流的替
12、换过程,图 4.22 命中率与页地址流有关,图 4.23 FIFO法的实页数增加, 命中率反而有可能下降,什么是堆栈型替换算法呢? 设A是长度为L的任意一个页面地址流,t为已处理过t-1个页面的时间点,n为分配给该地址流的主存页面数,Bt(n)表示在t时间点、在n页的主存中的页面集合,Lt表示到t时间点已遇到过的地址流中相异页的页数。如果替换算法具有下列包含性质:,则此替换算法属堆栈型的替换算法。,用堆栈处理技术对地址流进行模拟处理时,主存在t时间点的状况用堆栈St表示。St是Lt个不同页面号在堆栈中的有序集,St(1)是t时间点的St的栈顶项,St(2)是t时间点的St的次栈顶项,依次类推。
13、按照堆栈型算法具有的包含性质,必有,对不同的堆栈型替换算法,St各项的改变过程是不同的。例如,LRU算法是把主存中刚访问过的页号置于栈顶,而把最久未被访问过的页号置于栈底。确切地说,t时间点访问的页At,若 , 则把At压入堆栈使之成为St(1),而St-1(1)成为St(2), St-1(2)成为St(3),即St-1各项都下推一个位置;若AtSt-1, 则把它由St-1中取出,压入栈顶成为St(1),在At之下各项的位置不动,而At之上的各项都下推一个位置。,图 4.24 使用LRU法对页地址流进行堆栈处理,由图4.24的St可确定对应这个页地址流和主存页数n取不同值时的命中率。只要对不同
14、的n值,当AtSt-1,则命中;当 , 则不命中。例如,对n=4,其S5=5, 1, 2,3,因为A6=2S5,所以命中;但对n=2,其S5=5, 1,因为 , 所以不命中。这样就可算出各个n值的命中率H*如下所示:,3. 虚拟存贮器 工作的全过程,图 4.25 页式虚拟存贮器工作的全过程,4.2.3 页式虚拟存贮器实现中的问题,1. 页面失效的处理,发生页面失效之后,还应解决如何保存好故障点现场以及故障处理完,如何将当前所需的页面调入主存,恢复好故障点现场的问题, 以便能从故障点处继续执行这条指令。目前大多数机器都采用后援寄存器技术。把发生页面失效故障时指令的全部现场都保存下来。在处理完此故
15、障,并把所需要的页调入主存之后,取出后援寄存器的内容恢复故障点现场,然后从故障点处继续执行完该条指令。也有的机器同时采用一些预判技术。例如,在执行字符串指令前,预判字符串操作数的首尾字符所在页是否都已在主存中。 如果是,才执行这条指令。否则,只要有一个字符还未装入主存, 就发页面失效故障请求。等到把该页调入后, 才开始执行这条字符串指令。,2. 提高虚拟存贮器等效访问速度的措施要想使虚拟存贮器的等效访问速度提高到接近于主存的访问速度是不容易的。从存贮层次的等效访问速度公式可以看出, 这一方面要求能有很高的主存命中率,另一方面要求能有尽可能短的访主存时间。,图 4.26 经快表与慢表实现内部地址
16、变换,图 4.27 减少快表的相联比较位数,图 4.28 经散列实现快表,图 4.29 IBM 370/168虚拟存贮器的快表,3. 影响主存命中率和CPU效率的某些因素,图 4.30 页面大小Sp、容量S1与命中率H的关系,图 4.31 H与S1的关系,4.3 高速缓冲存贮器(Cache),4.3.1 基本结构,图 4.32 Cache存贮器的基本结构,目前,访问Cache的时间一般可以是访主存时间的1/4到1/10。 如IBM3033、Amdahl470V/7等许多机器的主存周期为300600 ns,而访问Cache的时间只需要50100 ns。因此, 只要Cache的命中率足够高,就相当
17、于能以接近于Cache的速度来访问大容量的主存。Cache存贮器已在大、中、小以及微型机上普遍采用。,为了加速调块,一般让每块的容量等于在一个主存周期内由主存所能访问到的字数,因此在有Cache存贮器的主存系统都采用多体交叉存贮器,例如,IBM 370/168的主存是模4交叉,每个分体是8个字节宽,所以Cache的每块为32个字节;CRAY1的主存是模16交叉,每个分体是单字宽,所以其指令Cache(专门存放指令的Cache)的块容量为16个字。 另外,主存被机器的多个部件所共用,应尽量提高Cache的访主存优先极,一般应高于通道的访主存级别,这样在采用Cache存贮器的系统中,访存申请响应的
18、优先顺序通常安排成Cache、通道、写数、读数、取指。因为Cache的调块时间只占用12个主存周期,这样做不会对外设访主存带来太大的影响。,4.3.2 地址的映象与变换,图 4.33 全相联映象规则,1. 全相联映象和变换,图 4.34 全相联映象的地址变换过程,图 4.35 直接映象规则,2. 直接映象及其变换,图 4.36 直接映象的地址变换过程,图 4.37 组相联映象规则,3. 组相联映象及其变换,图 4.38 组相联地址变换示意图,图 4.39 组相联地址变换的一种实现方式,图 4.40 组相联映象的另一种方案,图 4.41 组相联另一种方案的地址变换过程,4. 段相联映象,图 4.
19、42 具有每段Z个块的段相联映象,4.3.3 替换算法的实现,图 4.43 全相联映象LRU法经堆栈实现(需要有相联比较功能),1. 堆栈法,图 4.44 组相联LRU法经寄存器实现(每组一个,需要有相联比较功能),2. 比较对法比较对法的基本思路是让各个块成对组合,用一个触发器的状态来表示该比较对内两块访问的远近次序,再经门电路就可找到LRU块。例如有A、B、C3 块,互相之间可组合成AB、BA、AC、CA、BC、CB6 对,其中AB和BA、AC和CA、BC和CB是重复的,所以只需取AB、AC、BC 3 对。各对内块的访问顺序分别用“对触发器”TAB、TAC、TBC表示。TAB为“”,表示A
20、比B更近被访问过;TAB为“0”,表示B比A更近被访问过。TAC、TBC也类似定义。这样,当访问过的次序为A B C,即最近访问过的为A,最久未被访问过的为C,则这三个触发器状态分别必为TAB=1,TAC=1,TBC=1。,如果访问过的次序为B A C,C为最久未被访问过的块,则此时必有TAB=0, TAC=1, TBC=1。 因此以最久未被访问过的块C作为被替换掉的块的话,用布尔代数式必有,图 4.45 用比较对法实现LRU算法,现在来分析比较对法所用的硬件量。由于每块均可能作为LRU块,其信号需要用一个与门产生,所以有多少块,就得有多少个与门;每个与门接收与它有关的触发器来的输入, 例如A
21、LRU与门要有从TAB、TAC来的输入,BLRU要有从TAB、TBC来的输入,而与每块有关的对数为块数减去1,所以与门的扇入数是块数减去1。若p为块数,两两组合,比较对触发器的个数应为 ,即为p(p-1)/2。表4.2给出了比较对法块数p的取值与门数、 门的输入端数及比较对触发器数的关系。,表 4.2 比较对触发器数、门数、门的输入端数与块数的关系,综上所述,替换算法实现的设计是围绕下述两点来考虑的:一是如何对每次访问进行记录(使用位法、堆栈法、比较对法所用的记录方法都不同); 二是如何根据所记录的信息来判定近期内哪一块是最久没有被访问过的。由此可见,实现方法和所用的映象方法密切相关。例如,对
22、于主存辅存存贮层次的全相联映象宜于采用使用位法或类似的方法,而不宜采用堆栈法和比较对法;但对于Cache主存存贮层次的组相联映象,因为组内块数较少,就宜用比较对法或堆栈法。替换算法的设计和实现也和器件的发展密切相关。随着器件的改进,尤其是高速相联存贮器片子的改进,已经而且必然会不断研制出新的更好的实现方法。,4.3.4 Cache的透明性及性能分析,1. Cache的透明性分析,图 4.46 每个处理机都有Cache的共享主存多处理机系统,2. Cache的取算法,Cache所用的取算法基本上仍是按需取进法,即在出现Cache块失效时,才将要访问的字所在的块(行)取进。由于程序存在局部性,只要
23、适当选择好Cache的容量、块的大小、组相联的组数和组内块数,是可以保证有较高的命中率的。然而如辅之以采用在未用到某信息块之前就将其预取进Cache的预取算法,还有进一步提高命中率的可能。,为了便于硬件实现,通常只预取直接顺序的下一块,即在访问到主存的第i块(不论是否已取进Cache)时,只有第i+1块才是可能的预取块。至于何时将该块取进,可以有恒预取和不命中时预取两种不同的方法。恒预取指的是只要访问到主存第i块的某个字,不论Cache是否命中,恒发预取命令。不命中时预取仅当访问第i块不命中时,才发预取命令。Amdahl 470V/8采用的就是不命中时预取法。,采用预取法并非一定能提高命中率,
24、它还和其他因素有关。 一是块的大小。若每块的字节数过少,预取的效果不明显。从预取需要出发,希望块尽可能增大。但若每块的字节数过多, 一方面可能会预取进不需要的信息,另一方面由于Cache的容量有限, 又可能把正在使用或近期内就要用到的信息给替换出去,反而降低了命中率。从已有模拟结果来看,每块的字节数如果超过256,就会出现这种情况。 二是预取开销。要预取就要有访主存开销和将它取进Cache的访Cache开销,还要加上把被替换块写回主存的开销。这些开销会增加主存和Cache的负担,干扰和延缓程序的执行。,设Dc为不命中时,由主存调一块进Cache的开销,则Dc不命中率(按需取进法)为按需取进法的
25、开销;而Dc不命中率(预取法)为预取法不命中时的开销,但预取法还应有预取开销。 现设:预取率为预取总块数/访主存总块数;Pa为预取访主存和访Cache的开销,则Pa预取率是预取法为取进预取块的开销。 又设:访问率为访Cache的总次数/程序访Cache的次数,即(程序访Cache的次数+预取访Cache的次数)/程序访Cache的次数;Ac为由于预取访Cache占用了Cache,延迟、干扰了程序对Cache的访问的预取干扰开销,则Ac(访问率-1)反映了预取法对程序访Cache的影响。,这样,预取法只有在满足 Dc不命中率(按需取进)Dc不命中率(预取)+Pa预取率+Ac(访问率-1) 才是可
26、取的。这里,采用缓冲器技术是减少预取干扰的好办法。 Cache和主存都设置预取专用缓冲器,使预取访主存与访Cache都尽可能在主存、 Cache空闲时进行。模拟结果表明,恒预取法使不命中率降低(7580)%,而不命中时预取法使不命中率降低(3040)%。但前者所引起的Cache、 主存间传输量的增加要比后者大得多。,3. 任务切换对失效率的影响受限于Cache的容量,多个进程的工作区很难同时保留在Cache内。因此,造成Cache失效的一个重要原因是任务切换。 失效率的高低当然就和任务切换的频度有关,或者说与任务切换的平均时间间隔Qsw的大小有关。 设从Cache为空(指的是新进程所需的内容都
27、未装入Cache中)开始到Cache全部被装满这一期间的失效率为冷启动(Coldstart)失效率;而从Cache为现行进程装满之后测出的失效率为热启动(Warm-start)失效率。,Qsw对失效率的影响和工作负荷有很大关系。例如,如果进程切换发生在用户程序因为系统需运行管理程序来处理某个I/O中断或时钟中断请求时,则Qsw值愈小,表明由管理程序切换回原先的用户程序愈快,Cache中保留的原先程序的指令和数据就愈多,亦即失效率就愈低。然而,如果进程切换是在几个用户程序之间进行,且每个进程都要更换掉Cache中的大部分内容时,那Qsw值愈小就会使失效率愈高。 因任务切换所引起的失效率高低还与C
28、ache的容量有关。Qsw值一定时,若容量过小,存不下该程序的工作区,那就会有很高的热启动失效率。因此,增大Cache的容量可使这个矛盾迅速缓解,而使失效率急剧下降;但在容量增大到基本上包含得了足够大的工作区之后,容量对失效率的下降就渐趋平缓了, 也就是说增大容量对降低失效率已影响不大了。,至于Qsw值变化的影响,在Cache容量很小时,由于热启动失效率过高,相对来说,冷启动失效率所占比例很小。因此,增大Qsw值(任务切换次数的减少)并不使热启动失效率有明显的减少, 所以,总的失效率仍很高,且差别不大。但当Cache容量增大到热启动失效率有了迅速下降后,冷启动失效率比重就增大了, 这时,切换次
29、数这一因素起着主要作用,增大Qsw值会使失效率显著减小。 ,由于任务切换引起的Cache失效率可以通过下述几种办法来解决:增大Cache容量;修改调度算法,使任务切换回来之前,有用的信息仍能保留在Cache中不被破坏;设置多个Cache,例如设置两个Cache,一个专用于管理程序,一个专用于用户程序。这样, 在管态和目态之间切换时, 不会破坏各自Cache中的内容。此外, 对于某些操作,例如长的向量运算、长的字符行运算等,可以不经过Cache直接进行,以避免这些操作由于使用Cache,而从Cache中置换出大量更有希望将重新使用的数据。,4. 影响Cache存贮器性能的因素,图 4.47 块的
30、大小、组的大小与Cache容量对Cache命中率的影响,设tc为Cache的访问时间,tm为主存周期,Hc为访Cache的命中率,则Cache存贮器的等效存贮周期为ta=Hctc+(1-Hc)tm,与主存辅存存贮层次不同的是一旦Cache不命中,由于主存与CPU之间有直接通路,CPU对第二级的访问时间就是tm,而不再是调块时间再加一个访Cache的时间了。这样,采用Cache比之于处理机直接访问主存,其速度提高的倍数为,因为Hc总是小于1,可以令Hc=/(+1),代入上式,得,显然,tm/(tm+tc)1,因此+1。即就是说,不管Cache本身的速度有多高,只要Cache的命中率有限,那么采用
31、Cache主存存贮层次后,速度能提高的最大值是有限的,不会超过+1倍。,例如,Hc=0.5,相当于=1,则不论其Cache速度有多高,其的最大值定比2小;Hc=0.75,相当于=3,则的最大值定比4小;Hc=1, =max=tm/tc,这是可能的最大值。由此可得出的期望值与命中率Hc的关系如图4.48所示。,图 4.48 的期望值与Hc的关系,由于Cache的命中率一般比0.9大得多,可达0.996,因此采用Cache是能使接近于所期望的tmtc的。 Hc值受Cache容量的影响很大。例如,Cache容量为4 KB时,Hc=0.93;8KB时,Hc=0.97,因此在tc/tm=0.12,对于4
32、KB的Cache,其速度提高倍数为,而对于8KB的Cache,其速度提高倍数为,因此,增加4 KB的Cache容量,带来层次速度的提高为,可见,为获得24%速度的改进,这个代价是合算的。,图 4.49 流水机器速度与主存速度、CPU拍宽和Cache容量的可能关系曲线,4.3.5 “Cache主存辅存”存贮层次,以地址变换为例,CPU提供访存的虚地址就可能需要变换成Cache地址、主存地址和辅存地址。如果对应此虚地址的单元已在Cache中,就需把虚地址直接变换成Cache地址,访Cache, 而不是先把虚地址变换成主存实地址,再由主存实地址变换成Cache地址,这样可以缩短地址变换的时间。如果对
33、应单元已在主存但尚未调入Cache时,则需把虚地址经快表和慢表变换成主存实地址去访主存,对读访问以及采用按写分配法的写访问还必须进行虚地址到Cache地址的映象或变换,以便把包含对应此单元所在的一块调入或替换进Cache。,如果对应单元还不在主存,就要把虚地址变换成辅存实地址,去辅存调页,同时,还要将虚地址映象变换成主存实地址将页调入主存,以及把虚地址映象变换成Cache地址,将其中的一块装入Cache。在这种三级层次中通常总是让页的大小恰好是块的2的幂倍,每一块的大小又是字的2的幂倍。而且每次用虚页号查快表和慢表以取得主存实地址和用虚地址对应Cache块号位置的虚块号经组相联去访Cache(
34、Cache中每个单元存放有主存实地址和对应的数据)同时进行。若能在快表中找到,就用由快表来的主存实地址与由Cache中读出的主存实地址相比较。当两者相符,存在Cache中该单元的数据就是要访问的虚、 实地址的内容。写Cache的过程与此类似。 ,由于每次访Cache,都要查快表,因此,查快表的速度必须尽可能快,不能因为它使访Cache周期延长过多。前面讲过,快表的内容是能随任务切换而变的,因此,Cache的内容也就能正确反映任务的切换。当然,在实际实现中,可以有很多技巧。 例如,Cache中每个单元所存的不必是整个主存实地址而只是其某种压缩。也有的机器是和主存实地址完全无关地用虚地址访问Cac
35、he。此外也还有一些其他的方案。,4.4 主 存保 护,先讲页表保护。每个程序有它自己的页表,其行数等于该程序的虚页数。 例如它有4页,则只能有0、1、2、3这4个虚页号。设由操作系统建立的程序页表,这4个虚页号分别对应于实页号4、8、10、14,则不论虚地址如何出错,总只能影响主存中分配给该程序的第4、8、10、14号实页。假设虚页号错成“5”,肯定不可能在该程序的页表中找到,也就访问不了主存,当然也就不会影响主存中其他程序的区域。这正是虚拟存贮器系统本身固有的保护机能,也是它的一大优点。为了更便于实现这种保护,还可在段表中的每行内,不仅设置页表起点,还设置段长(页数)项。若出现该段内的虚页
36、号大于段长,则可发越界中断。,键方式由操作系统按当时主存的使用分配状况给主存的每页配一个键, 称为存贮键,它相当于一把“锁”。所有页的存贮键存在主存相应的快速寄存器内,每个用户(任务)的各实页的存贮键都相同。 为了打开这把锁, 需要有把“钥匙”, 称为访问键。 每个用户的访问键由操作系统给定,存在处理机的程序状态字(PSW)或控制寄存器中。程序每次访问主存前,要核对主存地址所在页的存贮键是否与该程序的访问键相符,只有相符,才准访问。这样,就是错误地形成了侵犯别的程序的主存地址,也因为这种键保护而仍然不允许访问。IBM 370的保护键有4位, 能表示已调入主存的16个活跃的程序。其中“0000”
37、访问键是操作系统的,对这个访问键不论是否和存贮键相符都可访问,这是操作系统应能访问到主存整个区域所要求的。,图 4.50 环式保护的分层,对主存信息的使用可以有读(R)、写(W)和执行(E)3种方式。 “执行”指的是作为指令来用。相应的就有R、W和E访问方式保护。 这3者的逻辑组合可以反映出各种应用要求。如: RWE不允许进行任何访问(如专用的系统表格); RWE可以进行任何访问; RWE只能进行读访问(如对各个用户都用到的表格常数); (RW)只能按数据进行读、写(例如阵列数据当然不能作为指令执行); RWE只能执行,不能作为数据使用(如某个专门的程序); REW只能进行写访问(如用户对操作系统缓冲器的写入); (RE)不准写访问;,