计算机组成原理 第三章 存储系统

第三章属于考察重点,涉及到存储器的扩展分类与cache的连接等知识点,不仅复杂而且很容易出错,属于重点内容。

3.1 存储器概述

存储器种类非常多,可以根据不同的角度进行分类。

按照在计算机中的作用分类,可以将存储器分为三类:主存储器、辅助存储器和高速缓冲存储器。
主存储器又称内存储器(内存),用来存放运行过程中的程序和数据,CPU可以直接访问,也可以与cache和辅助存储器交换数据。其特点是容量较小,存取速度较快,单位价格较高
辅助存储器又称外存储器(外存),用来存放当前暂时不用的程序和数据以及一些需要永久保存的信息,不能与CPU直接交流。其特点是容量极大,存取速度慢,单位成本低。

手机广告里面的12+512指的就是12G的内存和512G的外存,从不同容量的手机使用时可以看出,当内存小的时候会出现闪退现象,这就是内存不足,导致运行时没有足够的内存空间来存放程序需要的数据和程序,使得程序运行异常,所以很多手机厂商把内存又称作运行内存

高速缓冲存储器简称cache,位于主存与CPU之间,用于解决速度不匹配的问题。一般将cache制作在CPU中。

根据存储介质可以将存储器分为磁表面存储器、磁芯存储器半导体存储器和光存储器。

根据存取方式可以将存储器非随机存储器、只读存储器、串行访问存储器。
随机存储器(Random Access Memory)指的是存储器中访问任何一个存储单元用的时间都是相同的,任意一个存储单元都可以随机存取。主要用于主存或者高速缓冲存储器。
只读存储器(Read Only Memory)指的是存储器的内容只能随机读出而不能写入,一旦写入就固定不变,及时断电也可以保存在其中。基于这个特点ROM一般用于存放固定不变的程序。
串行访问存储器指的是需要按照访问的物理位置的先后顺序来寻址,最好的例子就是磁带,如果要听磁带最后的一部分内容,那么就必须从头开始,直到跳转到磁带的末位。顺序存储器的存取时间与物理位置有关,一般速度较慢。

根据断电后信息是否可以保存,存储器分为易失性存储器和非易失性存储器。RAM这类断电后信息就丢失的为易失性存储器,ROM这类则属于非易失性存储器。另外,根据读出后是否会破坏原信息,又可以区分破坏性,如果存储单元所存储的信息在被读出后就被破坏了称为破坏性读出,如果不被破坏则为非破坏性读出。破坏性读出的存储器需要在读出后紧接一个再次生成的操作以恢复存储的信息。

存储器主要有三个性能指标:存储容量、单位成本和存储速度。其中存储容量等于存储字数乘以字长。存储速度一般有三个指标:存取时间、存取周期和主存带宽。存取时间指的是从启动一次存储器操作到完成该操作需要的时间,分为读出时间和写入时间。存取周期指的是存储器进行一次完整的读写操作需要的时间,即连续两次独立访问存储器之间所需要的时间间隔,存取周期是大于存取时间的,因为还需要一些恢复性操作的时间。主存带宽又称数据传输率,指的是每秒从主存进出信息的最大数量
在这里插入图片描述

3.2 存储器的层次化结构

存储系统主要有三个相互制约的矛盾:大容量、高速度、低成本。一般来说存储系统的层次结构主要体现在cache-主存层次和主存-辅存层次两个方面。

其中,cache主存层次指的是由于CPU速度远大于主存,所以在实际运行时,会出现CPU等主存的现象,为了缓解CPU的空等,在主存和CPU之间增加一个速度快于主存的cache,让一部分常用数据存放在这里面,就可以缓解主存与CPU速度不匹配的问题。通过这一层次,让速度接近于cache但是容量和价格却接近于主存。这一层次完全由硬件自动完成,对所有程序员是透明的。

主存辅存层次则是为了解决主存容量的问题,让一部分不常用的数据放在辅存里,当需要访问时再拿进主存中。这样做使得整体速度接近于主存,容量与价位却接近于辅存。这一层次由硬件和操作系统共同实现,所以对应用程序员是透明的,但对于系统程序员则不是透明的。该层次在不断发展中形成了虚拟存储系统。

3.3 半导体随机存储器

这一节主要是介绍了两类RAM,即动态RAM和静态RAM。

静态RAM也称SRAM(Static Random Assess Memory),SRAM采用双稳态触发器来记忆信息,可以非破坏性读出,SRAM读取速度快,但是集成度低,功耗较大,所以一般用于组成cache。

动态RAM也称DRAM(Dynamic Random Assess Memory),是利用电容上的电荷来存储信息。很容易忽视的一点是DRAM采用地址复用技术,地址线只有原来的一半,需要两根线来确定行列位置,其中一根兼具片选信号线的作用。所以在看到DRAM或者地址复用技术时一定要将地址线减半。相较于SRAM,DRAM容易集成价格低容量大而且功耗低,缺点在于存取速度较慢,所以一般用来组成主存系统。

