存储系统

来源:互联网 发布:广告公司记账源码 编辑:程序博客网 时间:2024/04/29 04:02
以前的冯.诺依曼计算机是以运算器为中心的,而现在的计算机系统都是以存储器为中心的。

存储系统:由多种不同的存储器,配上辅助软硬件,使之从应用程序员来看,它们在逻辑上是一个整体,而容量相当其中最大的,速度相当其中最快的,价格相当于其中最便宜的。基本的两级存储体系是虚拟存储器和Cache存储器。
虚拟存储器是从主存容量满足不了要求提出来的,在主存和辅存之间增加软硬件设备,让它们构成一个整体,所以也称为主存-辅存存储层次。应用程序员可用机器指令的地址对整个程序统一编址,称该地址为虚拟地址(程序地址),而把实际主存地址称为实地址(实存地址)。当虚存空间大于实存空间时,对程序空间分割较小的段或页,由系统程序按需要调入物理主存,并用辅助映像表建立其虚实地址空间的对应关系。在用虚地址访存时,由系统硬件查看,这个虚地址所对应单元的内容是否已装入主存。如果在主存内,就变换成主存实地址去访问主存;如果不在主存内,就经辅助软硬件将含所要访问的单元在内的那个段或页的程序块从辅存调入主存,建立好映像关系,再进行访存。

因主存满足不了CPU的速度要求出现了Cache存储器,用辅助硬件将Cache和主存构成整体,因此也称Cache-主存存储层次。Cache存储器对于应用程序员和系统程序员都是透明的。
存储系统的理论依据是局部性原理。

对存储系统的基本要求是大容量,高速度,低价格。
存储器容量S=W*l*m;W为存储体的字长,l为存储体的字数,m为并行工作的存储体个数。
速度可以用访问时间Ta,存储周期Tm,频宽(带宽)Bm描述。
Ta是存储器从接收访存读申请到信息被读到数据总线上的时间,是处理机启动访存后必须等待的时间,它是确定处理机与存储器时间关系的一个重要参数。
Tm是连续启动一个存储体所需要的间隔时间,一般比Ta大。
Bm是存储器可提供的数据传送速率,以每秒传送的信息位数或字节数衡量。
对于存储器来说,其价格,速度,容量的要求往往是相互冲突的,为满足系统的对存储器性能的要求,人们一直在研究如何改进工艺,提高技术,降低成本,生成出价格低廉而速度更快的存储器件。但即使如此仅靠单一工艺的存储器无法同时满足容量,速度和价格的要求。因此,系统中就必须使用由多种不同工艺存储器组成的存储器系统,使所有信息以各种方式分布于不同的存储器上。

并行主存系统
1.单体单字主存:无并行,一次只能访问一个存储字。
2.单体多字主存:即存储字长比CPU字(数据字,指令字)长大,通常是CPU字长的整数倍,这样主存在一个存储周期可以读取多个CPU字。
3.多体单字主存:一个大容量半导体主存往往由许多容量较小,字长较短的存储器片子组成,每个片子都有其地址译码,读写驱动等电路,因此可以将多个片子组成多体单字交叉访问存储器。将CPU字在主存中按模m(单体个数)交叉编址,根据应用特点,又有低位交叉和高位交叉两种。
4.多体多字主存:即将多分体并行存储与单体多字相结合。
并行主存要求数据和程序都是顺序存取,如果程序转移多或数据随机分布,则并行性会下降。


存储器分类
1.按存储介质分:半导体存储器;磁表面存储器;光盘存储器
2.按数据存取方法分:顺序存取存储器;直接存取存储器;随机存取存储器;相联存取存储器;
3.按读写功能分:只读存储器ROM;随机存取存储器RAM
4.按信息保存特性分:易失性存储器;非易失性存储器;
5.按在计算机中的作用分:主存,辅存,缓存

