一、概述
存储器是信息存放的载体,是计算机系统的重要组成部分。
存储器的要求是容量大、速度快、成本低。目前的计算机系统中采用多级存储器体系结构。
层次间应满足的原则:
- 一致性原则
- 包含性原则
存储器的分类:按在计算机系统中的作用可分为:
- 主存储器
- 辅助存储器
- 高速缓冲存储器(Cache)
- 控制存储器
性能指标:
- 存取时间:CPU启动一次存储器操作所需时间
- 存取周期:存储器进行一次完整读写操作所需时间
- 存取宽度:一次访问可存取的数据位数/字节数
- 存储容量:存储器能存放二进制数据的总位数
二、主存储器
1.主存储器基本结构
● 地址译码电路
- 单译码结构:只有一个地址译码器,译码器输出产生字选择线。
- 双译码结构:有行地址译码器和列地址译码器。
● 片选和读写逻辑
- 片选端CS:有效时允许对芯片进行读写操作。
- 写允许WE:在片选端有效时:有效对芯片进行写操作;无效对芯片进行读操作。
● 读写操作
读操作:
- CPU准备访问地址,送入地址寄存器;
- CPU通过控制总线向主存发送“读”命令;
- 主存收到命令后,读出所选地址的存储单元的内容,将数据通过数据总线送入数据寄存器。
写操作:
- CPU准备访问地址,送入地址寄存器;
- 将待写入的信息字送入数据寄存器;
- CPU通过控制总线向主存发送“写”命令;
- 主存收到命令后,将数据总线上的数据写入所选地址的存储单元的内容。
2.随机访问存储器
● 静态随机存储器SRAM
- 存储单元
单元未选中:字选择线保持低电位,两条位线保持高电位。T5,T6截止,触发器和位线隔开。
单元选中:字选择线来高电位,单元被选中。
读操作:若原来单元处于“1”态(T1导通、T2截止),就有电流自位线1经T5流向T1,从而在位线1产生一个负脉冲。因T2截止,因此位线2不产生负脉冲。若触发器处于“0”态,即T1截止、T2导通,则与上述情况相反,在位线2将产生负脉冲。这样,可根据哪条位线有负脉冲来判断触发器的状态。
写操作:只要位线1、2分别送高电位和低电位,便可迫使触发器状态发生变化,从而把信息写入单元。位线1送低电位、位线2送高电位,当单元被选中时,位线2便通过T6向T1栅极充电,使Tl导通,而T2栅极通过T5和位线1放电,使T2截止,从而单元便处于“1”态。 - 1K SRAM
- 周期参数
读周期参数:
地址读数时间taAdr、片选读时间taCS、片禁止到输出的传输延迟tPLHCS→Dour、地址对片选的建立时间tsuAdr→CS
写周期参数:
地址对写允许的建立时间tsuAdr、地址对写允许的保持时间thAdr、片选对写控制的建立时间tsuCS和保持时间thCS、
输入数据对写允许的建立时间tsuDIN、数据对写允许的保持时间thDIN、最小写允许宽度tWWE
● 动态随机存储器DRAM
- 存储单元
● 三管存储单元:
读取和写入部分分离。
读操作:读出时,读出数据线先预充电至高电位,然后读出选择线来高电位,使T3导通。若极间电容C上储存有电荷,则T2导通,读出数据线便通过T2,T3接地,读出电压为低电平;若C上无储存电荷,则T2不导通,读出数据线的电压无变化。
写操作:写入时,在写入数据线上加写入信号,在写入选择线上加高电位,则T1导通,C随写入信号而充电或放电。若T1截止,则C的电压保持不变。
三管单元布线较复杂,所用元件仍较多,但电路稳定。
● 单管存储单元:
读操作:对单元读出时,数据线预充电至高电平。当字线来高电平,T导通。若原来Cs上充有电荷,则Cs放电,使数据线电位下降,此时若在数据线上接一个读出放大器,便可检出Cs的“1”态。若原来Cs上无电荷,则数据线无电位变化,放大器无输出,表示Cs上存储的是“0”
写操作:对某单元写入时,字线为高电平,T导通。若数据线为低电平(写1)且Cs上无储存电荷,则接在Cs一端的VDD通过T对Cs充电;若数据线为高电平(写0)且Cs上有储存电荷,则Cs通过T放电;如写入的数据与原存数据相同,则Cs上的电荷保持不变。
单管单元线路简单,单元占用面积小,速度快。 - 1K DRAM
- 再生
● 再生的概念:DRAM的信息读出是破坏性的,并且由于电容漏电阻的存在,电荷会逐渐漏掉。为了保证存储信息不遭破坏,必须在电荷漏掉以前就进行充电,以恢复原来的电荷,把这一充电过程称为再生。
对于DRAM,再生一般应在小于或等于2ms的时间内进行一次。
● 再生的方式:DRAM采用 “读出”方式 进行再生。
接在单元数据线上的读放是一个再生放大器,在读出的同时,读放又使该单元的存储信息自动地得以恢复。由于DRAM每列都有自己的读放,因此,只要依次改变行地址,轮流对存储矩阵的每一行所有单元同时进行读出,当把所有行全部读出一遍,就完成了对存储器的再生。
这种再生称行地址再生。
● SRAM和DRAM比较
DRAM的优点:每片存储容量较大;封装尺寸也较小;价格比较便宜;所需功率大约只有SRAM的1/6。
DRAM的缺点:使用动态元件,速度比SRAM要低;再生不仅浪费时间,还需要有配套的再生电路,消耗一部分功率。
3.半导体存储器的组成与控制
●存储器扩展
位扩展:位扩展是用多个存储器对字长进行扩充。
位扩展的连接方式是将多片存储器的地址、片选CS、读写控制端R/W相应并联,数据端分别引出。
字扩展:字扩展指的是增加存储器中字的数量。
字扩展的连接方式是将各芯片的地址线、数据线、读写控制线相应并联,而由片选信号来区分各芯片的地址范围。
字位扩展:实际存储器往往需要字向和位向同时扩充。
● 存储控制:刷新
刷新逻辑是为动态MOS随机存储器的刷新准备的。通过定时刷新、保证动态MOS存储器的信息不致丢失。
动态MOS存储器采用 “读出”方式 进行刷新。
在再生过程中只改变行选择线地址,每次再生一行,依次对存储器的每一行进行读出,就可完成对整个RAM的刷新。从上一次对整个存储器刷新结束到下一次对整个存储器全部刷新一遍为止,这一段时间间隔称作再生周期,又叫刷新周期,一般为2ms。
通常有两种刷新方式:
- 集中刷新:集中式刷新指在一个刷新周期内,利用一段固定的时间,依次对存储器的所有行逐一再生,在此期间停止对存储器的读和写。集中刷新的缺点是在刷新期间不能访问存储器,有时会影响计算机系统的正确工作。
- 分布式刷新:采取在刷新周期内分散地将行刷新一遍的方法,具体做法是将刷新周期除以行数,得到两次刷新操作之间的时间间隔t,利用逻辑电路每隔时间t产生一次刷新请求。
● 存储校验线路
数据在存储过程中有可能出错,所以,一般在主存储器中设置差错校验线路。
实现差错检测和差错校正的代价是信息冗余。信息代码在写入主存时,按一定规则附加若干位,称为校验位。
4.高速存储器
● 双端口存储器
具有两组相互独立的读写控制电路。
当通过两个端口同时访问存储器的地址不同时,通过两套不同的电路实现无冲突的读写。
通过两个端口对同一个单元访问时,就会发生冲突。设置了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快表。
5.其它存储器
● 非易失性半导体存储器
- 只读存储器(ROM)
- 可编程序的只读存储器(PROM)
- 可擦可编程序的只读存储器(EPROM)
- 可电擦可编程序只读存储器(E2PROM)
- 快擦除读写存储器(Flash Memory)
● 新型DRAM
- 增强型DRAM(EDRAM)
- cache DRAM(CDRAM)
- 扩充数据输出DRAM(EDO DRAM)
- 同步DRAM(SDRAM)
- Rambus DRAM(RDRAM)
- 集成随机存储器(IRAM)
- ASIC RAM
三、存储系统层次结构
1. Cache-主存层次
Cache基本原理与概念
● 局部性原理
在一段时间内,对局部范围内的存储器频繁访问,而对其它区域很少访问的现象称为程序访问的局部性。
大量典型程序运行情况分析结果表明,程序访问具有局部性。
● 基本构成
- 存储体:基本单位为字,若干个字构成一个数据块;
- 地址映射变换机构:用于将主存地址变换为Cache地址,以利用CPU发送的主存地址访问Cache;
- 替换机构:更新Cache中数据时使用的机制;
- 相联存储器:Cache的块表,快速指示所要访问的信息是否在Cache中;
- 读写控制
● 读/写操作
读操作:
- CPU发出有效的主存地址
- 经地址变换机构,变换为可能的Cache地址
- 查找块表,判断所要访问的信息是否在Cache中
- 若在,则CPU直接读取Cache获取数据
- 若不在,则CPU访问主存,并判断Cache是否已满
- 若Cache未满,将该数据所在块从主存中调入Cache
- 若Cache已满,使用某种替换机制,使用当前数据块替换掉Cache中的某些块
写操作:
- CPU发出有效的主存地址
- 经地址变换机构,变换为可能的Cache地址
- 查找块表,判断所要访问的信息是否在Cache中
- 若不在,则使CPU直接写主存数据
- 若在,则使用某种写策略将数据写入Cache
● 性能指标
- 命中率:CPU访问cache的次数占总访问次数的比例。设NC表示cache完成存取的总次数,NM表示主存完成存取的总次数,h为命中率,则有: h=NC/(NC+NM)。
影响命中率的主要因素:Cache 容量、Cache中块的大小。 - 平均访问时间:若tC表示命中时的cache访问时间,tm表示未命中时的主存访问时间,则cache/主存系统的平均访问时间ta为: ta=htc+(1-h)tm。
用e表示访问效率。 设 r = tm/tc 则有: e= tc/ ta=1/(r+(1-r)h)。
命中率h越接近于1越好,r值以5~10为宜,不宜太大。
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位比较,判断是否命中。
特点:组内有一定的灵活性,而且因组内行数的减少,比较的硬件电路比全相联方式简单些。
Cache替换策略
● LFU算法
LFU算法即最不经常使用算法:将一段时间内被访问次数最少的那行数据替换出去。
每行设置一个计数器,从0开始计数; • 每访问一次, 被访行的计数器增1; 当需要替换时,将计数值最小的行换出,同时将这些特定行(全相联是所有行,组相联是组内各行)的计数器都清零。
特点:计数周期限定在对这些特定行两次替换之间的间隔时间内,因此不能严格反映近期访问情况。
● LRU算法
LRU算法即近期最少使用算法:将近期内长久未被访问过的行替换出去。
每行也设置一个计数器:每访问一次,被访行的计数器清零,其它各行计数值1;当需要替换时,将计数值最大的行换出。
特点:保护了刚拷贝到cache中的新数据行,使Cache的使用率较高。
● 随机替换算法
随机替换算法:从特定行中随机选取一个行进行替换。
特点:硬件容易实现,且速度比前两种快;研究表明,随着cache容量增大随机替换的功效只是稍逊于前两种策略。
Cache写策略
● 写回法
写入策略:只修改cache的内容,而不立即写入主存;只有当此行被换出时才写回主存。
特点:减少了访问主存的次数,存在Cache与主存不一致性的隐患。cache行必须配置一个修改位。
● 全写法(写透法)
写入策略:cache与主存同时发生写修改,因而较好地维护了cache与主存的内容的一致性。
特点:cache中每行无需设置一个修改位以及相应的判断逻辑、降低了cache的功效。
● 写一次法
写入策略:基于写回法,并结合全写法的写策略;写命中与写未命中的处理方法与写回法基本相同,只是第一次写命中时
要同时写入主存。
特点:第一次写命中时,启动一个主存的写周期,其目的是使其它Cache可以及时更新或废止该块内容,这便于维护系统全部cache的一致性。
2. 主存-辅存层次
虚拟存储器基本概念
● 虚拟存储器
虚拟存储器只是一个容量非常大的存储器的逻辑模型,不是任何实际的物理存储器。它借助于磁盘等辅助存储器来扩大主存容量,使之为更大或更多的程序所使用。虚拟存储器不仅是解决存储容量和速度的矛盾的一种方法,而且也是管理存储设备的有效方法。
● 虚拟地址
虚拟存储器为用户提供了一个比实际主存空间大得多的程序地址空间。此时程序的逻辑地址称为虚拟地址(虚地址)。
相对应的物理地址(又称实地址)是CPU地址引脚送出的,用于访问主存的地址。
虚拟地址是由编译程序生成的。工作在虚拟地址模式下的CPU理解这些虚拟地址,并将他们转换为物理地址。实际上,虚拟存储器的内容是要保存在磁盘上的,因此虚拟地址空间的大小受辅助存储器容量的限制。
● 工作原理
基于程序局部性原理,把程序最近常用的部分驻留在高速存储器中;一旦这部分不常用了,就送回到低速存储器中;这种换入换出是由硬件或操作系统完成,无需用户干预;最终达到使存储系统的性能接近高速存储器,而价格接近低速存储器。
管理方法
● 段式管理
段:利用程序的模块化性质,按照程序的逻辑结构划分成的多个相对独立部分。如过程、子程序、数据表、阵列等。段作为独立的逻辑单位可以被其他程序调用,以形成规模较大的程序。
段表用来指明各段在主存中的位置而在主存中建立的一个表。 每段都有它的名称(用户名或数据结构名或段号)、段在主存中的起点、段长及装入位等控制信息,段表就是存储虚拟存储器中各段的上述信息的表。
段式管理:把主存按段分配的存储管理方式称为段式管理。
优点:段的分界与程序的自然分界相对应;易于编译、管理、修改、保护、共享;有效利用主存空间。
缺点:长度不同,起点和终点不定,空间分配麻烦;零碎空间不好利用,造成主存空间的浪费。
● 页式管理
页:将存储器的空间划分为具有定长的区域。 主存——实页(物理页),虚存——虚页(逻辑页)。
页表:用来指明外存各页在主存中的位置。 由于页的长度是固定的,页表中只需存放虚页号、实页号和装入位等控制信息三部分。
页式管理:主存与虚存之间以页为基本信息传送单位的存储器管理方式。
优点:比段式管理浪费的零碎空间少。
缺点:逻辑上不独立,在处理、保护和共享等方面不如段式管理方便。
● 段页式管理
程序按模块分段,段内再分页,进入主存以页为基本信息传送单位,用段表和页表两级定位管理的方式进行存储器管理。
虚实地址变换
● 页式变换
页式管理下的虚实地址的变换是通过页表实现的。
● 段式变换
段式管理下的虚实地址的变换是通过段表实现的。
● 段页式变换
在段页式虚拟存储系统中,每道程序是通过一个段表和一组页表来进行定位的。
段表中每个表目对应一个段,每个表目有一个指向该段的页表起始地址及该段的控制保护信息。由页表指明该段各页在主存中的位置以及是否装入、已修改等状态信息。
计算机一般都采用段页式存储管理方式。
● 快慢表
访问存储器时,无论要访问的页是否已装入内存,都要先查页/段/段页表。这就导致至少访问两次主存储器,相当于主存速率降低一倍。把页表中最活跃的部分放在高速存储器中组成快表,可以减少时间开销。相应在主存的表称为慢表。
采用快表和慢表的地址变换:查表时,根据逻辑页同时去查快表和慢表,若在快表中查到,就将慢表查找操作作废;若快表中查不到,就要通过查慢表获得主存的页号,同时将此逻辑页号和对应的物理页号送入快表,以备下次访问。
替换算法
为了以较多的CPU时间和硬件为代价换取更高的命中率,虚拟存储器中的替换策略一般采用LRU算法、LFU算法、FIFO算法,或将两种算法结合起来。