高中物理学过,电容如果不加压维持,其内部存在的电荷就会流失,而利用电容来存储信息的DRAM也受限于这个特性,必须要隔一段时间就刷新一次,而这个时间一般为2ms,称为刷新周期,一个刷新周期的时间内必须要刷新一次否则信息就会丢失。相对的,采用双稳态触发器的SRAM就不需要考虑刷新的问题。要区分开易失性和需要刷新,这是两码事,易失性考虑的是断电就没,而刷新是需要通电情况下维持。

刷新分为三种方式:集中刷新、分散刷新、异步刷新
集中刷新是指在一个刷新周期内,用一段固定的时间去给存储器中所有的行进行刷新,而这段时间内会停止对存储器的读写操作,称为死时间。这种刷新方式的优点是读写操作时不会受刷新工作的影响,即工作时不刷新,刷新时不工作,因此存取速度较高,缺点在于死时间内不能访问存储器。
分散刷新则是将每行的刷新分散到各个工作周期。将一个存储器的系统工作周期分为两部分,前半部分用于读写或者保持,后半部分则用于刷新某一行。这种方式好处是没有死时间,但是增加了系统的存取周期,降低了整机的速度。
异步刷新是前面两种方法的结合,是将刷新分散在一个刷新周期里面,具体做法是让刷新周期除以行数,得到两次刷新操作之间的时间间隔,每个这样一个间隔就刷新一行,相当于在一个刷新周期内给每一行都刷新了一次,效果上没有变化。这种方法避免了CPU等待过长而且减少了刷新次数,从根本上提高了工作效率。

这部分有时候也结合时序图来考查,读时序图大二时并没有讲,这里完全是自己半蒙半猜的理解。拿图来说:
在这里插入图片描述
对于这张读周期时序图,地址那一行有一个交叉,一个交叉表示一个新来的地址,CS那一行对应后面连接CPU的那一块,CS低电平有效,图中只有当变到低的时候才表示开始片选,恢复高表示片选结束,片选结束的位置对应到Dout那一行表示开始几你选哪个数据传输,逐渐由数据有效变为数据稳定。由此可以从时序图中找到很多信息,读出时间tA即从给出有效地址到开始出现数据的时间就是,片选时间tCO以及读周期tRC。
在这里插入图片描述
同样道理也可以来读写周期的时序图,二者的方法是一样的,区别在于读周期中WE一直保持高电平,而写周期WE需要变为低电平,所以多一行,其变化与CS保持一致,还有一个区别在Din那里,写要求数据总线稳定之后才能开始。

DRAM的刷新是很重要的一点,一定要充分理解刷新的目的以及三种刷新方法的过程,刷新需要注意一下三个问题:①刷新对CPU是透明的,不依赖于外部的访问 ②DRAM的刷新单位是行,即一次刷新一行 ③刷新类似于读操作,只需要给电容补充电荷而不需要信息输出。

在这里插入图片描述
对于只读存储器ROM,里面一旦有了信息就不会轻易改变,即使是断电也没有问题,所以在计算机系统中用于提供读出,其优点在于结构简单且具有非易失性。

ROM需要理解大体的一个发展流程。最初的ROM会在出厂前编写内部的内容,编写后用掩膜封装,完全无法改变,这种ROM称为掩膜式只读存储器(Masked Read Only Memory)好处是可靠性高而且价格便宜,但是灵活性极其差。改进后的ROM称为一次可编程只读存储器(Programmable Read Only Memory),可以由用户实现一次性的编程,所以灵活性有所改善但是内容仍然是一旦写入就无法改变。之后又发展出了可擦除可编程只读存储器(Erasable Programmable Read Only Memory),这种ROM可以由用户编写,而且可以重复进行,需要时全部擦出再编写,此时EPROM已经不是传统意义上的只能读不能写了,但是EPROM仍然不能取代RAM因为其编程次数有限而且速度较慢。再往后发展就出现了闪速存储器(Flash Memory),其主要特点是可以在不加电的情况下长期保存,又可以在线进行快速擦出和重写,一般U盘用的就是这个技术。发展的最终形态就是固态硬盘(Solid State Drives),利用固态电子存储芯片阵列制成的硬盘,可以长期保存、快速擦除重写,缺点是价格较高,电脑里面能够配大容量SSD一定不便宜。

在这里插入图片描述
图中需要注意,数据线的宽度对应MDR的宽度,地址线的宽度对应MAR的宽度,这个可以从MAR和MDR的定义来理解,MAR全称是Memory Address Register,其作用是寻址,所以MAR必须要覆盖所有的存储单元才能让每个存储单元都能被找到,所以其位数对应地址线的宽度,即计算机的内存范围,MDR用于暂存数据,可以这样理解,MAR找到了一个存储单元,MDR来修改里面的内容,所以必须要与存储单元内部的位数对应,即数据线的宽度。

3.4 主存储器与CPU的连接

大二时学计算机组成原理的噩梦就是这部分CPU的连接。

连接的过程需要连接数据线、地址线、片选信号和读写信号。