存储器性能指标:容量,速度
因主存和辅存的构造和访问方式不同,对速度的衡量指标也不同
主存速度:存取周期,是指启动连续的两次读写操作所必须的时间间隔。
辅存速度:传输速率,外存涉及到机械运动,找到要读的数据在磁盘中的位置通常需要几到即使毫秒,然后一次读取一个数据块需要若干毫秒,平均每个信息的读取时间较短,因此把单位时间内可以对磁盘设备读写的数据量称为设备的传输速率。

两个或两个以上速度,容量和价格各不相同的存储器用硬件,软件或软件与硬件想结合的方法连接起来成为一个系统,这个系统对应用程序员透明,并且,从应用程序员看它是一个存储器,这个存储器的速度接近最快的那个存储器,存储容量与容量最大的那个存储器相等或接近,单位容量的价格,接近最便宜的那个存储器。
常用的存储系统有Cache存储系统和虚拟存储系统。
Cache存储系统由Cache和主存构成,主要目标是提高存储器的速度,它全部采用硬件来调度,因此它对应用程序员和系统程序员都是透明的,Cache采用相联方式访问,对程序员来说是不需要编址的。
虚拟存储系统由主存和磁盘构成,主要目标是增加存储器的容量,采用硬件与软件相结合的方法来访问,它需要操作系统的存储管理系统来调度,因此对系统程序员来说它是不透明的,但对操作系统之上编程的应用程序员来说是透明的,其存储容量是一个很大的虚拟地址空间,这个空间的大小比主存的实际存储容量要大,即应用程序员可以再一个比主存大的地址空间内编程。

半导体随机存取存储器按其存储信息的原理不同,可分为静态RAM(SRAM)和动态RAM(DRAM)。
SRAM利用双稳态触发器来保存信息,只要不断电,信息就不会丢失;

DRAM利用MOS电容存储电荷来保存信息,使用时需要不断给电容充电才能使信息保持。

虚拟存储器
根据存储映像算法的不同,可以有多种不同的存储管理方式,主要有段式,页式,段页式。

段式管理
程序都有模块性,一个复杂的大程序总可以分解成多个在逻辑上相对独立的模块,这些模块可以是主程序,子程序,也可是数据块。块的大小各不相同,有的甚至事先无法确定。每个模块都是一个单独的段,都以该段的起点为0相对编址。当某个段由辅存调入主存时,只要系统赋予该段一个基址(即该段在主存中的起始地址),就可以由此基址和单元内的偏移形成单元在主存中的实际地址。将主存按断分配的存储管理方式称为段式管理。
在进行段式管理,每道程序在系统中都有一个段(映像)表存放该程序各段装入主存的状况信息。为了进行段式管理,还得由操作系统为整个主存系统建立一个实主存管理表,它包括占用区域表和可用区域表两部分,占用区域表的每一项记录主存那些区域被占用,被那道程序的哪个段占用以及段的起点和长度。此外还记录该段是否被修改过,以便在该段被释放的时候是否需要写会辅存。
可用区域表每一项记录一个未被占用区的基地址和大小,当一个段从辅存装入主存时,操作系统会在占用区中增加一项记录该段,并修改可用区域表。当一个段从主存退去时,就将其在占用区域表中的记录移入可用区域表中,并修改有关信息。

页式管理
段式管理在主存中的起点随意,且断长也是随意的,这样给存储管理带来不便,而且容易产生碎片。
页式存储是把主存空间和程序空间都机械等分成固定大小的页,按页顺序编号。这样任意主存单元的地址就是由实页号和页内偏移组成。每个独立的程序也有自己的虚页号顺序。
系统设置相应的页(映像)表,记录虚页装入实页时的页面对应关系,就可以由给定的程序虚拟地址查页表变换成主存的实地址进行访存。
若机器采用页式管理,则对每道程序都有一个页表,记录程序各页的信息。同时与段式管理使用了实主存管理表管理整个主存类似,页式管理时系统也设置了专门的主存页面管理表,以指明主存中每个页面位置弟弟使用情况及其他信息。

