存储器是信息存放的载体,是计算机系统的重要组成部分。
存储器的要求是容量大、速度快、成本低。目前的计算机系统中采用多级存储器体系结构。
层次间应满足的原则:
存储器的分类:按在计算机系统中的作用可分为:
性能指标:
读操作:
写操作:
DRAM的优点:每片存储容量较大;封装尺寸也较小;价格比较便宜;所需功率大约只有SRAM的1/6。
DRAM的缺点:使用动态元件,速度比SRAM要低;再生不仅浪费时间,还需要有配套的再生电路,消耗一部分功率。
位扩展:位扩展是用多个存储器对字长进行扩充。
位扩展的连接方式是将多片存储器的地址、片选CS、读写控制端R/W相应并联,数据端分别引出。
字扩展:字扩展指的是增加存储器中字的数量。
字扩展的连接方式是将各芯片的地址线、数据线、读写控制线相应并联,而由片选信号来区分各芯片的地址范围。
字位扩展:实际存储器往往需要字向和位向同时扩充。
刷新逻辑是为动态MOS随机存储器的刷新准备的。通过定时刷新、保证动态MOS存储器的信息不致丢失。
动态MOS存储器采用 “读出”方式 进行刷新。
在再生过程中只改变行选择线地址,每次再生一行,依次对存储器的每一行进行读出,就可完成对整个RAM的刷新。从上一次对整个存储器刷新结束到下一次对整个存储器全部刷新一遍为止,这一段时间间隔称作再生周期,又叫刷新周期,一般为2ms。
通常有两种刷新方式:
数据在存储过程中有可能出错,所以,一般在主存储器中设置差错校验线路。
实现差错检测和差错校正的代价是信息冗余。信息代码在写入主存时,按一定规则附加若干位,称为校验位。
具有两组相互独立的读写控制电路。
当通过两个端口同时访问存储器的地址不同时,通过两套不同的电路实现无冲突的读写。
通过两个端口对同一个单元访问时,就会发生冲突。设置了BUSY标志信号解决此问题。一旦优先端口操作完毕,另一端口的BUSY变为无效,端口开放,允许进行存取。
交叉编址:对m个存储体,将0,2,3…m-1分配给这m个存储体的第一个存储单元;m…2m-1分配给第二个存储单元,以此类推。可以对所有模块同时访问,加快存取速度。
交叉存储器的访问:CPU 同时访问所有模块,由存储器控制部件控制它们分时使用数据总线进行传递。
设模块字长等于数据总线宽度,模块存取一个字的周期为T,总线传送周期为t,那么,CPU可以每隔 t 时间启动下一个模块。 若设模块数M。由于T>t,顺序存取时,经历Mt时间重新回到该存储体,需要有T≤Mt保证不会发生冲突。所以只要M大于或等于t/T,连续读取m个模块的存储字所需的时间为:
t1=T+(m-1) t(总线传送t-1次信号的时间加上最后一次完成存取的时间)
而顺序方式则需:
t2=mT
相联存储器是按内容寻址的。这对于表格类的信息存储与检索可以提高速度。
基本原理:按所存记录的全部内容或部分内容进行查找(或检索),并将相关内容进行读出或写入。
应用于Cache快表。
在一段时间内,对局部范围内的存储器频繁访问,而对其它区域很少访问的现象称为程序访问的局部性。
大量典型程序运行情况分析结果表明,程序访问具有局部性。
读操作:
写操作:
Cache的容量小于主存,需要采用某种算法确定主存和Cache中块的对应关系。
主存中的每一个块映射到cache中的任何一个行中。需在cache的一行中增加标记部分,存放该行内容的主存块的块号。
主存地址:m位主存块号+b位块内地址。
Cache地址:c位Cache行号+b位块内地址。
块表结构:Cache行号对应存储的主存标记为主存块号。块表大小为:2c × m。
检索过程:CPU发出内存地址的块号部分(m+b位)与cache中所有行中的标记部分同时比较,若某行的标记与要访问的块号相同,命中,获取Cache行号则再根据块内地址(b位)从该行中读取相应字;否则,未命中,则按内存地址从主存中读取一个字。
特点:灵活性好、成本高、速度慢、用于小容量cache。
一个主存块只能复制到cache的一个特定行中。如设cache中有m行,则主存的第0块,第m块,第2m块,…,第2S-m块只能映射到cache的第0行,主存的第1块,第m+1块,第2m+1块,…,第2S-m+1块只能映射到cache的第1行。
假设主存的块号为j,Cache的行号为i,
则直接映射的地址映射函数为:
i = j mod 2c
主存地址:m位主存块号+b位块内地址。
Cache地址:c位Cache行号+b位块内地址。
块表结构:由于cache共有2c行,所以末c位相同的主存块号对应存储在同一个Cache行中,只需判断前m-c位即可。
Cache行号对应存储的主存标记为主存块号的前m-c位。块表大小为:2c × (m-c)。
检索过程:根据地址中的c位行号找到cache的相应行,然后将该行中所存的标记部分与内存地址的高m-c位比较,判断是否命中。
特点:硬件实现简单,成本低、冲突概率高。
是全相联映射方式和直接映射方式的折中方案。即:将cache的2r(m个)行分成2d组,每组有2r-d行,每行的大小为2b位,那么主存的第0块,第d块,第2d块,…,第2S-d块可以映射到cache的第0组中的任意行,主存的第1块,第d+1块,第2d+1块,…,第2S-d+1块被映射到cache的第1组的任意行。也即组间直接映射,组内全相联映射。
映射函数关系:组号 q= j mod 2d,j 主存块号,q 为cache组号。
主存地址:m位主存块号+b位块内地址。
Cache地址:c位Cache行号+b位块内地址,分为2d块。
块表结构:由于cache共有2d块,所以末d位相同的主存块号对应存储在同一个Cache块中,只需判断前m-d位即可。
Cache行号对应存储的主存标记为主存块号的前m-d位。块表大小为:2c × (m-d)。
检索过程:根据地址中的d位块号找到cache的相应块,然后将该块中所有的标记与内存地址的高m-d位比较,判断是否命中。
特点:组内有一定的灵活性,而且因组内行数的减少,比较的硬件电路比全相联方式简单些。
LFU算法即最不经常使用算法:将一段时间内被访问次数最少的那行数据替换出去。
每行设置一个计数器,从0开始计数; • 每访问一次, 被访行的计数器增1; 当需要替换时,将计数值最小的行换出,同时将这些特定行(全相联是所有行,组相联是组内各行)的计数器都清零。
特点:计数周期限定在对这些特定行两次替换之间的间隔时间内,因此不能严格反映近期访问情况。
LRU算法即近期最少使用算法:将近期内长久未被访问过的行替换出去。
每行也设置一个计数器:每访问一次,被访行的计数器清零,其它各行计数值1;当需要替换时,将计数值最大的行换出。
特点:保护了刚拷贝到cache中的新数据行,使Cache的使用率较高。
随机替换算法:从特定行中随机选取一个行进行替换。
特点:硬件容易实现,且速度比前两种快;研究表明,随着cache容量增大随机替换的功效只是稍逊于前两种策略。
写入策略:只修改cache的内容,而不立即写入主存;只有当此行被换出时才写回主存。
特点:减少了访问主存的次数,存在Cache与主存不一致性的隐患。cache行必须配置一个修改位。
写入策略:cache与主存同时发生写修改,因而较好地维护了cache与主存的内容的一致性。
特点:cache中每行无需设置一个修改位以及相应的判断逻辑、降低了cache的功效。
写入策略:基于写回法,并结合全写法的写策略;写命中与写未命中的处理方法与写回法基本相同,只是第一次写命中时
要同时写入主存。
特点:第一次写命中时,启动一个主存的写周期,其目的是使其它Cache可以及时更新或废止该块内容,这便于维护系统全部cache的一致性。
虚拟存储器只是一个容量非常大的存储器的逻辑模型,不是任何实际的物理存储器。它借助于磁盘等辅助存储器来扩大主存容量,使之为更大或更多的程序所使用。虚拟存储器不仅是解决存储容量和速度的矛盾的一种方法,而且也是管理存储设备的有效方法。
虚拟存储器为用户提供了一个比实际主存空间大得多的程序地址空间。此时程序的逻辑地址称为虚拟地址(虚地址)。
相对应的物理地址(又称实地址)是CPU地址引脚送出的,用于访问主存的地址。
虚拟地址是由编译程序生成的。工作在虚拟地址模式下的CPU理解这些虚拟地址,并将他们转换为物理地址。实际上,虚拟存储器的内容是要保存在磁盘上的,因此虚拟地址空间的大小受辅助存储器容量的限制。
基于程序局部性原理,把程序最近常用的部分驻留在高速存储器中;一旦这部分不常用了,就送回到低速存储器中;这种换入换出是由硬件或操作系统完成,无需用户干预;最终达到使存储系统的性能接近高速存储器,而价格接近低速存储器。
段:利用程序的模块化性质,按照程序的逻辑结构划分成的多个相对独立部分。如过程、子程序、数据表、阵列等。段作为独立的逻辑单位可以被其他程序调用,以形成规模较大的程序。
段表用来指明各段在主存中的位置而在主存中建立的一个表。 每段都有它的名称(用户名或数据结构名或段号)、段在主存中的起点、段长及装入位等控制信息,段表就是存储虚拟存储器中各段的上述信息的表。
段式管理:把主存按段分配的存储管理方式称为段式管理。
优点:段的分界与程序的自然分界相对应;易于编译、管理、修改、保护、共享;有效利用主存空间。
缺点:长度不同,起点和终点不定,空间分配麻烦;零碎空间不好利用,造成主存空间的浪费。
页:将存储器的空间划分为具有定长的区域。 主存——实页(物理页),虚存——虚页(逻辑页)。
页表:用来指明外存各页在主存中的位置。 由于页的长度是固定的,页表中只需存放虚页号、实页号和装入位等控制信息三部分。
页式管理:主存与虚存之间以页为基本信息传送单位的存储器管理方式。
优点:比段式管理浪费的零碎空间少。
缺点:逻辑上不独立,在处理、保护和共享等方面不如段式管理方便。
程序按模块分段,段内再分页,进入主存以页为基本信息传送单位,用段表和页表两级定位管理的方式进行存储器管理。
在段页式虚拟存储系统中,每道程序是通过一个段表和一组页表来进行定位的。
段表中每个表目对应一个段,每个表目有一个指向该段的页表起始地址及该段的控制保护信息。由页表指明该段各页在主存中的位置以及是否装入、已修改等状态信息。
计算机一般都采用段页式存储管理方式。
访问存储器时,无论要访问的页是否已装入内存,都要先查页/段/段页表。这就导致至少访问两次主存储器,相当于主存速率降低一倍。把页表中最活跃的部分放在高速存储器中组成快表,可以减少时间开销。相应在主存的表称为慢表。
采用快表和慢表的地址变换:查表时,根据逻辑页同时去查快表和慢表,若在快表中查到,就将慢表查找操作作废;若快表中查不到,就要通过查慢表获得主存的页号,同时将此逻辑页号和对应的物理页号送入快表,以备下次访问。
为了以较多的CPU时间和硬件为代价换取更高的命中率,虚拟存储器中的替换策略一般采用LRU算法、LFU算法、FIFO算法,或将两种算法结合起来。