每个芯片的容量都是有限的,在需要的时候需要对芯片进行扩展使其满足需求,扩展主要有三种方法:位扩展、字扩展和字位同时扩展

位扩展是让芯片组合后的存储字长变大,使其数据位数与CPU的数据线数目相等。连接方法是将多个芯片的地址段、片选段、读写控制端并联,而数据段分别引出。不难看出位扩展是对数据线的操作。
在这里插入图片描述
图中的位扩展是将8个1K1位的芯片扩展为8K8位的芯片,只需要对数据线的连接进行处理,让数据线根据各个芯片的位数分别连上对应的线,图中一个芯片是1位,所以让数据线的8根一个连接1个芯片,如果是两个4位的芯片,就让8条数据线中的前面4条连接第一个芯片后面4条连接第二个芯片,而地址线、片选线和读写信号都保持一致。位扩展类似于电路连接里面的并联,扩展后的芯片表面上像是扩大了存储字长,而存储容量上没有变化,而且在片选时也保持一致。

字扩展是扩大存储器字的数量而位数保持不变,字扩展的地址线、数据线。读写控制线都并连,用片选信号来区分各个芯片的地址范围。字扩展就相当于把几个芯片都接入了存储系统,扩大了容量,而且各个芯片都保持相对的独立,需要用片选信号来选择要访问的是哪一个芯片,片选信号的知识在后面的片选部分。
在这里插入图片描述
图中展示的字扩展,是将4个16K的芯片扩展了,可以看见读写信号、数据线是各自连接的,每一片都是16K所以需要14根地址线来连接,多余的地址线用于片选信号的确定,需要连接到译码器里面来译码。

字位同时扩展法是上面的两种同时选用,位扩展后的芯片某种程度上看成一体来再进行字扩展,效果如下:
在这里插入图片描述
扩展好芯片就需要确定片选,就是选择这么多芯片里面的哪一个去访问。片选主要有两种方法:线选法和译码片选法。

线选法是用除片内寻址外的高位地址线直接(或经反相器)分别接至各个存储芯片的片选端,当某地址线信息为“0”时,就选中与之对应的存储芯片。这些片选地址线每次寻址时只能有一位有效,不允许同时有多位有效,这样才能保证每次只选中一个芯片。
在这里插入图片描述
图中的低10位需要用于片内的寻址,连接了4个芯片所以需要用4位来确定地址,A11为0对应第一个芯片,A12为0对应第二个芯片,以此类推。不难发现这种方法虽然简单,但是地址空间不连续而且对应的地址线必须是低电平,很容易导致资源的浪费。一般不太喜欢考察这种方法。

译码片选法是真正的干货,也是画图题最喜欢用的方法,主要是借助译码器来实现,用除了片内寻址外的地址线通过译码器来实现。
在这里插入图片描述
这是一个从答案里直接扣出来的74138译码器,CBA用于译码,需要在这里输入信息,G1 G2A G2B可以看做电源,需要在G1上接一个高电平在G2A G2B上接一个低电平才能让这个译码器进行工作,在电路里面符号上面画一条横线表示是低电平。Y4Y5表示片选的结果。具体在例题中,这里大体说一下,CBA输入的内容要根据所选的芯片的范围来确定,让最高几位里面具有区分度的几位输入进入,结果就对应到Y这一端,输出后是低电平,这是由于芯片的片选信号输入是低电平有效,通过这种方式来确定是选择这一片。

