本文是基于《计算机组成原理唐朔飞第三版》及教师授课总结出的要点汇总。
文章目录
4.1 概述
4.1.1 存储器分类
1、存储器是计算机系统中的记忆设备,用来存放程序和数据。
2、存储器按存储介质分类:半导体存储器、磁表面存储器(磁盘,非易失性)、磁芯存储器(不易失的永久记忆存储器)、光盘存储器(非易失性,CD—ROM)
3、存储器按存取方式分:随机存储器 RAM、只读存储器 ROM、串行访问存储器、闪速存储器
存储时间与物理地址无关
存取时间与物理地址有关
(1)随机存储器RAM是一种可读/写存储器,其特点是存储器的任何一个存储单元的内容都可以随机存取,而且存取时间与存储单元的物理位置无关。计算机系统中的主存都采用这种随机存储器。
由于存储信息原理的不同,RAM又分为静态RAM(用作高速缓冲,以触发器原理寄存信息)和动态RAM(用作内存,以电容充放电原理寄存信息)。
(2)只读存储器ROM是能对其存储的内容读出,而不能对其重新写人的存储器。这种存储器一旦存人了原始信息后,在程序执行过程中,只能将内部信息读出,而不能随意重新写人新的信息去改变原始信息。因此,通常用它存放固定不变的程序、常数和汉字字库,甚至用于操作系统的固化。它与随机存储器可共同作为主存的一部分,统一构成主存的地址域
只读存储器:MROM(写好,不能修改) PROM(一次性编程) EPROM(重复可擦写,紫外线擦) EEPROM(重复可擦写,电擦)
(3)串行访问存储器:顺序存取存储器(磁带)、 直接存取存储器(磁盘,先直接寻找某个区域,然后再顺序)
4、按在计算机中的作用分类:主存储器、辅助存储器、缓冲存储器。
①主存储器(简称主存)的主要特点是它可以和CPU直接交换信息。
②辅助存储器(简称辅存)是主存储器的后援存储器,用来存放当前暂时不用的程序和数据,它不能与CPU直接交换信息。两者相比,主存速度快、容量小、每位价格高;辅存速度慢、容量大、每位价格低。缓存是设在 CPU 和 主存之间的一种存储器,其速度与CPU速度匹配,其容量与缓存中数据的命中率有关。
③缓冲存储器(简称缓存)用在两个速度不同的部件之中,例如,CPU与主存之间可设置一个快速缓存,起到缓冲作用。
4.1.2 存储器的层次结构
主要思想:上一层的存储器作为低一层存储器的高速缓
1、存储器有3个性能指标:速度、容量、每位价格(简称价位)
一般来说:速度高——容量小——价位高
2、缓存-主存层次 主存-辅存层次
CPU和缓存、主存都能直接交换信息;缓存能直接和CPU、主存交换信息;主存可以和CPU、缓存、辅存(磁盘、磁带)交换信息。
(1)缓存-主存层次:用来缓解 CPU 和主存速度不匹配的问题,由硬件来完成,对所有的程序员完全透明。
(2)主存-辅存层次:用来解决主存容量不够的问题,由操作系统和硬件共同完成,对应用程序设计者透明,对系统程序设计者不透明。
从CPU角度来看,缓存-主存这一层次的速度接近于缓存,高于主存;其容量和位价却接近于主存,这就从速度和成本的矛盾中获得了理想的解决办法。主存-辅存这一层次,从整体分析,其速度接近于主存,容量接近于辅存,平均位价也接近于低速、廉价的辅存位价,这又解决了速度、容量、成本这三者的矛盾。现代的计算机系统几乎都具有这两个存储层次,构成了缓存、主存、辅存三级储系统。
在主存-辅存这一层次的不断发展中,逐渐形成了虚拟存储系统。在这个系统中,程序员编程的地址范围与虚拟存储器的地址空间相对应。例如,机器指令地址码为24位,则虚拟存储器存储单元的个数可达16M。可是这个数与主存的实际存储单元的个数相比要大得多,称这类指令地址码为虚地址(虚存地址、虚拟地址)或逻辑地址,而把主存的实际地址称为物理地址或实地址。物理地址是程序在执行过程中能够真正访问的地址,也是实实在在的主存地址。对具有虚拟存储器的计算机系统而言,程序员编程时,可用的地址空间远远大于主存空间,使程序员以为自己占有一个容量极大的主存,其实这个主存并不存在,这就是将其称为虚拟存储器的原因。对虚拟存储器而言,其逻辑地址变换为物理地址的工作是由计算机系统的硬件和操作系统自动完成的,对程序员是透明的。当虚地址的内容在主存时,机器便可立即使用;若虚地址的内容不在主存,则必须先将此虚地址的内容传递到主存的合适单元后再为机器所用。
4.2 主存储器
4.2.1 概述
1、当要从存储器读出某一信息字时,首先由CPU将该字的地址送到MAR,经地址总线送至主存,然后发出读命令。主存接到读命令后,得知需将该地址单元的内容读出,便完成读操作,将该单元的内容读至数据总线上,至于该信息由MDR送至什么地方,这已不是主存的任务,而是由CPU决定的。若要向主存存入一个信息字时,首先CPU将该字所在主存单元的地址经MAR送到地址总线,并将信息字送人MDR,然后向主存发出写命令,主存接到写命令后,便将数据线上的信息写入对应地址线指出的主存单元中。
2、主存的技术指标
主存的主要技术指标是存储容量和存储速度。
(1)存储容量
- 存储容量是指主存能存放二进制代码的总位数,即 存储容量=存储单元个数x存储字长
- 它的容量也可用字节总数来表示,即 存储容量=存储单元个数x存储字长/8
目前的计算机存储容量大多以字节数来表示,例如,某机主存的存储容量为256MB,则按字节寻址的地址线位数应对应28位。
(2)存储速度
- 存储速度是由存取时间和存取周期来表示的。
- 存取时间又称为存储器的访问时间(MemoryAccess Time),是指启动一次存储器操作(读或写)到完成该操作所需的全部时间。
- 存取时间分读出时间和写入时间两种。
- 读出时间是从存储器接收到有效地址开始到产生有效输出所需的全部时间。
- 写入时间是从存储器接收到有效地址开始到数据写入被选中单元为止所需的全部时间。
- 存取周期(Memory Cycle Time)是指存储器进行连续两次独立的存储器操作(如连续两次读操作)所需的最小间隔时间,通常存取周期大于存取时间。
- 现代MOS型存储器的存取周期可达100ns;双极型TTL存储器的存取周期接近于10 ns。
(3)存储器带宽
- 与存取周期密切相关的指标为存储器带宽,它表示单位时间内存储器存取的信息量,单位可用字/秒或字节/秒或位/秒表示。如存取周期为500ns,每个存取周期可访问16位,则它的带宽为32M位/秒。
- 带宽是衡量数据传输率的重要技术指标。
- 存储器的带宽决定了以存储器为中心的机器获得信息的传输速度,它是改善机器瓶颈的一个关键因素。
为了提高存储器的带宽,可以采用以下措施:
①缩短存取周期。
②)增加存储字长,使每个存取周期可读/写更多的二进制位数。
③增加存储体。
4.2.2 半导体存储芯片简介
1、半导体存储芯片的基本结构
- 半导体存储芯片采用超大规模集成电路制造工艺,在一个芯片内集成具有记忆功能的存储矩阵、译码驱动电路和读/写电路等。
- 译码驱动能把地址总线送来的地址信号翻译成对应存储单元的选择信号,该信号在读/写电路的配合下完成对被选中单元的读/写操作。
- 读/写电路包括读出放大器和写人电路,用来完成读/写操作。
- 存储芯片通过地址总线、数据总线和控制总线与外部连接。
- 存储矩阵由大量相同的位存储单元组成
- 地址线是单向输人的,其位数与芯片容量有关。
- 数据线是双向的(有的芯片可用成对出现的数据线分别作为输入或输出),其位数与芯片可读出或写人的数据位数有关。数据线的位数与芯片容量有关。
- 地址线和数据线的位数共同反映存储芯片的容量。例如,地址线为10根,数据线为4根,则芯片容量为2x4=4K位:又如地址线为14根,数据线为1根,则其容量为16K位。
- 控制线主要有读/写控制线与片选线两种。不同存储芯片的读/写控制线和片选线可以不同。
4.2.3 随机存取存储器
- 静态RAM
- 动态RAM
1、动态RAM的刷新
- 动态RAM共有三种刷新方式:集中刷新,分散刷新,异步刷新
- 刷新的实质:先将原信息读出,再由刷新放大器形成原信息重新写入的再生成的过程
- 为什么要进行刷新:存储单元被访问是随机的,有些存储单元可能长时间的不被访问,不进行存储器的读写操作,其存储单元内的原信息就可能会丢失。
- 刷新是一行行进行的,必须在刷新周期内
- 刷新周期:对DRAM的所有存储单元恢复一次原状态的时间间隔
- 刷新间隔:两次刷新的起始时间差(某行从第一次刷新到第二次刷新的等待时间)
- 行刷新间隔:两行刷新的起始时间差
- 刷新时间:规定的一个周期内刷新的总时间
- 刷新一行的时间是等于存取周期的。因为刷新的过程与一次存取相同,只是没有在总线上输入输出。
1)集中刷新
集中刷新:在规定的一个刷新周期内,对全部存储单元集中一段时间逐行进行刷新(用专门的时间进行全部刷新)
eg:对128×128的矩阵的存储芯片进行刷新,存储周期为0.5μs,刷新周期为2ms(再刷新到这里)
刷新:是对信息读出再写入 所以所需要的时间也是0.5μs
2ms的刷新周期,占得存取周期个数为:2000μs÷0.5μs=4000(个)
共有128行要进行刷新,则刷新占128个存取周期,则刷新的时间为:128×0.5μs=64μs
读写或维持的时间:2000μs-64μs=1936μs
读/写或维持的存储周期为:4000-128=3872(个)
当用64μs进行集中刷新是,此时不能进行任何的读/写操作,故将这64μs称为“死区”或“死时间”
“死时间”所占的比率也称为“死时间率”
则集中刷新的“死时间率为”128÷4000×100%=3.2%
优点:速度高
缺点:存在死区,死时间长
2)分散刷新
分散刷新:是指对每行存储单元的刷新分散到每个存储周期内完成(对某一行某芯片进行读写操作后,紧接着刷新 包含在了读写周期内)
eg:对128×128的矩阵的存储芯片进行刷新,读/写周期为0.5s(读一次或写一次),
将刷新分散到存储周期内完成 ,则存储周期就包含了刷新时间
此时,存储周期(存储器进行两次独立的存储器操作读或写)为t=0.5μs+0.5μs=1μs
刷新(刷新以行算)一行的时间为1μs,全部刷新完的时间为:128×1μs=128μs
此时比2ms小的多 在刷新到此处隔128μs
优点:无死区
缺点:存取周期长,整个系统的速度降低了
3)异步刷新
异步刷新:前两种方式的结合,缩短了死时间,充分利用了最大刷新间隔为2ms的特点(只要在2ms内对这一行刷新一遍就行)
eg:对128×128的矩阵的存储芯片进行刷新,存储周期为0.5s,刷新周期为2ms
2ms内对每行刷新一遍:2000μs÷128≈15.6μs
即每隔15.6μs刷新一行,每行的刷新时间仍然为0.5μs。刷新一行就停一个存储周期,“死时间缩短为0.5μs”(15.6μs内刷新一行 其他全用来读写)
这种方案克服了分散刷新许独占0.5μs用于刷新,使存取周期加长且降低系统速度的缺点,又不会出现集中刷新的访问“死区”问题,从根本上提高了工作效率。
2、动态RAM与静态RAM的比较
- 目前,动态RAM的应用比静态RAM要广泛得多。其原因如下:
①在同样大小的芯片中,动态RAM的集成度远高于静态RAM,如动态RAM的基本单元电路为一个MOS管,静态RAM的基本单元电路可为4~6个MOS管。
②动态 RAM 行、列地址按先后顺序输送,减少了芯片引脚,封装尺寸也减少。
③动态RAM的功耗比静态RAM。
④)动态RAM的价格比静态RAM的价格便宜。当采用同一档次的实现技术时,动态RAM的容量大约是静态RAM容量的4~8倍,静态RAM的存取周期比动态RAM的存取周期快8~16倍,但价格也贵8~16倍。 - 随着动态RAM容量不断扩大,速度不断提高,它被广泛应用于计算机的主存。
- 动态RAM也有缺点:
①由于使用动态元件(电容),因此它的速度比静态RAM低。
②)动态RAM需要再生,故需配置再生电路,也需要消耗一部分功率。通常,容量不大的高速缓冲存储器大多用静态RAM实现
4.2.4 存储器与CPU的连接
1、存储容量的扩展
由于单片存储芯片的容量总是有限的,很难满足实际的需要,因此,必须将若干存储芯片连在一起才能组成足够容量的存储器,称为存储容量的扩展,通常有位扩展和字扩展。
(1)位扩展
位扩展是指增加存储字长,例如,2片1Kx4位的芯片可组成1Kx8位的存储器
(2)字扩展
字扩展是指增加存储器字的数量。例如,用2片1Kx8位的存储芯片可组成一个2Kx8位的存储器
(3)字、位扩展
字、位扩展是指既增加存储字的数量,又增加存储字长。
2、存储器与CPU的连接
- 地址线的连接
- 数据线的连接
- 读/写命令线的连接
- 片选线的连接
- 合理选择存储芯片
4.2.5 存储器的校验
1、对存储器校验的原因:
以内存为例,内存是电子设备,信息保存在电容当中,若采用静态RAM,则是保存在四管的触发器当中,若内存所处的电磁环境比较复杂,或在空间环境下受到带电粒子的打击,可能造成电容的充放电或触发器的翻转,存在在存储器的信息可能会出错
2、编码的检测能力和纠错能力与任意两组合法代码之间二进制的最少差异数有关
差异的位数越多,检错能力和纠错能力就越强
若只差一位,既不能检错,也不能纠错
若相差两位,可以检1位错,纠0位错
若相差三位,可以检1位错,纠1位错
3、编码的最小距离
任意两组合法代码之间二进制的最少差异数
编码的检测能力和纠错能力与编码的最小距离关系
L-1=D+C(D>=C)
L:编码最小距离
D: 检错位数
C: 纠错位数
假设L=3,要使编码具有一位纠错能力,至少有一位检错能力
4、汉明码
(1)定义:指具有一位纠错能力的编码
(2)采用奇偶校验
采用分组校验
(3)奇校验:加上一个校验位,加上原来的数据位,两者和在一起,代码当中1的个数是奇数个。
偶校验:加上一个校验位,加上原来的数据位,两者和在一起,代码当中1的个数是偶数个。
(4)汉明码的分组是一种非划分方式
假设现在有7位数据
分成3组,每组有1位检验位,共包括4位数据位。
每个圆圈表示1组
1,2,4分别被分到3组当中,每组独有一位,每组都采用偶校验的方式。3组中每组包含4位数据,4位数据中有1位校验位。
3组生成3个校验结果
偶校验采用异或门实现,1的个数是偶数个,所以校验的结果应该是3个0,无差错
P1对应第一组校验结果,P2对应第二组校验结果,P3对应第三组校验结果
P3P2P1
0 0 0 若无差错,三组校验结果都为0
0 0 1 第一组出错(第一组独有的位置,恰好就是1
)
1 0 1 第一组和第三组都出错,代码只错误1位,所以是两组的公共部分5
1 0 1 第二组和第三组都出错,1位错,二三组公共位置6
1 1 1 第一组和第二组和第三组都出错,1位错,一二三组公共位置7
对每组分别校验,校验得出的结果排在一起,得出的数用二进制的方式来表示,这个二进制数转换为十进制就给出了出错的位置,全0没有出错,001就是1错了,011是3错了,110就是6错了,111是7错了
eg:求0101按“偶校验”配置的汉明码
解:因为n=4
由2^k>=n+k+1得k=3
汉明码排序如下:
解析:对照上面的表c1对应1,3,5,7…这几个位,发现5位和7位都为1,1的个数是偶数个,所以C1处添0
对照上面的表c2对应2,3,6,7…这几个位,发现第7位都为1,1的个数是奇数个,所以C2处添1
对照上面的表c2对应4,5,6,7…这几个位,发现第5位和7位都为1,1的个数是偶数个,所以C2处添0
检验位只在1,2,4,8,,这几个位进行校验
所以0101的汉明码为0100101
4.3 高速缓冲存储器
4.3.1 概述
避免CPU空等现象
1、Cache的出现使CPU可以不直接访问主存,而与高速Cache交换信息。
时间局部性:在最近的未来要用到的信息,很可能是现在正在使用的信息。
空间局部性:在最近的未来要用到的信息(指令和数据),很可能与现在正在使用的信息在存储空间上是邻近的。
2、Cache的工作原理
任何时刻都有一些主存块处在缓存块中。CPU欲读取主存某字时,有两种可能:一种是所需要的字已在缓存中,即可直接访问Cache(CPU与Cache之间通常一次传送一个字);另一种是所需的字不在Cache内,此时需将该字所在的主存整个字块一次调入Cache中(Cache与主存之间是字块传送)。如果主存块已调人缓存块,则称该主存块与缓存块建立了对应关系。
上述第一种情况为CPU访问Cache命中,第二种情况为CPU访问Cache 不命中。由于缓存的块数C远小于主存的块数M,因此,一个缓存块不能唯一地、永久地只对应一个主存块,故每个缓存块需设一个标记,用来表示当前存放的是哪一个主存块,该标记的内容相当于主存块的编号。CPU读信息时,要将主存地址的高m位(或m位中的一部分)与缓存块的标记进行比较,以判断所读的信息是否已在缓存中。
Cache的容量与块长是影响Cache效率的重要因素,通常用“命中率”来衡量Cache的效率。
命中率是指CPU要访问的信息已在Cache内的比率。
4.3.2 Cache——主存地址映射
由主存地址映射到Cache地址称为地址映射。
1、直接映射
2、全相联映射
3、组相联映射
eg:
4.3.3 替换策略
根据程序局部性规律可知:程序在运行中,总是频繁地使用那些最近被使用过的指令和数据。这就提供了替换策略的理论依据。综合命中率、实现的难易及速度的快慢各种因素,替换策略可有随机法、先进先出法、最近最少使用法、最不经常使用算法等。
1、随机法(RAND法)
随机法是随机地确定替换的存储块。设置一个随机数产生器,依据所产生的随机数,确定替换块。这种方法简单、易于实现,但命中率比较低。
2.先进先出法(FIFO法)
先进先出法是选择那个最先调入的那个块进行替换。当最先调入并被多次命中的块,很可能被优先替换,因而不符合局部性规律。这种方法的命中率比随机法好些,但还不满足要求。先进先出方法易于实现,例如Solar-16/65机Cache采用组相联方式,每组4块,每块都设定一个两位的计数器,当某块被装入或被替换时该块的计数器清为0,而同组的其它各块的计数器均加1,当需要替换时就选择计数值最大的块被替换掉。
3.最近最少使用法(LRU法)
难点:时间周期不好定义
LRU法是依据各块使用的情况, 总是选择那个最近最少使用的块被替换。这种方法比较好地反映了程序局部性规律。
实现LRU策略的方法有多种。 下面简单介绍计数器法、寄存器栈法及硬件逻辑比较对法的设计思路。
- 计数器方法:缓存的每一块都设置一个计数器,计数器的操作规则是:
(1) 被调入或者被替换的块, 其计数器清“0”,而其它的计数器则加“1”。
(2) 当访问命中时,所有块的计数值与命中块的计数值要进行比较,如果计数值小于命中块的计数值,则该块的计数值加“1”;如果块的计数值大于命中块的计数值,则数值不变。最后将命中块的计数器清为0。
(3) 需要替换时,则选择计数值最大的块被替换。 - 寄存器栈法:设置一个寄存器栈,其容量为Cache中替换时参与选择的块数。如在组相联方式中,则是同组内的块数。堆栈由栈顶到栈底依次记录主存数据存入缓存的块号。
(1) 当缓存中尚有空闲时,如果不命中,则可直接调入数据块,并将新访问的缓冲块号压入堆栈,位于栈顶。其他栈内各单元依次由顶向下顺压一个单元,直到空闲单元为止。
(2) 当缓存已满,如果数据访问命中,则将访问的缓存块号压入堆栈,其他各单元内容由顶向底逐次下压直到被命中块号的原来位置为止。如果访问不命中,说明需要替换,此时栈底单元中的块号即是最久没有被使用的。所以将新访问块号压入堆栈,栈内各单元内容依次下压直到栈底,自然,栈底所指出的块被替换。 - 比较对法:比较对法是用一组硬件的逻辑电路来记录各块使用的时间与次数。
假设Cache的每组中有4块,替换时,是比较4块中那一块是最久没使用的,4块之间两两相比可以有6种比较关系。如果每两块之间的对比关系用一个RS触发器,则需要6个触发器(T12,T13,T14,T23,T24,T34),设T12=0表示块1比块2最久没使用,T12=1表示块2比块1最久没有被使用。在每次访问命中或者新调入块时,与该块有关的触发器的状态都要进行修改。按此原理,由6个触发器组成的一组编码状态可以指出应被替换的块。例如,块1被替换的条件是:T12=0,T13=0,T14=0;块2被替换的条件是:T12=1,T23=0,T24=0等等。