段页式管理
在主存利用率上,页式管理要高于段式管理,但是页式管理没有将程序划分逻辑模块的优势,所以,将段式管理和页式管理相结合构成段页式存储管理。
段页式存储是把实存机械等分成固定大小的页,而程序先根据模块进行分段,再对每个段分成与主存大小相同的页。每道程序都有一个段表和相应一组页表进行定位。段表的每一行对应一个段,段的装入位表示该段的页表是否装入主存。若装入,则地址字段表示该段的页表在主存中的起始位置。段长字段指定该段页表的行数。而页表的每一行指明所在段对应页的相关信息,比如装入位表示该页是否装入主存等。段页式与纯段式的主要差别是段的起始地址不再是任意的,必须位于主存中页面的起点,且段的各个页面在主存中的实页位置不一定是连续的。
对于段页式管理,多用户虚拟地址由用户号u,段号s,页号p,页内偏移d四个部分组成。
用户号u标志每道程序(用户和进程),并能指明该道程序的段表起始地址存放在哪个基址寄存器中。
段号s可以查询段表找到该段的页表。
页号p可以查询页表找到该页在主存中的实页号
页内偏移d与实页号一起形成主存物理地址。

地址的映像与变换
地址的映像是将虚拟存储单元按什么规则(算法)装入(定位于)主存,建立起多用户虚拟地址与主存地址之间的对应关系。对页式而言,就是将多用户虚页号可以装入主存中的哪些页面位置,建立起虚页与实页的对应关系。
地址的变换是指程序按照映像关系装入主存后,在执行中,如何将多用户虚地址变换对应实地址。对页式而言就是如何将多用户虚页号变换成实页号。

映像方式有
全相联映像:即每道程序的任何虚页可以映像装入主存的任何实页。全相联映像只有当全部实页实页完,才会出现实页冲突,所以它是映像方式中实页冲突最低的。全相联映像采用页表法进行定位。
相联目录法:把页表压缩成只存放已装入主存的那些虚页与实页位置的对应关系,称为相联目录表法,简称目录表法。该表采用按内容访问的相联存储器构成。按内容访问的相联存储器不同于按地址访问的随机存储器,相联查找失败,表示此虚页未装入主存,发生页面失效故障,请求从辅存中调页。

当发生页面失效时,需要去辅存中去调页,就必须给出该页在辅存中的实际地址。为了提高调页效率,辅存一般是按信息块编址的,而且让块的大小通常等于页面的大小。以磁盘为例,辅存实地址格式为磁盘机号+柱面号+磁头号+块号。
将多用户的虚地址变换成辅存实地址,用类似页表的方式为每道程序设置一个存放用户虚地址与辅存实地址的映像关系表,作为外部地址变换用,称之为外页表。对应地将用于内存地址变换的页表称为内页表。外页表的内容是在程序装入辅存时就填好的。