干说无益,这种题最好借助例题:
在这里插入图片描述
先看题目要求,系统程序区对应ROM,用户程序区对应RAM,将这两个范围写成二进制形式后可以发现ROM是2K的空间,RAM是1K的空间,所以根据此选择2K8位的ROM芯片和2个1K4位的RAM芯片进行扩展。
在这里插入图片描述
选择好芯片,下一步可以先画一下大框架,数据线最好确认,所以个人习惯先画数据线。两个4位的RAM需要用位扩展扩展成8位,所以需要在数据线的连接上进行操作,第一个芯片连接D0-D3,第二个芯片连接D4-D7。而8位的芯片就按照规矩直接连D0-D7即可。
在这里插入图片描述
之后再连接地址线,地址线需要看之前展开的二进制范围。这里一般将位扩展后的芯片直接合成一个完整的来看待,反正位扩展后片选是同时的,所以这样操作并不会有什么不妥。第一个2K的ROM需要11根地址线,所以将其连上A0-A10这11根地址线,合并后的RAM是1K,所以连接上A0-A9共10根地址线,这里要小心,CPU的引脚编号都是从0开始的。ROM由于比RAM大,所以编号A10的线不需要连接RAM芯片,这里不需要觉得别扭,空着不画即可。
在这里插入图片描述
这两个线确定后,需要的就是确定片选信号,让译码器在某种情况下可以选择需要的芯片,这里也是要依靠之前展开的二进制形式。要选择能确定芯片的位作为CBA的输入,观察展开的二进制,A0-A10已经用上过了,必然不能作为源输入CBA,剩下的位中,A13-A11刚好可以在需要选ROM时为100而需要选RAM时为101,就选择这样具有区分性的位作为信息输入,输出端的下标就将这个数转换为十进制,100是4,所以选择ROM芯片时为Y4,同理101为Y5,确定好输入输出,还要给译码器连接电源,让A14连接需要高电平的G1,A15连接需要低电平的GA1,还缺一个低电平,用MREQ来补充,这样就连接好了译码器。
在这里插入图片描述
连接好译码器并不一定代表连接好了片选信号,问题处在RAM缺少的A10那一位,根据我们的片选结果,A13-A11三位输入后如果为5就输出对应的低电平,但是如果A10那一位为1也符合结果为5但选择时却选不到对应的位置,所以需要将A10这一位也与Y5相结合,处理方法是用非门,这里可以用一些基础的逻辑运算来解释,由于是低电平有效,所以最后的结果一定要是低电平,而Y5的结果是低电平,A10本身是0也是低电平,所以画成图中所示的样子。圆圈表示取反,两个输入取反后都是1,做与运算结果是1,再取反表示0,符合要求。
在这里插入图片描述
选好了片选信号,剩下的就是把一些细节完善,RAM芯片需要连接读写信号,而ROM需要一个接地。完善好后就得到了完整的连接图。
在这里插入图片描述
不得不说连接出来以后特别有成就感。总结一下步骤,首先选择需要的存储芯片,根据给出的RAM和ROM的大小来确定选择芯片,选择好后连接数据线,在这一步中进行位扩展,扩展好后的芯片可以直接看作一个整体扩大了位数的芯片,下一步是确定地址线,用给出的地址范围进行确定,之后确定片选信号,给译码器输入信息,通过哪几位可以唯一找出需要的那一片,就将这几位输入到CBA中,之后连接电源,MREQ一定是低电平,如果实在找不到高电平可以外接一个5V的电源,如果需要调整片选信号就用相应的门电路来改善,最后查缺补漏补上读写信号及接地。

3.5 双端口RAM和多模块存储器

这一节介绍的技术都是为了提高CPU访问存储器的速度。

首先是双端口RAM,指的是同一个存储器有左右两个独立的端口,具有独立的地址线、数据线和读写控制线,也就是说可以同时异步地访问存储单元,只要两个端口的地址不相同,就不会发生冲突。
在这里插入图片描述
当两个端口同时访问一个地址时,根据操作的组合也有产生冲突的可能,具体如下:
在这里插入图片描述
其中1和2不会冲突但3和4会冲突,解决方法是设置忙信号,由判断逻辑决定临时关闭另一个端口,让当前端口完成操作之后再让另一个访问。

另一种是多模块存储器,双端口RAM是一个存储器开了两个门,而多模块存储器是在存储器内部拆成了许多部分。常用的有单体多字存储器和多体低位存储器。

单体多字存储器是一个存储器中只有一个存储体,每个存储单元存储m个字,总线宽度也为m个字。一次并行读出m个字,地址必须顺序排列并处于同一存储单元。在一个存取周期内,从同一个地址取出m条指令,然后将指令逐条送到CPU执行,即1/m个周期向CPU送一条指令。这种方式的好处是提高了单体存储器的工作速度,但是要求指令和数据在主存内必须是连续存放的,一旦遇到转移指令或者不连续存放效果就不明显。
效果上类似于扩大了每个存储单元的位数,原本可以放一条指令的存储单元扩大成可以放四条指令,在取的时候直接将四条指令全部取出来然后一条一条送到CPU处理,取指令的速度变快了,但是如果指令不连续存放,就是说一口气取出来的不是同一个操作需要的指令,这种情况下还是需要分几次去取,效果就不是那么明显

多体并行存储器是由许多多体模块组成,各模块有相同的容量和存取速度,有独立的读写控制电路,地址寄存器和数据寄存器,可以并行工作也可以交叉工作。多体并行存储器分类高位交叉编址和低位交叉编址两类
高位交叉编址是指高位地址表示体号,低位地址为体内地址。高位交叉编址方式下,总是把低位的体内地址送到高位体号确定的模块内进行译码。访问一个连续主存块时总是先在一个模块内访问,等到该模块访问完才转到下一个模块访问,CPU总是按顺序访问存储模块,存储模块不能被并行访问,因而不能提高存储器的吞吐率。相当于顺序存放,每个模块内地址都是连续的,一个模块后接着另一个继续排地址。
在这里插入图片描述
低位交叉编址指的是低位地址为体号,高位地址为体内地址。低位交叉编址方式下,总是把高位的体内地址送到由低位体号确定的模块内进行译码。****,因此称采用此编址方式的存储器为交叉存储器。采用低位交叉编址后,可在不改变每个模块存取周期的前提下,采用流水线的方式并行存取,提高存储器的带宽。相当于把指令存放在了相邻的存储体中,每个存储体都存放了一部分,取的时候同时取出各个体中相同位置上内容。
在这里插入图片描述
设模块字长等于数据总线的宽度,存取一个字的周期为T,传送周期为r,那么存储器交叉模块数应该大于等于m=T/r,称m为交叉存取度。这个量主要是为了保证经过mr的时间后,再次启动该模块时上次的存取操作已经完成而不需要等待。这样交叉存取方式下存取m个字需要的时间为T+(m-1)r,而顺序方式需要mT的时间,可见低位交叉存储器带宽大大提高。

