按在计算机中的作用(层次)分类
存储系统层次结构主要体现在缓存一主存和主存一辅存这两个存储层次上
按存储介质分类
按存取方式分类
随机存储器(RAM)
存储器的任何一个存储单元都可以随机存取,而且存取时间与存储单元的物理位置无关。
优点:读写方便,使用灵活,主要用于主存或高速缓重存储器
只读存储器(ROM)
存储器的内容只能随机读出而不能写入。ROM一旦有了信息则不能轻易改变,即使断电也不会丢失。
相联存储器(CAM)
不根据地址而是根据存储内容和指定地址方式来进行存取的存储器,可以实现快速地查找快表
串行访问存储器
对存储单元进行读/写操作时,需按其物理位置的先后顺序寻址。
顺序存取存储器(SAM):内容只能顺序读取,存取时间长短与信息在存储体上的物理位置有关;
如磁带。
直接存取存储器(DAM):内容可以直接读取,存取时间与信息在存储体上的物理位置无关;
如磁盘、光盘;
按信息的可保存性分类
信息的可更改性
存储容量
存储容量 = 存储字数 × 字长 存储容量=存储字数×字长 存储容量=存储字数×字长
存储字数表示存储器的地址空间大小,字长表示一次存取操作的数据量。
单位成本
每位价格 = 总成本 / 总容量 每位价格=总成本/总容量 每位价格=总成本/总容量
存储速度
数据传输率 = 数据的宽度 / 存储周期 数据传输率=数据的宽度/存储周期 数据传输率=数据的宽度/存储周期
主存储器由DRAM实现,靠处理器的那一层(Cache)则由SRAM实现,它们都属于易失性存储器,只要电源被切断,原来保存的信息便会丢失。
DRAM的每位价格低于SRAM,速度也慢于SRAM,价格差异主要是因为制造SRAM需要更多的硅。
通常把存放一个二进制位的物理器件称为存储元,它是存储器的最基本的构件。地址码相同的多个存储元构成一个存储单元。若干存储单元的集合构成存储体。
SRAM工作原理
静态随机存储器(SRAM)的存储元是用双稳态触发器(六晶体管MOS)来记忆信息的,因此即使信息被读出后,它仍保持其原状态而不需要再生(非破坏性读出)。
上图为双稳态触发器。若T2管导通,则T1管一定截止,此时A点为高电平,B电为低电平,假定此时为存1状态;反之(当T1管导通时)则为存0状态。
SRAM的存取速度快,但集成度低,功耗较大,价格昂贵,只要不断电,触发器的状态就不会改,一般用于高速缓冲存储器。
应用Cache。
DRAM工作原理
动态随机存储器(DRAM)是利用存储元电路中栅极电容上的电荷来存储信息的,DRAM的基本存储元通常只使用一个晶体管,所以它比SRAM的密度要高很多。
读出1:MOS管接通,电容放电,数据线上产生电流;读出0:MOS管接通后,数据线上无电流
电容放电信息被破环,是破坏性读出。读出后应有重写操也称“再生”;读写速度慢;每个存储元制造成本更低,集成度高,功耗低。
电容内的电荷只能维持2ms。即便不断电,2ms后信息也会消失;2ms之内必须“刷新”一次(给电容充电);每次刷新一行存储单元。
集中刷新:指在一个刷新周期内,利用一段固定的时间,依次对存储器的所有行进行逐一再生,在此期间停止对存储器的读写操作,称为“死时间”,又称访存“死区”。
分散刷新:把对每行的刷新分散到各个工作周期中。这样,一个存储器的系统工作周期分为两部分:前半部分用于正常读、写或保持;后半部分用于刷新。这种刷新方式增加了系统的存取周期,如存储芯片的存取周期为0.5μs,则系统的存取周期为1μs。
异步刷新:异步刷新是前两种方法的结合,它既可缩短“死时间”,又能充分利用最大刷新间隔为2ms的特点。具体做法是将刷新周期除以行数,得到两次刷新操作之间的时间间隔t,利用逻辑电路每隔时间t产生一次刷新请求。
这样可以避免使CPU连续等待过长的时间,而且减少了刷新次数,从根本上提高了整机的工作效率。
DRAM芯片的读写周期
SRAM和DRAM的比较
特点 | SRAM | DRAM |
---|---|---|
存储信息 | 触发器 | 电容 |
破坏性读出 | 非 | 是 |
需要制新 | 不要 | 需要 |
送行列地址 | 同时送 | 分两次送 |
运行速度 | 快 | 慢 |
集成度 | 低 | 高 |
存储成本 | 高 | 低 |
主要用途 | 高速缓存 | 主机内存 |
存储器芯片的内部结构
存储器芯片由存储体、I/O读写电路、地址译码和控制电路等部分组成。下图为存储芯片结构图。
存储体(存储矩阵)。存储体是存储单元的集合,它由行选择线(X)和列选择线(Y)来选择所访问单元,存储体的相同行、列上的位同时被读出或写入。
地址译码器。用来将地址转换为译码输出线上的高电平,以便驱动相应的读写电路。
目前DRAM大多采用双译码结构,如下图所示。
采用地址线复用技术,使用行列地址双译码结构,行、列地址分两次送,是为了减少选通线数量。
若有28个芯片,单地址译码需要256条选通线,而双地址译码只需要24+24=32条选通线。
I/O控制电路。用以控制被选中的单元的读出或写入,具有放大信息的作用。
片选控制信号。单个芯片容量太小,往往满足不了计算机对存储器容量的要求,因此需用一定数量的芯片进行存储器的扩展。在访问某个字时,必须“选中”该存储字所在的芯片,而其他芯片不被“选中”,因此需要有片选控制信号。
读/写控制信号。根据CPU给出的读命令或写命令,控制被选中单元进行读或写。
只读存储器(ROM)的特点
ROM中一旦有了信息,就不能轻易改变,即使掉电也不会丢失。
ROM的类型
掩膜式只读存储器(MROM)
厂家按照客户需求,在芯片生产过程中直接写入信息,之后任何人不可重写(只能读出)
可靠性高、灵活性差、生产周期长、只适合批量定制
一次可编程只读存储器(PROM)
用户可用专门的PROM写入器写入信息,写一次之后就不可更改
可擦除可编程只读存储器(EPROM)
EPROM不仅可以由用户利用编程器写入信息,而且可以对其内容进行多次改写。
不能取代RAM,因为编程次数有限,且写入速度很慢(写入前要先擦除)
闪速存储器(Flash Memory)
在EEPROM基础上发展而来,断电后也能保存信息,且可进行多次快速擦除重写
注意:由于闪存需要先擦除在写入,因此闪存的**“写”速度要比“读”速度更慢**。
每个存储元只需单个MOS管,位密度比RAM高。
应用:U盘、SD卡
固态硬盘(SSD)
由控制单元+存储单元(Flash芯片)构成,与闪速存储器的核心区别在于控制单元不一样,但存储介质都类似,可进行多次快速擦除重写。
SSD速度快、功耗低、价格高。目前个人电脑上常用SSD取代传统的机械硬盘。
下图是主存储器的基本组成框图,其中由一个个存储0或1的记忆单元(也称存储元件)构成的存储矩阵(也称存储体)是存储器的核心部分。存储单元进行编号,现代计算机按字节编址。
CPU访问主存过程:
数据线的宽度与MDR的宽度相同,地址线的宽度与MAR的宽度相同。地址线的位数决定了主存地址空间的最大可寻址范围。例如,36位地址的最大寻址范围为0~236-1,即地址从0开始编号。
例1:某一SRAM芯片,其容量为1024×8位,除电源和接地端外,该芯片的引脚的最小数目为()
按字节(8位)取地址,需要8位数据线;共有1024=210个存储单元,SRAM不复用地址线,需要10位地址线;还需要1片选线,2位读写控制线,共8+10+1+2=21位
例2:某一DRAM芯片,其容量为1024×8位,除电源和接地端外,该芯片的引脚的最小数目为()
DRAM复用地址线,分两次传递地址,地址线减半,需要5位地址线;片选线需要行选通线和列选通线,增加到2根,共8+5+2+2=17
注意SRAM和DRAM的区别,DRAM采用地址复用技术,而SRAM不采用。
双端口RAM
双端口顾名思义就是存储器芯片提供两个端口给两个CPU进行访问。
两个端口对同一主存操作有以下4种情况:
解决办法:
置“忙”信号为0,由判断逻辑决定暂时关闭一个端口(即被延时),未被关闭的端口正常访问,被关闭的端口延长一个很短的时间段后再访问。
单体多字存储器
单体多字系统的特点是存储器中只有一个存储体,每个存储单元存储m个字,总线宽度也为m个字。一次并行读出m个字,地址必须顺序排列并处于同一存储单元。
单体多字系统在一个存取周期内,从同一地址取出m条指令,然后将指令逐条送至CPU执行,即每隔1/m存取周期,CPU向主存取一条指令。这显然提高了单体存储器的工作速度。
缺点:指令和数据在主存内必须是连续存放的,一旦遇到转移指令,或操作数不能连续存放,这种方法的效果就不明显。
多体并行存储器
多体并行存储器由多体模块组成。每个模块都有相同的容量和存取速度,各模块都有独立的读写控制电路、地址寄存器和数据寄存器。它们既能并行工作,又能交叉工作。
多体并行存储器分为高位交叉编址和低位交叉编址两种。
高位交叉编址(顺序方式)
高位地址表示体号,低位地址为体内地址。如图所示,存储器共有4个模块M0~M3,每个模块有n个单元,各模块的地址范围如图中所示。
特点:
低位交叉编址(交叉方式)
低位地址为体号,高位地址为体内地址。
每个模块按“模m”交叉编址,模块号=单元地址%m,假定有m个模块,每个模块有k个单元,则0,m,…,(k-1)m单元位于M0;第1,m+1,…,(k-1)m+1单元位于M1;以此类推。
特点:
设模块字长等于数据总线宽度,模块存取一个字的存取周期为T,总线传送周期为r,为实现流水线方式存取,存储器交叉模块数应大于等于
m = T / r m=T/r m=T/r
式中,m称为交叉存取度。每经过时间延迟后启动下一个模块,交叉存储器要求其模块数必须大于等于m,以保证启动某模块后经过m×r的时间后再次启动该模块时,其上次的存取操作已经完成(即流水线不间断)。这样,连续存取m个字所需的时间为
t 1 = T + ( m − 1 ) r t_1=T+(m-1)r t1=T+(m−1)r
而顺序方式连续读取m个字所需的时间为 t 2 = m T t_2=mT t2=mT。可见低位交叉存储器的带宽大大提高。
【例】设存储器容量为32个字,字长为64位,模块数m=4,分别采用顺序方式和交叉方式进行组织。存储周期T=200ns,数据总线宽度为64位,总线传输周期r=50ns。在连续读出4个字的情况下,求顺序存储器和交叉存储器各自的带宽。
解:顺序存储和交叉存储器连续读出m=4个字的的信息总量为
q = 64 位 × 4 = 256 位 q=64位×4=256位 q=64位×4=256位
顺序存储器和交叉存储器连续读出4个字所需时间为
t 1 = m T = 4 × 200 n s = 800 n s = 8 × 1 0 − 7 s t 2 = T + ( m − 1 ) r = 200 n s + 3 × 50 n s = 350 n s = 3.5 × 1 0 − 7 s t_1=mT=4×200ns=800ns=8×10^{-7}s\\ t_2=T+(m-1)r=200ns+3×50ns=350ns=3.5×10^{-7}s t1=mT=4×200ns=800ns=8×10−7st2=T+(m−1)r=200ns+3×50ns=350ns=3.5×10−7s
顺序存储器和交叉存储器的带宽分别是
W 1 = q / t 1 = 256 / ( 8 × 1 0 − 7 ) = 3.2 × 1 0 8 b / s W 2 = q / t 2 = 256 / ( 3.5 × 1 0 − 7 ) = 7.3 × 1 0 8 b / s W_1=q/t_1=256/(8×10^{-7})=3.2×10^8b/s\\ W_2=q/t_2=256/(3.5×10^{-7})=7.3×10^8b/s W1=q/t1=256/(8×10−7)=3.2×108b/sW2=q/t2=256/(3.5×10−7)=7.3×108b/s
单个芯片的容量不可能很大,往往通过存储器芯片扩展技术,将多个芯片集成在一个内存条上,然后由多个内存条及主板上的ROM芯片组成计算机所需的主存空间,再通过总线与CPU相连。下图是存储控制器、存储器总线和内存条的连接关系示意图。
内存条插槽就是存储器总线,内存条中的信息通过内存条的引脚,再通过插槽内的引线连接到主板上,通过主板上的导线连接到CPU芯片。
主存与CPU连接原理:
位扩展法
用多个存储器件对字长进行扩充,增加存储字长使其数据位数与CPU的数据线数相等。
连接方式:将多个存储芯片的地址端、片选端和读写控制端相应并联,数据端分别引出。
注意:仅采用位扩展时,各芯片连接地址线的方式相同,但连接数据线的方式不同,在某一时刻选中所有的芯片,所以片选信号CS要连接到所有芯片。
字扩展法
增加存储器中字的数量,而位数不变。
连接方式:将芯片的地址线、数据线、读写控制线相应并联,而由片选信号来区分各芯片的地址范围。
如上图所示,用4片16K×8位的RAM芯片组成64K×8位的存储器。将 A 15 A 14 A_{15}A_{14} A15A14作为片选信号,连接2/4译码器,完成对4片RAM芯片的选择。各芯片的地址分配如下:
注意:仅采用字扩展时,各芯片连接地址线的方式相同,连接数据线的方式也相同,但在某一时刻只需选中部分芯片,所以通过片选信号CS或采用译码器设计连接到相应的芯片。
字位同时扩展法
字位同时扩展是指既增加存储字的数量,又增加存储字长。
如上图所示,用8片16K×4位的RAM芯片组成64K×8位的存储器。每两片构成一组16K×8位的存储器(位扩展),4组便构成64K×8位的存储器(字扩展)。
注意:采用字位同时扩展时,各芯片连接地址线的方式相同,但连接数据线的方式不同,而且需要通过片选信号CS或采用译码器设计连接到相应的芯片。
CPU要实现对存储单元的访问,首先要选择存储芯片,即进行片选;然后为选中的芯片依地址码选择相应的存储单元,以进行数据的存取,即进行字选。
片内的字选通常是由CPU送出的N条低位地址线完成的,地址线直接接到所有存储芯片的地址输入端(N由片内存储容量2n决定)。片选信号的产生分为线选法和译码片选法。
线选法
线选法用除片内寻址外的高位地址线直接(或经反相器)分别接至各个存储芯片的片选端,当某地址线信息为“0”时,就选中与之对应的存储芯片。这些片选地址线每次寻址时只能有一位有效,不允许同时有多位有效,这样才能保证每次只选中一个芯片。
假设4片2K×8位存储芯片用线选法构成8K×8位存储器,各芯片的片选信号见表,其中低位地址线A10~A0作为字选线,用于片内寻址。
译码片选法
译码片选法用除片内寻址外的高位地址线通过地址译码器芯片产生片选信号。如上一节采用2/4译码器来实现字扩展。仅用2位便可以产生4位片选信号。
优点:①存储容量大,位价格低;②记录介质可重复使用:③记录信息可长期保存而不丢失,甚至可脱机存档④非破坏性读出,读出时不需要再生。
缺点:存取速度慢,机械结构复杂,对工作环境要求较高。
磁盘设备的组成
磁记录原理
原理:磁头和磁性记录介质相对运动时,通过电磁转换完成读/写操作。
编码方法:按某种方案(规律),把一连串的二进制信息变换成存储介质磁层中一个磁化翻转状态的序列,并使读/写控制电路容易、可靠地实现转换。
磁记录方式:通常采用调频制(FM)和改进型调频制(MFM)的记录方式。
磁盘的性能指标
记录密度。记录密度是指盘片单位面积上记录的二进制信息量,通常以道密度、位密度和面密度表示。
注意:磁盘所有磁道记录的信息量一定是相等的,并不是圆越大信息越多,故每个磁道的位密度都不同。
磁盘的容量。磁盘容量有非格式化容量和格式化容量之分。
平均存取时间
平均存取时间 = 寻道时间(磁头移动到目的磁道) + 旋转延迟时间(磁头定位到所在扇区) + 传输时间(传输数据所花费的时间) + 平均存取时间=寻道时间(磁头移动到目的磁道)+\\旋转延迟时间(磁头定位到所在扇区)+\\传输时间(传输数据所花费的时间)+ 平均存取时间=寻道时间(磁头移动到目的磁道)+旋转延迟时间(磁头定位到所在扇区)+传输时间(传输数据所花费的时间)+
由于寻道和找扇区的距离远近不一,故寻道时间和旋转延退时间通常取平均值。
数据传输率。磁盘存储器在单位时间内向主机传送数据的字节数,称为数据传输率。假设磁盘转数为r转/秒,每条磁道容量为N字节,则数据传输率为
D r = r N D_r=rN Dr=rN
磁盘地址
主机向磁盘控制器发送寻址信息,磁盘的地址一般如图所示。
若系统中有4=22个驱动器,每个驱动器带一个磁盘,每个磁盘256=28个磁道、16=24个盘面,每个盘面划分为16=24个扇区,则每个扇区地址要18位二进制代码,其格式如上图所示。
硬盘的工作过程
硬盘的主要操作是寻址、读盘、写盘。每个操作都对应一个控制字,硬盘工作时,第一步是取控制字,第二步是执行控制字。
硬盘属于机械式部件,其读写操作是串行的,不可能在同一时刻既读又写,也不可能在同一时刻读两组数据或写两组数据。
**RAID(独立余磁盘阵列)**是指将多个独立的物理磁盘组成一个独立的逻辑盘,数据在多个物理盘上分割交叉存储、并行访问,具有更好的存储性能、可靠性和安全性。
RAID的分级如下所示。在RAID1~RAID5几种方案中,无论何时有磁盘损坏,都可随时拔出受损的磁盘再插入好的磁盘,而数据不会损坏,提升了系统的可靠性。
RAID0:无冗余和无校验的磁盘阵列。
逻辑上相邻的两个扇区在物理上存到两个磁盘,类比“低位交叉编址的多体存储器”
RAID0把连续多个数据块交替地存放在不同物理磁盘的扇区中,几个磁盘交叉并行读写,不仅扩大了存储容量,而且提高了磁盘数据存取速度,但RAID0没有容错能力
RAID1:镜像磁盘阵列。
很粗暴,存两份数据。
RAID1是为了提高可靠性,使两个磁盘同时进行读写,互为备份,如果一个磁盘出现故障,可从另一磁盘中读出数据。两个磁盘当一个磁盘使用,意味着容量减少一半。
RAID2:采用纠错的海明码的磁盘阵列。
逻辑上连续的几个bit物理上分散存储在各个盘中;4bit信息位+3bit海明校验位——可纠正一位错
RAID3:位交叉奇偶校验的磁盘阵列。
RAID4:块交叉奇偶校验的磁盘阵列。
RAID5:无独立校验的奇偶校验磁盘阵列。
RAID通过同时使用多个磁盘,提高了传输率;通过在多个磁盘上并行存取来大幅提高存储系统的数据吞吐量;通过镜像功能,提高安全可靠性;通过数据校验,提供容错能力。
原理
固态硬盘(SSD)是一种基于闪存技术的存储器,属于电可擦除ROM,即EEPROM。
组成
一个SSD由一个或多个闪存芯片和闪存翻译层组成。
读写性能特性
与机械硬盘相比的特点
磨损均衡技术
思想:将“擦除"平均分布在各个块上,以提升使用寿命
由于程序的转移概率不会很低,数据分布的离散性较大,所以单纯依靠并行主存系统提高主存系统的频宽是有限的。这就必须从系统结构上进行改进,即采用存储体系。
通常将存储系统分为“Cache-主存”层次和“主存-辅存”层次。
空间局部性
在最近的未来要用到的信息(指令和数据),很可能与现在正在使用的信息在存储空间上是邻近的。因为指令通常是顺序存放、 顺序执行的,数据一般也是以向量、数组等形式簇聚地存储在一起的。
时间局部性
在最近的未来要用到的信息,很可能是现在正在使用的信息;因为程序中存在循环。
高速缓冲技术就是利用局部性原理,把程序中正在使用的部分数据存放在一个高速的、容量较小的Cache 中,使CPU的访存操作大多数针对Cache进行,从而提高程序的执行速度。
例:假定数组元素按行优先方式存储,对于下面的两个函数:
1)对于数组a的访问,哪个空间局部性更好?哪个时间局部性更好?
A程序的访问数组a的顺序为a[0][0], a[0][1]…, a[0][N-1];a[1][0], a[1][1]…;访问顺序与存放顺序一致,空间局部性好。
B程序的访问数组a的顺序为a[0][0], a[1][0]…, a[M-1][0];a[0][1], a[1][1]…;访问顺序与存放顺序不一致,每次访问都要跳过N个数组元素,即4N个字节,若主存与Cache的交换单位小于4N,则每次访问都要重装Cache,因而没有空间局部性。
两个程序时间局部性都差,因为每个数组元素都只被访问1次。
2)对于指令访问来说,for循环体的空间局部性和时间局部性如何?
对于for循环体,程序A和B中访问局部性相同。因为循环体内指令按序连续存放,所以空间局部性好;内部循环体指令被重复执行,因此时间局部性好。
Cache位于存储器层次结构的顶层,通常由SRAM构成,其基本结构如图所示。
Cache特点
Cache块:Cache和主存都被划分为相等的块,Cache块又称Cache行,每块由若干字节组成,块的长度称为块长(Cache行长)。
由于Cache的容量远小于主存的容量,所以Cache中的块数要远少于主存中的块数,它仅保存主存中最活跃的若干块的副本。
Cache按照某种策略,预测CPU在未来一段时间内欲访存的数据,将其装入Cache。
Cache工作流程
注意:某些计算机中也采用同时访问Cache和主存的方式,若Cache命中,则主存访问终止;否则访问主存并替换Cache
整个过程全部由硬件实现。值得注意的是,CPU与Cache之间的数据交换以字为单位,而Cache与主存之间的数据交换则以Cache块为单位。
Cache性能分析
命中率:CPU欲访问的信息已在Cache中的比率称为Cache的命中率。
设一个程序执行期间,Cache的总命中次数为 N c N_c Nc,访问主存的总次数为 N m N_m Nm,则命中率 H H H为
H = N c / ( N c + N m ) H=N_c/(N_c+N_m) H=Nc/(Nc+Nm)
可见为提高访问效率,命中率H越接近1越好。
平均访问时间:设 t c t_c tc为命中时的Cache访问时间, t m t_m tm为未命中时的访问时间, 1 − H 1-H 1−H表示未命中率,则Cache-主存系统的平均访问时间 T a T_a Ta为
T a = H t c + ( 1 − H ) t m T_a=Ht_c+(1-H)t_m Ta=Htc+(1−H)tm
根据Cache的读、写流程,实现Cache时需解决以下关键问题:
例:假设Cache的速度是主存的5倍,且Cache的命中率为95%,则采用Cache后,存储器性能提高多少(设Cache和主存同时被访问,若Cache命中则中断访问主存)?
解:设Cache存取周期为t,主存存取周期为5t,使用Cache的平均访问时间为:
T a = 95 % × t + ( 1 − 95 % ) × 5 t = 1.2 t T_a=95\%×t+(1-95\%)×5t=1.2t Ta=95%×t+(1−95%)×5t=1.2t
因此,采用Cache后,性能提升至5t/1.2t≈4.17倍
Cache 行中的信息是主存中某个块的副本,地址映射是指把主存地址空间映射到Cache地址空间,即把存放在主存中的信息按照某种规则装入Cache。
由于Cache行数比主存块数少得多,因此主存中只有一部分块的信息可放在Cache中,因此在Cache中要为每块加一个标记,指明它是主存中哪一块的副本。该标记的内容相当于主存中块的编号。为了说明Cache行中的信息是否有效,每个Cache行需要一个有效位。
全相联映射
主存中的每一块可以装入Cache中的任何位置,每行的标记用于指出该行取自主存的哪一块,所以CPU访存时需要与所有Cache行的标记进行比较。
优点:比较灵活,Cache块的冲突概率低,空间利用率高,命中率也高
缺点:标记的比较速度较慢,实现成本较高,通常需采用昂贵的按内容寻址的相联存储器进行地址映射。
全相联映射的地址结构为
直接映射
主存块只能放到特定的某个Cache行,若这个位置已有内容,则产生冲突,原来的块被替换(无需替换算法)
直接映射的关系可定义为:
C a c h e 行号 = 主存块号 % C a c h e 总行数 Cache行号=主存块号\%Cache总行数 Cache行号=主存块号%Cache总行数
假设Cache有2c行,主存有2m块,在直接映射方式,主存的第0块、第2c块、第2c+1块…只能映射到第0行
由此看出,主存块号低c位正好是要装入Cache的行号。给每个Cache设置长为t=m-c的标记(tag),当主存某块调入Cache后,就将其块号的高t位设置在对应Cache行的标记中,如图(a)所示。
直接映射的地址结构为:
CPU访存过程如图(b)所示,
首先根据访存地址中间的c位,找到对应的Cache行,将对应Cache行中的标记和主存地址的高t位标记进行比较,若相等且有效位为1,则访问Cache“命中”,此时根据主存地址中低位的块内地址,在对应的Cache行中存取信息;
若不相等或有效位为0,则“不命中”,此时CPU从主存中读出该地址所在的一块信息送到对应的Cache行中,将有效位置1,并将标记设置为地址中的高t位,同时将该地址中的内容送CPU。
组相联映射
主存块可以放到特定分组中的任意位置。常用的有2路组相联映射,如下图所示。
组相联映射的关系可以定义为
C a c h e 组号 = 主存块号 % C a c h e 组数( Q ) Cache组号=主存块号\%Cache组数(Q) Cache组号=主存块号%Cache组数(Q)
路数越大,即每组Cache行的数量越大,发生块冲突的概率越低,但相联比较电路也越复杂。选定适当的数量,可使组相联映射的成本接近直接映射,而性能上仍接近全相联映射。
组相联映射的地址结构为:
CPU访存过程如下:
全相联映射和组相联映射需要,直接相连映射不需要。从主存向Cache传送一个新块,当Cache或Cache组中的空间已被占满时,就需要使用替换算法置换Cache行。而
随机算法(RAND)
算法:若Cache已满,则随机选择一块替换。
特点:实现简单,但完全没考虑局部性原理,命中率低,(实际效果很不稳定)
先进先出算法(FIFO)
算法:若Cache已满,则替换最先被调入Cache的块
特点:FIFO依然没考虑局部性原理,最先被调入Cache的块也有可能是被频繁访问的
近期最少使用(LRU)
算法:为每一个Cache块设置一个“计数器”,用于记录每个Cache块已经有多久没被访问了。当Cache满后替换“计数器”最大的
Cache块的总数=2n,则计数器只需n位。且Cache装满后所有计数器的值定不重复
特点:基于“局部性原理”,近期被访问过的主存块,在不久的将来也很有可能被再次访问,因此淘汰最久没被访问过的块是合理的。LRU算法的实际运行效果优秀,Cache命中率高。
若被频繁访问的主存块数量>Cache行的数量,则有可能发生“抖动”,如:[1,2,3,4,5,1,2,3,4,5,1,2…)
假定采用四路组相联映射,有5个主存块{1,2,3,4,5}映射到Cache的同一组,对于主存访问{1,2,3,4,1,2,5,1,2,3,4,5},采用LRU算法的替换过程如图。
最近不经常使用(LFU)
算法:为每一个Cache块设置一个“计数器”,用于记录每个Cache块被访问过几次。当Cache满后替换“计数器”最小的。
新调入的块计数器=0,之后每被访问一次计数器+1。需要替换时,选择计数器最小的一行
若有多个计数器最小的行,可按行号递增或FIFO策略进行选择
特点:曾经被经常访问的主存块在未来不一定会用到(如:微信视频聊天相关的块),并没有很好地遵循局部性原理,因此实际运行效果不如LRU
因为Cache中的内容是主存块副本,当对Cache中的内容进行更新时,就需选用写操作策略使Cache内容和主存内容保持一致。此时分两种情况。
写命中
减少了访存次数,但存在数据不一致的隐患。
每个Cache行必须设直一个标志位(脏位),以反映此块是否被CPU修改过。
全写法:当CPU对Cache写命中时,必须把数据同时写入Cache和主存,一般使用写缓冲(write buffer)
写不命中
多级Cache
现代计算机常采用多级Cache离CPU越近的速度越快,容量越小离CPU越远的速度越慢,容量越大。
各级Cache之间常采用**“全写法+非写分配法”**
Cache-主存 之间常采用**“写回法+写分配法”**
主存和辅存共同构成了虚拟存储器,二者在硬件和系统软件的共同管理下工作。对于应用程序员而言,虚拟存储器是透明的。虚拟存储器具有主存的速度和辅存的容量。
虚拟存储器将主存或辅存的地址空间统一编址,形成一个庞大的地址空间,在这个空间内,用户可以自由编程,而不必在乎实际的主存容量和程序在主存中实际的存放位置。
地址空间
逻辑地址:又称虚地址,用户编程允许涉及的地址。虚地址要比实地址大很多。
程序空间:又称虚拟空间,虚地址对应的存储空间。虚拟存储器的地址空间如下图所示。
物理地址:又称实地址,实际的主存单元地址。
主地址空间:又称实地址空间,实地址对应的存储空间。
虚拟地址工作流程
CPU使用虚地址时,由辅助硬件找出虚地址和实地址之间的对应关系,并判断这个虚地址对应的存储单元内容是否已装入主存。
映射方式与写机制
虚拟存储机制采用全相联映射,每个虚页面可以存放到对应主存区域的任何一个空闲页位置。
当进行写操作时,不能每次写操作都同时写回磁盘,因而,在处理一致性问题时,采用回写法。
页式虚拟存储器以页为基本单位。虚拟空间与主存空间都被划分成同样大小的页。
概念
页表
下图为主存中页表示例。
页表的使用:
快表(TLB)
问题:由地址转换过程可知,访存时先访问一次主存去查页表,再访问主存才能取得数据。如果缺页,那么还要进行页面替换、页面修改等,因此采用虚拟存储机制后,访问主存的次数更多了。
解决:将近期访问的页表项放入更高速的存储器组成的快表(TLB),可加快地址变换的速度。相应的把放在主存中的页表称为慢表。在地址转换时,首先查找快表,若命中,则无须访问主存中的页表。
结构:快表通常采用全相联或组相联方式。每个TLB项由页表表项内容加上一个TLB标记字段组成,
注意区别:快表中存储的是页表项的副本;Cache中存储的是主存块的副本
具有TLB和Cache的多级存储系统
下图为一个具有TLB和Cache的多级存储系统,其中Cache采用二路组相联方式。CPU给出一个32位的虚拟地址,TLB采用全相联方式。
CPU利用虚页号查询快表TLB。TLB每一项都有一个比较器,查找时将虚页号与每个TLB标记字段同时进行比较,
地址转换指,将虚拟地址转换为物理地址
TLB未命中查询页表(慢表)。图中所示的是两级页表方式,虚页号被分成页目录索引和页表索引两部分,由这两部分得到对应的页表项,从而进行地址转换,并将相应表项调入TLB,
根据物理地址查询Cache。完成由虚拟地址到物理地址的转换后,Cache机构根据映射方式将物理地址划分成多个字段,然后根据映射规则找到对应的Cache行或组,
查找时,快表和慢表也可以同步进行,若快表中有此虚页号,则能很快地找到对应的实页号,并使慢表的查找作废,从而就能做到虽采用虚拟存储器但访问主存速度几乎没有下降。
在一个具有Cache和TLB的虚拟存储系统中,CPU一次访存操作可能涉及TLB、页表、Cache、主存和磁盘的访问,访问过程如下图所示。
可见,CPU访存过程中存在三种缺失情况:
缺页处理由软件完成,操作系统通过“缺页异常处理程序”来实现;
而TLB缺失既可以用硬件又可以用软件来处理。
段式虚拟存储器中的段是==按程序的逻辑结构(功能模块)==划分的,各个段的长度因程序而异。
虚拟地址
虚拟地址=段号+段内地址
段表:是程序的逻辑段和在主存中存放位置的对照表,实现虚拟地址到实地址之间的变换。
段表的每行记录与某个段对应的段号、装入位、段起点和段长等信息。由于段的长度可变,所以段表中要给出各段的起始地址与段的长度。
访存方式
特点
定义
把程序按逻辑结构分段,每段再划分为固定大小的页,主存空间也划分为大小相等的页,程序对主存的调入、调出仍以页为基本传送单位,这样的虚拟存储器称为段页式虚拟存储器。
内存布局
在段页式虚拟存储器中,每个程序对应一个段表,每段对应一个页表,段的长度必须是页长的整数倍,段的起点必须是某一页的起点。
地址转换
虚地址分为段号、段内页号、页内地址三部分。
特点