页面替换算法
当处理机要用到的指令或数据不在主存中时,会产生页面失效,必须去辅存中将包含指令或数据的一页调入主存。通常虚拟空间比主存空间大得多,必然会出现主存已满又发生页面失效的情况,这时将辅存的一页调入主存会发生实页冲突。于是只有强制腾出主存中某个页才能接纳从辅存中调来的新页。选择主存中哪个页被替换,就是替换算法需要解决的问题。
替换算法的确定主要看主存是否有高的命中率,也要看算法是否便于实现,辅助软硬件成本是否低。被研究过的算法有随机法,先进先出法,近期最少使用(近期最久未用过)算法等。
1.随机法(Random, RAND)是用软的或硬的随机数产生器产生主存中要被替换页的页号。它没有使用主存使用的历史信息,反应不出程序的局部性,使主存命中率很低,因此不采用。
2.先进先出算法(First-In First-Out,FIFO)是选择最早装入主存的页作为被替换的页。这种算法实现方便,只需要在页表的表项中增加一个计数器字段,当该页装入时,让该页的计数器清零,而其他页的计数器加1,在页替换时,将计数器最大的替换掉就可以了。但它不能完全正确反映程序的局部性,因为最先进入的页可能正是现在经常在用的页。
3.近期最少使用算法(Least Recently Used,LRU)是选择近期最少访问的页作为被替换的页。它能比较正确的反映程序的局部性。一般来说,当前最少使用的页,未来也将很少被访问。但完全按此算法实现比较困难,需要为每一个实页都配一个字长很长的计数器。所以一般使用其变形,把近期最久未访问的页作为被替换页,将“多”和“少”换成“有”和“无”就方便多了。
操作系统为实现主存管理设置了主存页面表,每一行记录了主存中各页的使用情况。表中有一字段为“占用位”,表示主存该页是否被使用。至于被哪个程序哪个段或页使用,则由程序号和段页号指明。为实现近期最少使用算法,给表中每个主存页配置一位“使用位”标志。开始时所有页使用位标志都是0,只要某个实页的任何单元被访问过,就由硬件将其置1。由于采用全相联映像,调入页可以进入任何页,因此只有占用位全部为1,表示没有页未被占用,若此时发生页面失效,才会有页面被替换,这时只需要替换使用位为0的页就可以了。
显然,使用位不能全部为0,否则无法确定哪些页可被替换。一种办法是一旦使用位要全部进入为1时,立即由硬件强制全部使用位为0。
另一种办法是定期置全部使用位为0。先给每个实页再配置一个“历史位(未使用过计数器)”,定期地每隔△t时间扫描所以使用位,凡是使用位为0的将其历史位加1,并仍然让使用位为0,而对使用位为1的将其历史位和使用位都清0。这样历史位值最大的就是最久未使用过的,它可以被替换。
△t反应最近一个△t使用情况,而历史位反应多个△t时间的使用情况。
当然页面替换时还要考虑页面是否被修改过,以确定被替换页是否需要写回辅存。通常可以在主存页面表增加一个字段来记录页面是否被修改过。
近期最少使用和近期最久未用过都是LRU算法。
由于LRU算法随分配给该道程序的实页数n增加,命中率H会单调上升,因此可对LRU加以改进,提出使系统性能更优的动态算法,即根据各道程序运行中的主存页面的失效率,由操作系统动态调节分配给各道程序的实页数。当主存页面失效率超过某个值时自动增加该程序的主存页数以提高其命中率;而当主存页面失效率低于某个值时就自动减少分配给该程序的主存页数,以释放出部分主存页给其他程序用,从而使整个系统总共的主存命中率和主存利用率得到提高。

对页面失效的处理
对页面失效如何处理是设计好页式虚拟存储器的关键之一。
对于按字节编址的存储器完全可能出现指令或数据横跨在2个页面上存储的情况。如果当前页在主存中,而跨页存放的那一页不在主存,就会在取址,取操作数或间接寻址等访存过程中发生页面失效,就是说页面失效在一条指令的分析或执行过程中。一般中断都是在每条指令执行的末尾安排有访问中断操作,检验系统中是否有未屏蔽的中断请求,以便对其响应和处理。页面失效如果也用这种方法就会造成死机,因为不调页指令无法执行到访中断操作,从而就不可能对页面失效给予响应与处理。所以页面失效不能按一般的中断对待,应该看做是一种故障,必须立即给予响应和处理。
页面失效后还应该解决如何保存好故障点的现场以及故障处理完后如何恢复故障点的现场,以便能继续执行这条指令。

提高虚拟存储器等效访问速度的措施
缩短主存访问时间
页式虚拟存储器的内部地址变换靠页面进行,页表容量大只能存放在主存中,每访问主存一次,都要加访一次主存查表,如果采用段页式,查表还需加访两次主存,这样,为存取一个字需要经过2次或3次访存才能完成,其等效访问速度只能是不用虚拟存储器的1/2或1/3.
由于程序存在局部性,一次对于页表内各行的访问不是随机的,在一段时间里实际只用到表中的少数行,这样用快速硬件构成比全表小得多,其相联查找的速度很快,我们称这个用快速硬件实现的目录表称为快表。将原来在主存中存放全部虚实地址映像关系的表称为慢表。快表只是慢表中很少一部分的副本。
查表时,同时根据用户的虚拟地址查询快表和慢表,若在快表中查询到了,则停止慢表的查询,若在快表查询不到,则经一个访主存时间从慢表中查询实页号送给主存地址寄存器并访存,同时将此虚实页号的对应关系送入快表,这里对于快表也需要替换算法替换快表的内容。