3.6 高速缓冲存储器

cache主要是利用到了程序访问的局部性原理,局部性原理主要体现在两方面:时间和空间。时间局部性是指在最近的未来要用到的信息,很可能是现在正在使用的信息。空间局部性是指在最近的未来要用到的信息很可能与现在正在使用的信息在存储空间上是邻近的。高速缓冲存储器技术就是利用了局部性原理,将程序正在使用的部分放在一个高速的、容量较小的cache中,使CPU的访问大量在chche中进行,从而提高执行速度。

这一部分有时候让辨别哪个程序段的时间局部性更好或者哪个程序段空间局部性更好,这一般取决于代码的实现细节。
在这里插入图片描述
对于这两个代码段,若要对比数组的时间空间局部性,区别就在于二维数组的访问方式,A是先行后列,B是先列后行,二维数组在计算机内默认是行优先,所以A是按照存储顺序一个一个访问的,即访问顺序与存放顺序一致,所以空间局部性好,而B相当于是跳跃着访问的,所以空间局部性要差一些。而时间空间性两者都很差,因为对数组的访问都只进行了一次,没有重复一说。但若比较sum指令的局部性,两个程序就都一样了,循环内指令按顺序连续存放,所以空间局部性都好,指令是重复执行2048*2048次,所以时间局部性也好。

cache位于存储器层次的顶层,一般由速度快的SRAM来构成,为了方便与主存信息交换,将cache和主存都划分成相等的块,cache块又称为cache行,块的长度称为块长。cache的总容量要小于主存,所以cache的块数目也会小于内存块的数目,它仅保存主存中最活跃的若干块的副本

当CPU发出请求时,如果在cache中命中,就转换为cache地址直接访问cache中的副本,如果没有则需要访问主存,并把访问的那一块调入cache。需要注意的是CPU与cache之间的交换是以为单位的,但是cache与主存之间的交换则是以为单位的。这里就顺便引出了命中率的定义,用命中次数除以总次数得到的就是命中率,命中率显然越接近1越好,这表明对内存的访问全部转移到了速度更快的cache上,从而速度更快。

Cache行中的信息是主存中某个块的副本,地址映射是指把主存地址空间映射到Cache地址空间,即把存放在主存中的信息按照某种规则装入Cache。由于cache行数要远小于内存块数,所以只有一部分内存块可以放在cache中,因此需要一个标记来指明cache里面的块对应的是内存空间里面的哪一块,相当于一个编号,除此之外,还需要一个有效位来说明cache行中的信息是否有效。一般有下面三种地址映射的方法:
①直接映射
主存中的每一块只有唯一的一个在cache中的位置,若位置上已经有,则产生冲突,把原来位置上的块直接替换掉。这种方法简单但是不够灵活,很多位置有时候会出现空着干等的现象,所以空间利用率低,块冲突概率高。
在这里插入图片描述
直接映射的关系如图所示,不难看出主存块数模cache行数结果相同的主存块都会映射到同一个cache位置上。
直接映射的地址结构为:
在这里插入图片描述
实际运行时,CPU传过来的主存地址,先从里面取中间的行号位,到cache对应位置去找,将cache行中保存的高位的标记部分与主存地址的高位做比较,相等且有效位为1,说明命中,直接在cache块中找块内地址即可,如果有效位为1但标记不同,说明这个位置上存放了主存副本,但不是目标副本,仍然需要去替换。若不命中则访问主存所在的位置再将这一块转入到cache中并将对应位置的有效位置1。这个结构是需要人为确定的,三部分的位数是根据具体情况来判断,块内地址取决于内存块的大小,cache行号取决于总共有多少个cache块,可以用cache容量除以每块大小得到,标记位是主存长度减去行号和块内地址所用的位来得到。
在这里插入图片描述
②全相连映射
主存中的每一块可以装入Cache中的任何位置,每行的标记用于指出该行取自主存的哪一块,所以CPU访存时需要与所有Cache行的标记进行比较。这种方式的好处是灵活,冲突率低、空间利用率高、命中率也高,但是标记的比较速度慢,实现起来成本较高。
在这里插入图片描述
从映射关系图不难看出,每个主存块都可以映射到cache的任何块上,所以不需要在地址里面找cache行号,只保留块内地址,运行时顺序比较cache里面的每个块,如果标记相同且有效位为1说明命中,如果cache块里面哪个块都不命中,就只能去主存里面访问了。

③组相连映射
这种映射方式可以看作前面两种的结合。将cache空间划分为等大的许多组,主存的数据块可以装在一个组内的任何位置。相当于主存块在映射到组时是直接映射,在组内用的是全相连映射。每个组内有r个cache行,则称为r路组相联。
在这里插入图片描述
这种映射方式下,CPU传过来的地址与直接映射的区别就在于中间部分换成了cache组号而不再是行号,所以在求的时候,先求有多少个cache块,再除以路数得到有多少组。先去对应的cache组,再在组内遍历寻找。

关于前面所提到的标记,具体来说只是标记项里面的一部分。其实每个cache项都对应一个单独的标记项,这个标记项里面包含了有效位、标记(前面所指的标记)、一致性维护位、替换算法控制位,根据具体需要标记里面的内容可能是不一样的。
在这里插入图片描述
cache中同样存在替换问题,这里和操作系统里面的页面置换是相同的,有三种方法:随机算法(随机找一个cache块替换)、先进先出算法和近期最少使用算法。算法的使用完全一致。需要注意的是,在使用近期最少使用算法时,需要在cache行中设置一个计数器,来记录主存块的使用情况,这个计数器一般也放在标记项里面。

由于cache保存的是主存的备份,所以就会出现cache信息与主存信息不一致的现象,此时需要采用合适的写策略来让二者内容保持一致。对于写主要有两种方法:全写法和写回法。全写法是把数据同时写入cache和主存,这样每时每刻内存和cache的信息都是一致的,缺点在于比较费时间。写回法是指只修改cache内容,只有当cache要被置换时才将cache写回到主存中,这种方法减少了访问主存的次数,但是需要一个脏位来区分是不是需要进行写回,这个脏位也放在标志位里面。
对于写不命中时,也有两种方法:写分配法和非写分配法。前者是先加载到cache中再对cache修改,后者是直接在内存中修改而不调块。

3.7 虚拟存储器

虚拟存储器是为了解决主存容量的问题而出现的技术,让辅助存储器具有主存的速度和辅存的容量,提高了存储系统的性价比。简单来说就是拿一部分外存假装当作内存,但这个只能是假装,实际运行时还是在内存上,但是看起来像是在内存和外存上。

虚拟存储器的是将辅存和主存共同编制,形成一个更大的空间,在这个空间内可以任意编程而不用在乎内存限制问题。其中用户允许编程的地址称为虚地址或者逻辑地址,实际的主存单元地址称为实地址或者物理地址。虚地址比物理地址要大的多。使用虚地址时,有硬件来确定两种地址之间的对应关系。

以页为基本单位的虚拟存储器称为页式虚拟存储器,虚拟空间和主存空间都划分成同样大小的页,主存的为实页,外存的为虚页,两种地址之间的转换是通过页表来实现的。页表是一张存放在主存中的虚页号和实页号的对照表,它记录着虚页调入主存时被安排在主存的位置。
在这里插入图片描述
通过虚页号,在页表里面找到一个对应的位置,对应位置上的有效位表示是否装入了数据,当有效位为1时表示该页已经调入了主存,可以将后面的位置换头成为主存的地址,有效位为0表示该页还没有调入主存,此时页表项可以记录该页在磁盘中的地址,从而方便去外存中寻找对应的页。脏位用来表示页面是否被修改过,在回写时用的到。引用位是用来配合替换策略来进行设置。

CPU执行指令时,需要先将虚拟地址转换为主存物理地址。每个迸程都有一个页表基址寄存器,存放该进程的页表首地址,然后根据虚拟地址高位部分的虚拟页号找到对应的页表项,若装入位为1,则取出物理页号,和虚拟地址低位部分的页内地址拼接,形成实际物理地址,若装入位为0,则说明缺页,需要操作系统进行缺页处理
在这里插入图片描述
采用页式虚拟存储器的好处是比较简单而且容易调入,缺点是程序不一定完全是页大小的整数倍,一定会出现浪费。

为了加快速度,在此基础上又引申出了快表,依据程序执行的局部性原理,在一段时间内总是经常访问某些页时,若把这些页对应的页表项存放在高速缓冲器组成的快表(TLB)中,则可以明显提高效率。相应地把放在主存中的页表称为慢表(Page)。在地址转换时,首先查找快表,若命中,则无须访问主存中的页表。因此快表可以看作是主存页表的一个副本,副本中主要是经常访问的页表项。

快表一般使用全相连或者组相联(访问速度足够快),每个TLB表项由对应的页表表项内容加上一个标记字段组成,标记字段用来表示该表项取自页表中哪个虚页号对应的页表项。

至此所学过的页表、快表、cache就可以连接在一起去理解了。页表和快表是针对于查找位置而设计的,而cache则是在访问过程中起作用的。整个过程并不复杂,理解好即可。这几个部分的示意图如下:
在这里插入图片描述
首先CPU传来一个虚地址,第一步是查找快表,用虚页号找快表中是否有对应的表项,如果有则直接换头得到物理地址,如果没有则需要查页表,页表中对应项有效位为1说明在内存中,换头得到物理地址,如果为0则去外存找对应位置加载到主存中。得到物理地址后进入cache的判断,根据对应的映射方式,找到cache中对应的位置,看是否命中,命中则换上片内偏移找到位置,没有命中则直接到主存中对应位置上去找。整个过程判断如下:
在这里插入图片描述
不难得到下图中的可能情况:
在这里插入图片描述
其中主要是这样几条规律:
①TLB命中则Page一定命中,因为TLB是Page的一部分
②TLB不命中Page命中与否暂不确定
③页表快表命中与cache命中没有关系,二者是独立的,前者命中说明信息一定在主存中,但不代表在cache中