从围绕程序讨论影响命中率的因素有:
程序地址流(是否太过随机,随机容易引起颠簸)
替换算法(算法是否符合程序的局部性原理)
分配给程序的实页数(分配的页数越多,自然容易命中)
页面大小(页面太小,比如相邻两次访存的逻辑地址间距大于页面大小,就会寻址新的页,若该页不在主存,则会产生页失效,但页面太大又会减少主存的页数,同时页太大存储空间利用率下降)
主存容量(主存越大当然命中率越高)。

从多道程序运行如何影响CPU的效率看:
对于分时系统,分配给每道程序的CPU时间片大小会影响对虚拟存储器的使用。如果分配的时间片太小,就应尽量减少页面失效的次数,否则时间片大部分耗在调页上。
多道程序的道数取多少也会影响到CPU的效率。道数太少,由于调页时CPU可能没用可以运行的程序而不得不停下来等待,使效率降低。反之当道数太多时,每道程序占有的主存页数太少,会频繁产生页面失效。

高速缓冲存储器(Cache)
高速缓存是为弥补主存速度的不足,在处理机和主存之间设置一个高速,小容量的Cache,构成Cache-主存层次,使之从CPU看来,速度接近Cache,容量却是主存的。
高速缓冲存储器工作原理与虚拟存储器类似,将Cache和主存机械等分成大小相同的快,每块由若干个字或字节组成。从存储原理上,Cache存储器中块和虚拟存储器中的页具有相同的地位,但是块比页要小。每当给出一个主存字地址进行访存时,都必须通过Cache-主存地址映像变换机构判断该访问字所在的块是否在Cache中,如果在Cache中,变换机构将主存字地址变换成Cache的地址去访问Cache,并从Cache中将单字送入处理机,若不命中,产生Cache块失效,这时就需要从主存中将该字所在的块通过多字宽通路调入Cache,并同时将该字通过单字通路送入处理机,并相应修改地址映像表中的相关信息。如果在块从主存调入Cache时,Cache已满,此时还需要进行块替换,块替换时同页替换一样也要采用相应算法,通常的算法有FIFO,LRU。而且对Cache的访问还可以采用流水线技术,使一个周期内能为多条指令和数据服务。为了加快调块,主存可以采用多体交叉存储器。

虽然高速缓冲存储器和虚拟存储器原理类似,实现方法也差不多,但是其产生的原因是不同的,Cache是因为主存跟不上处理机,而虚拟存储器是主存容量不够用。并且Cache由于希望其速度和CPU匹配因此完全采用硬件来实现,对用户程序员和系统程序员都是透明的。而虚拟存储器则采用硬件和软件相结合的方式来实现,对用户程序员透明而对系统程序员不透明。

Cache地址的映像与变换
Cache地址的映像就是将每个主存块按什么规则装入Cache中;地址的变换就是每次访问Cache时怎样将主存地址换成Cache地址。
全相联映像:主存中任意一块都可以映像到Cache中的任意一块位置。优点是块冲突低,Cache空间利用率高,但是其硬件成本高。
直接映像:主存中的第i块只能唯一映像到第i mod m块的位置上,m为Ccache的块数。它把主存空间按Cache大小等分成区,每区内的各块只能按位置一一对应到Cache的相应块上。优点是节省硬件成本低,缺点是Cache的块冲突概率提高了。若有两个或以上经常被使用的块被映像到同一块,则Cache的命中率急剧下降。
组相联映像:全相联和直接映像优缺点刚好相反,于是将两者组合起来就有了组相联。组相联是各组之间使用直接相联,而组内各块之间是全相联映像。将主存块i映射到i mod G的Cache组中的任意一块上。