除了页式虚拟存储器,还有段式虚拟存储器。段式虚拟存储器中的段是按程序的逻辑结构划分的,各个段的长度因程序而异。把虚拟地址分为两部分:段号和段内地址。虚拟地址到实地址之间的变换是由段表来实现的。段表是程序的逻辑段和在主存中存放位置的对照表。段表的每行记录与某个段对应的段号、装入位、段起点和段长等信息。由于段的长度可变,所以段表中要给出各段的起始地址与段的长度。这部分知识在操作系统中也会再次出现。

可以这样理解,段表就是长度不固定的页表,由于长度可变,所以整个内容的安排会更加灵活,不存在段内浪费的情况,但会在段之间即主存中产生浪费,此外段的分界与程序的自然分界相对应,因此具有逻辑的独立性。CPU得到虚存地址后,根据段号找到对应的段表位置,根据段表行的装入位确定该段是否装入内存,如果在内存中则换头得到真实的物理地址。

除此之外,还有一种结合了两种虚拟存储器的方式,即段页式虚拟存储器。将程序按照逻辑划分段,之后再将段划分为固定大小的页,这样一个程序对应一个段表,一个段对应一个页表,段的长度必须是页长的整数倍,段的起点必须是页的起点。

虚地址分为段号、段内页号、页内地址三部分。CPU根据虚地址访存时,首先根据段号得到段表地址;然后从段表中取出该段的页表起始地址,与虚地址段内页号合成,得到页表地址;最后从页表中取出实页号,与页内地址拼接形成主存实地址。

虚拟存储器与cache有很多相同之处。相同之处在于二者都为了提高系统的性能、都采用了将数据划分为小块的方式、都具有映射替换更新的操作、都应用了程序局部原理。但是cache是为了解决系统速度而虚拟存储器是为了解决主存容量,cache完全是硬件而虚拟存储器是硬件和操作系统共同操作的结果,虚拟存储器由于涉及外存所以虚拟存储器系统不命中会对系统性能影响更大。

典型题

在这里插入图片描述
操作系统的程序部分显然是存放在ROM上的,不然断电后电脑的操作系统就没有了,操作系统在开机后运行,需要在RAM上运行,所以内存需要RAM和ROM。

在这里插入图片描述
这类引脚数目的题属于存储里面很典型的题目,这类题从容量下手,SRAM只需要按照地址线和数据线的含义来确定即可,地址线对应寻址范围,1024个存储单元对应2的10次方,所以需要10根地址线,8位需要8根数据线,除此之外需要片选信号和读写信号,当读写信号分开时为两根,合并时为一根,所以共需要10+8+1+1(+1)=20(21),由于没有20的选项,所以选择21根。读写信号线要具体情况具体分析,合并与否是不确定的。总之就是四种线,地址线、数据线、读写线和片选线。
在这里插入图片描述
这两道题也是找引脚数目,但是换成了DRAM,在DRAM中由于使用了地址复用技术,所以地址线减半,这一点一定要明确记住。剩下的采用与SRAM相同的策略即可,1024个存储单元对应二的十次方,由于是地址复用,所以地址线只有5根,8位对应8根数据线,再加上行列通选线和两根读写控制线,总共是5+8+2+2=17。4M对应2的22次方,所以需要11根地址线,8位对应8根数据线,所以共8+11=19个引脚。

在这里插入图片描述
这道题表面上是在考计算机组成原理,实际上是在考电路的知识,题目意思是说A12-A19作为信息输入到译码器中,而这个译码器没有说明是74138,所以直接按照图示来考虑即可,A18A17经过一个或门电路再与A12A13A15A19连接入与门电路最后取反,由于是片选信号低电平有效,所以最后的结果需要一个低电平,四个选项中将地址的前两位展开成二进制再带入对应的位进行检测,结果是0即可,答案是D,D的最终输出结果是1。常用的门电路如下:
在这里插入图片描述
在这里插入图片描述
这道题主要考的是DRAM的刷新,DRAM刷新是以行为单位的,所以需要让行的数目在满足存储要求的情况下尽可能的少,存储容量是2K,所以需要行列之积为2048,DRAM采用的是行列地址线复用技术(地址线数目选择行列里面数目较大的),尽量选用行列差值不要太大的,综上应该选择C。
在这里插入图片描述
由题意可知IO空间占据了最高的1KB,RAM应该在剩下的63KB中分配,需要7片8K8位和7片1K8位的芯片进行扩展。对于两种芯片,8K8位需要13根地址线和8根数据线,1K8位需要10根地址线和8根数据线。由于存储空间有64KB,所以CPU的地址线一共有16根。所以A0-A12需要连接到存储芯片上,剩下的A13-A15用于片选,但是对于7个1K8位的芯片,选择高三位片选是无效的,因为这7个芯片在这几位上是相同的,解决办法是再用一个译码器,在A13-A15为111的情况下再次片选。最后的答案如下,这道题就属于连接题目中很麻烦的了,芯片数目多而且片选信号需要二次处理。
在这里插入图片描述
在这里插入图片描述
对于低位交叉存储器,一次性取出的是所有存储体中相同位置的内容,第一个操作取6个连续地址,但是机器是四体低位交叉存储器,所以需要进行两次取操作才能取完,这和第二个操作取8个连续地址需要的取次数是相等的,所以时间之比只在于重复的次数,第一个操作重复80次而第二个操作重复60次,所以时间之比为4:3。
在这里插入图片描述
这种题主要是考低位交叉存储器同时取的知识,四体交叉编址,所以每次取四个位置的内容,给的地址由于不知道是从第几个开始的,所以判断冲突的规则就是在相邻的四次访问中没有出现在同一个存储模块中。存储模块序号的编号如下:
在这里插入图片描述
根据规则,8004与8000会产生冲突,即C正确。
在这里插入图片描述
题目中采用四体交叉地位编址,每个8位,主存正好一次性取四个。由于是四个芯片,所以最低两位为芯片编号,x的主存地址的最后两位为10,说明从编号为2的芯片开始,一个存储周期对每个芯片取1个字节,double类型有8个字节,所以分三次,第一次取编号为2和3的芯片各一个字节,第二次去0123的芯片各一个字节,第三次取编号为0和1的芯片各一个字节,共计三次。
在这里插入图片描述
cache行的大小为16B,所以需要4位作为块内偏移,cache一共有1K块,所以需要10位来标记是哪一个cache块,所以一共需要4+10=14位来标记cache地址,取主存地址的低14位即可,直接选C。
在这里插入图片描述
地址映射表记录的是cache与主存块之间的对应关系,cache有64个块,所以对应表中有64行,每一行代表一个与之对应的主存块。主存容量是cache的4096倍,说明转化为二进制后长度主存长度要比cache长12位,即标志位的长度,加上1位的有效位,所以一行是13位,所以选D。地址映射表每一行代表一个cache块,一行里面存储的是对应主存块的标记。
在这里插入图片描述
这道题的关键在于理解好赋值语句,首先要读取数组对应位置,之后再将结果赋值给对应位置,所以一个位置访问两次,第一次一定不命中,对该主存块中的4个整数的两次访问中,只在访问第一次的第一个元素时发生缺失,其他的7次访问中全部命中,所以缺失率为1/8,即12.5%。
在这里插入图片描述
这种题从代码下手,循环本身就具有时间局部性,空间局部性体现在对数组的顺序访问上,所以是两种局部性都有,A正确。
在这里插入图片描述
第一问要求算三项内容的位数,从题干里面寻找信息,cache块大小为64B,所以需要6位作为块内地址,cache可以放128个主存块,采用4路组,所以可以分成32个cache组,因此需要5位作为cache组号,主存长度为32位,剩余的部分都作为标记,即32-5-6=21位。
第二问就是很重要的cache容量问题,cache容量可以分为两部分,一部分是存放的数据,另一部分是存放的各种标记,对于这个题而言,数据部分是64B×128块×8位,而标记部分取决于题目要求,这里只要求了1个脏位,所以需要1个脏位一个有效位加上21位的标记位,一共是128×(21+1+1)位,共计68480位。计算的关键在于将两个部分分开,标记位一定要看好题目要求。
在这里插入图片描述
根据直接映射,块内偏移对应4位,块号对应10位,所以标记位为32-4-10=18位,cache的总位数包括数据部分和标记部分,数据部分为4K×32位=128K位,标记部分除了标记项的18位,还需要1位有效位,一位脏位(采用回写法),所以一共是20位×1K=20K位,共计148K位。
在这里插入图片描述
在这里插入图片描述
题目很长,看着很恐怖。
第一问问虚拟地址有几位,题目里面第一行就写着16MB,所以是24位的虚拟地址,页面大小是4KB说明页内偏移需要12位,剩下的就是虚页号,即高12位。同理物理地址是20位,高8位为页框号。
第二问变成考察cache,采用直接映射,共8个cache行,所以需要3位来表示cache块号,cache块为32B,所以需要5位块内地址,主存地址是上一问求出来的物理地址,共20位,所以标记项占20-3-5=12位。
第三问考察页表的置换。根据第一问求得,高12位为虚页号,即页表中的001行,有效位为1且页框号为04,所以换头得到主存中的物理地址为04C60H。按照这个地址再换到cache的映射中去,找出对应的cache块为011B,即行号为3,这一行有效位为1,但标记与地址的标记不同,所以没有命中。
第四问考察快表。4路组的快表,一共8个表项,所以分为两组。因此虚页号中高11位为TLB标记,最第一位为TLB组号,根据虚地址可知应该在第0组中找,第0组中有效位为1且标记为012H的项存在,所以TLB命中,即在内存中。

猜你喜欢

转载自blog.csdn.net/weixin_43849505/article/details/108366427