Cache块的替换
1.写回法:给块一个修改标示位,当替换块的时候写入主存。
2.直达法(写直达法):修改的时候写入Cache时也直接写入主存。
如果是共享主存的多处理机系统,通常采用写直达法保证各处理机经主存交换信息不出错。
对于多处理机系统,共享主存改成共享Cache信息,可以避免信息不一致,但是如果不共享Cache而共享主存,则可能主存中的块有多个Cache副本,这对一致性带来麻烦。对于CPU都有自己的Cache的情况下,仅靠写直达不能保证主存单元和各个Cache中的内容一致。一种解决办法是采用播写法,即任何处理机写Cache时,不仅写入自己Cache的目标块和主存,还要把信息播写到所有Cache有此单元的地方,或者让所有Cache有此单元的块作废,下次访问按缺块处理。另一种办法是让某些共享信息不得进入Cache。

Cache取算法
1.按需取进法,即在Cache块失效时才将要访问的字所在的块取进。
2.预取法,即在取主存第i块时,将相邻的块一并取进。

Cache存储器的性能分析
和虚拟存储器类似,评价Cache存储器的性能主要看命中率的高低,而命中率与块的大小,块的总数,采用的映像方式,替换算法,地址流等有关。

Cache-主存-辅存三级存储
CPU提供访存的虚拟地址可以变换成Cache地址,主存物理地址,辅存物理Cache。
如果在Cache中命中,就需要把虚地址转换成Cache地址访问Cache。
如果未在Cache中命中,则需要将虚地址经快慢表换成主存地址去访主存,并将虚地址到Cache地址进行映像或变换,以便将访存单元对应的块调入Cache中。
如果在主存中依然没有命中,则就需要将虚地址转换成辅存实地址去辅存调页,同时还要讲虚地址映像变换成主存实地址并将页调入主存,且将虚地址映像成Cache地址并将一块装入Cache。
在这三级层次中通常总是让页的大小恰好是块的2的幂倍。

主存保护
存储区保护
1.对于不是虚拟存储器系统,可以采用界限寄存器方式,由系统软件经过特权指令设置上下界寄存器,从而划定每个用户程序的区域,禁止它们越界访问。它只适用于每个用户程序占用一个或几个(当前有多对上下界寄存器)连续的区域,而对于虚拟存储器系统中一个用户的各个页离散地分布于主存内,无法实现保护。对虚拟存储器系统需采用页表保护和键式保护等方式。
2.页表保护,每个程序都有它自己的页表,其行数等于程序的虚页数。由操作系统建立程序的页表,并分配相关实页号。因此当前程序出错也只能在分配的页面内出错,不会映像其他程序的内存页。
3.键式保护,由操作系统按当前主存的使用分配状况给主存的每页配一个键,称为存储键,它相当于一把锁。每个任务的各个实页的存储键都相同。为了打开这把锁,需要又把钥匙,称为访问键。每个用户的访问键由操作系统给定,存储在处理机的程序状态字或控制寄存器中。程序每次访问主存前,先核对主存所在页的存储键是否与该程序的访问键相符,只有相符才准访问。
4.环状保护,把系统程序和用户程序按其重要性及对整个系统能否正常工作的影响程度分层,通常低级别的为操作系统可访问,高层次的为用户程序。在程序运行前,先由操作系统定好程序各页的环号,并置入页表。而后把该程序的开始环号送入处理机的现行环号寄存器中,并把操作系统规定给该程序的上限环号(该程序能进入的最内层环号)也置入相应的寄存器。程序当前执行的环号可以进入和当前环号相同或大于当前环号的页,若进入比当前环号小的页,进入保护处理,判断是否允许访问,若可以访问,则需进过特权指令将现行环号寄存器的值改小为进入低环号页面的环号(但是永远不能进入比上限环号还小的页面)。

访问方式保护
即对主存信息的使用可以有读(R),写(W),执行(E)三种方式,相应就有R,W,E访问方式保护。对于虚拟存储访问,可以将这些访问方式作为字段放入页表或段表中。

0 0
原创粉丝点击