4.1 概述
存储器的分类
按照存储介质分类
存储介质是指能寄存“0”,“1”两种代码并且能够却别两种状态的物质或者元件。
- 半导体存储器
- 常见有:TTL(速度高),MOS(集成度高)
- MOS半导体存储由于制造更简单,价格更便宜,功耗更小,所以被广泛应用
- 优点:体积小,功耗低,存取时间短
- 缺点:电源消失的时候,所存储的信息也容易丢失
- 磁表面存储器
- 根据磁体的形状可以分为:磁盘,磁带,磁鼓
- 特点:信息不易丢失
- 磁芯片存储器
- 优点:信息不易丢失
- 缺点:体积大,工艺复杂,功耗大
光盘存储器
存取时间和物理地址无关(随机访问)
- 随机存储器(RAM):在程序的执行过程中,可以读可以写
- 只读存储器(ROM):在程序的执行过程中,只可以读
- 存取时间和物理地址有关(串行访问)
- 顺序存取存储器:磁带
- 直接存取存储器:磁盘
只读存储器并不是不能完全不能写入,只有部分只读存储器是纯读取的,大部分的只读存储器在程序没有执行的过程中可以写入,这一点在后面也会讲到原因。 和物理地址无关是随机访问存储器,有关则是按照存储器的物理地址的顺序进行访问,其中直接存取存储器实际上结合了随机访问和串行访问,具体原因无需了解,知道即可。
按照在计算机中的作用进行分类
所谓主存,就是需要和CPU直接交换信息的存储器,辅存则是不用直接交换的,一般用于存放当前暂时不用的程序和数据。
两者相比:
主存 | 辅存 | |
---|---|---|
速度 | 快 | 慢 |
容量 | 小 | 大 |
每位价格(位价) | 高 | 低 |
由于CPU的速度又远大于主存的速度,所以在CPU和主存之间又设立了一个缓存,起到缓冲的作用。
存储器的层次结构
存储器的三个重要特性
- 速度
- 容量
- 位价
下图从上到下: 速度越来越慢 容量越来越大 位价越来越低
三层结构
存储系统的层次结构主要体现在:缓存-主存和主存-辅存这两个存储层次上。
CPU和缓存,主存都可以直接交换信息,缓存能和主存CPU直接交换信息,主存则可以和其他三个交换信息。
缓存-主存层次主要解决CPU和主存速度不匹配的问题。主存会把CPU近期最需要调用的信息存入缓存当中,这样可以提高访存速度。
主存-辅存层次主要解决存储系统容量的问题。辅存当中会存放大量暂时用不到的数据,等到需要用到的时候,通过硬件和操作系统统一调入主存当中,供CPU进行访问。
在主存-辅存这一个层次的发展当中,又逐渐形成了虚拟存储系统,这个系统当中,编程对应的地址范围和虚拟存储器的地址空间相对应。
这个对应就体现在:例如指令地址码有24位,那么虚拟存储器存储单元个数可以达到224 = 16M个。
但是实际上主存的存储单元个数远远小于16M,虚拟存储器之所以能达到这么大容量,是因为借用了外存(辅存)的存储空间,把当前不需要访问的数据存放在外存(辅存)。
参见:https://blog.csdn.net/weixin_40491661/article/details/121269407
在虚拟存储系统中,存储地址被称为:虚地址或者逻辑地址。在实际主存当中,实际地址被称为:物理地址或者实地址。由于虚拟存储系统实际上是借用了外存,所以当虚地址的内容
在主存当中的时候,就直接调用,如果不在主存当中,则先把该内容传递到主存再调用。
4.2 主存储器
概述
主存的基本组成
首先看一下主存的基本组成:
这里可以回顾一下第一章的内容。
相比第一章,增添的驱动器和译码器的作用是用于解析MAR中的地址,从而访问到某个存储单元。存储体和MDR之间也需要通过读写电路进行交互。
主存与CPU的关系
上图中,主存包含的实际是:存储体 + 驱动器 + 译码器 + 读写电路。MAR和MDR则包含在CPU当中。
主存存储单元的分配
首先区分一下概念:位,字节,字
位、字节、字_百度百科位
:计算机当中最小的存储单位。一位表示一位二进制数。字节
:一字节通常等于8位字节字
:也叫机器字
,大致可以理解为表示一个基本字符,这个字符一般是**8n位**
,具体多少位需要看计算机的位数,比如计算机是32位(字长)的,那么就包含了四个字节。
计算机可以通过字
来寻址,也可以通过字节
来寻址。所谓寻址就是找寻在主存当中真实的物理地址,在寻址之前首先了解一下计算机如何编址。
编址:存储器是由一个个存储单元构成的,为了对存储器进行有效的管理,就需要对各个存储单元编上号,即给每个单元赋予一个地址码,这叫编址。经编址后,存储器在逻辑上便形成一个线性地址空间。
寻址:存取数据时,必须先给出地址码,再由硬件电路译码找到数据所在地址,这叫寻址。
参见:https://baike.baidu.com/item/%E7%BC%96%E5%9D%80/4781443 通常情况下,没有特殊说明都是按照字节编址。
寻址里面的地址又分为两类:
- 存放一个机器字的存储单元,通常称为字存储单元,相应的单元地址叫字地址。
- 存放一个字节的存储单元,称为字节存储单元,相应的地址称为字节地址。
- 如果计算机中可编程的最小单位是字存储单元,则该计算机称为按字寻址的计算机。
- 如果计算机中可编程的最小单位是字节,则该计算机称为按字节寻址的计算机。
参见:https://blog.csdn.net/qq_43627631/article/details/106456371
以按照字节编址(一个地址需要8位二进制表示)为前提,假设地址线有24根:
那么24根地址线代表可以表示224 = 16M
个地址。
如果按照字节寻址,一个字节正好对应8位二进制,则字节的寻址范围就是 16M
。
如果字长是16位,按照字寻址,1字 = 2字节 ,那么字的寻址范围就是 16/2 = 8M
如果字长是32位,按照字寻址,1字 = 4字节,那么字的寻址范围就是 16/4 = 4M
1字 = 2字节说明一个字里面有两个可以独立寻址的字节。 字节寻址可以理解为一个人收作业,字长为16的字寻址可以理解为两个人收作业,收作业的范围就可以减半。
主存的技术指标
- 存储容量
- 表示主存能存放的二进制代码的总位数
- 存储容量 = 存储单元个数 * 存储字长(如果用字节数表示就再除以8)
- 存储速度
- 取决于存取周期和存取时间
- 存取时间:存储器的访问时间,指:启动一次存储器操作到完成的全部时间
- 读出时间:从存储器接受到有效地址开始,到产生有效输出的全部时间
- 写入时间:从存储器接受到有效地址开始,到数据写入被选中单元为止的全部时间
- 存取周期:存储器连续两次独立的存储器操作所需要最小的时间间隔
- 一般
存取周期 > 存取时间
- 一般
存储器带宽:单位时间内存储器存取的信息量
地址线:单向输入,用于输入地址信号,假设有
n根
- 数据线:双向输入输出,用于输入输出数据信号,假设有
m根
- 片选线:用于选择存储芯片,也就说说当片选线信号有效的时候,该芯片被激活工作
- 读写控制线:控制芯片的是读操作还是写操作
- 如果是一根读写线,那么用高低电平区分操作是读操作还是写操作
- 如果是两根读写线,那么一根用于读,一根用于写
- 芯片(存储)容量:容量 = 2n m(容量 = 地址数量 一次操作的数据位数)
例如:地址线10根,数据线4根,那么芯片容量为 1k * 4位
存储芯片片选线的作用
背景如下:
芯片的容量16K * 1位
,现在组成64K * 8位
的存储体:
芯片一次性只能输出一位,而存储体要求一次操作输出8位,所以需要八个芯片一同做输出。
满足了一次性操作的数据位数之后,再满足地址个数,所以需要64/16 = 4
组芯片,每组有8个芯片。
存储体的组成如下图所示:
一次操作,片选线同时控制8片芯片同时工作做输入输出。
半导体存储芯片的译码驱动方式
驱动方式有两种:
- 线选法
- 重合法
线选法
线选法就是用一根字选择线(字线)直接选中一个存储单元的各位。
例如上图中,当四根地址线都是0的时候,表示选中第(0000)2 = (0)10
根字线上的8个。
存储器的大小就是 16 * 8位
很明显,如果地址线很多,这种方式就不适合做译码驱动。这里: 矩阵行数 = 2地址线根数 矩阵列数 = 读写线/位线 根数
重合法
重合法就是使用两跟字线交叉点决定选中的存储单元的位。
例如上图中,所有地执线均为0,那么就选中第0行的第0列。
这里存储器的大小就是1K * 1位
这里读写线只有一位,如果需要构成一个
1K * 1字节
的存储器, 。
随机存取存储器 SRAM
静态RAM的基本单元电路
在存储器中,用于寄存0和1的电路成为存储器的基本单元电路,以下这张图就是一个基本单元电路。
Tn
:MOS管T1 - T4
:由MOS管组成的触发器基本电路,也是实际二进制信息存储的地方T5、T6
:由行地址选择信号控制,相当于一个开关T1 - T6
:基本单元电路T7、T8
:由行地址选择信号控制,不在基本单元电路内,由多个基本单元电路共享
静态RAM通过触发器原理来存储信息(触发器保持有电状态记录为1 ,反之为0)。信息读出之后,会仍然保持原状态,但是电源一旦掉电,原存信息就会丢失。
如果触发器的信号是1
,那么在A点为高电平,A’为低电平
读操作:
如果想要读取触发器的信息,就需要使得行信号和列信号以及读选择信号均有效,使得电路导通,通过读出放大器放大信号,即可获得触发器的信息。
写操作:
在做写入的时候,写选择线信号有效,加入DIN写入的是1
,那么经过两个写放大器,使两端的输出为相反的电平(0
和1
,左边为0,右边为1),同时行信号和列信号均有效,那么**A'**
为低电平,**A**
为高电平,这样就代表写入了1
信息。
静态RAM 的读/写时序
这个不重要,浅看一下链接即可:
SRAM DRAM时序分析_德林恩宝的博客-CSDN博客_sram时序
动态存取存储器 DRAM
动态RAM的基本单元电路
动态RAM的基本单元电路有两种:
- 三管式(左图)
- 单管式(右图)
两者的共同特点就是都依赖于电容(C)存放信息,当电容有足够多的电荷的时候就表示存储信息1,反之存储0。由于电容上的电荷维持时间很短,一般维持1-2ms,所以需要每2ms恢复一次电容状态,这个过程叫做刷新,相比静态RAM,有集成度高,功耗低的特点。
针对三管式:
- 读操作
- T4会先进行预充电,使得T4导通
- 读数据线信号有效,使得T2导通
- 判断电容的Cg信息
- 如果为
1
,则T1导通,一路导通接地,读数据线的电平就降为低电平,读出的实际信号为**0**
- 如果为
0
,则T1不导通,读数据线的电平不变,为T4的高电平,读出的实际信号为**1**
- 如果为
- 写操作
- 写信号有效,使得T3导通
- 写数据线如果写入
1
,则表示高电平,于是给电容充电,电容存储的实际信号为**1**
- 写数据线如果写入
0
,则表示低电平,于是给电容放电,电容存储的实际信号为**0**
总结就是:
- 读出的信息与原存信息相反
- 写入的信息和输入的信息相同
针对单管式:
- 读操作
- 字线上位高电平,T导通
- 判断电容的Cs信息
- 如果为
1
,数据线上有电流,读出的实际信号为**1**
- 如果为
0
,数据线上无电流,读出的实际信号为**0**
- 如果为
- 写操作
- 字线上位高电平,T导通
- 写入
1
,对Cs充电,实际存储的信号为1
,反之为0
相比三管,单管的优势就是集成度更高。
三管动态RAM芯片
以写操作为例,解释一下三管动态RAM的运作。
跟前面一样,没啥好讲的,看看图吧。
单管动态RAM
这里的图比较特殊。
首先是输入和输出数据线,这里看似有两根(DIN和DOUT),实际上是一根,所以一次操作传输的位数是1位
。其次可以看到这里的行译码被分成了两块,阵列的大小都是**64*128**
(原图没有给出,这里补充一下),实际上两个合在一起就是一个128 * 128
的矩阵,也就是27 * 27
,说明至少需要14根地址线,而图上只有A0-A6
七根地址线,原因是这里采用了分时复用的方法,行列分时复用这七根地址线。
不难看出这里就是一个16K * 1位
大小的存储芯片。
16K = 27 * 27
参照
以上两个小结的图片均源自:
计算机组成原理笔记——随机存取存储器_Time like water的博客-CSDN博客
计算机组成原理动态RAMChenfengZhang的博客-CSDN博客动态ram基本电路
动态RAM的刷新
- 动态RAM的刷新一般2ms一次
- 刷新的方式是针对存储矩阵逐行刷新
- 每一行的刷新时间 = 存取周期
动态刷新三种方式:
- 集中刷新
- 分散刷新
- 异步刷新
下面都假设:存储矩阵为128 * 128
。也就是有128行需要刷新,存取周期为0.5μs
集中刷新
所谓集中刷新,就是在2ms这个刷新间隔里面,集中一个时间把128行全部刷新一遍。如下图所示,那么刷新总时间为128 0.5 = 64 μs。
每一行距离下次刷新的时间仍然是*2ms。
在刷新期间,存储单元不能做读写操作,这段时间被称为“死时间”或者“死区”。
死时间率 = 死区占有时间 / 总刷新时间。
所以这样的弊端很明显:死时间很长,这段时间内无法做读写。
分散刷新
分散刷新就是每有一行做完读/写之后就立马紧随其后做一次刷新。
每一行距离下次刷新的时间就是 128 0.5 =* 64 μs。
这样做的好处是没有死时间,但是这样存取周期变相延长了一倍,会使得整个系统的速度降低。
异步刷新
异步刷新就是集中刷新和分散刷新的结合,简单的来说就是将2ms
的刷新时间进行均分,如果是128行,那么就每2000 / 128 = 15.6 μs
刷新一行。
每一行距离下次刷新的时间仍然是2ms。
这样就既没有死时间,同时还提高了工作效率。
动态RAM和静态RAM的对比
DRAM | SRAM | |
---|---|---|
存储原理 | 电容 | 触发器 |
集成度 | 高 | 低 |
芯片引脚 | 少 | 多 |
功耗 | 小 | 大 |
价格 | 低 | 高 |
速度 | 慢 | 快 |
刷新 | 有 | 无 |
一般情况下,动态RAM的应用比静态RAM广。
参见
本小节参见:
动态RAM刷新及动态RAM和静态RAM的比较你的代码没bug的博客-CSDN博客动态ram
只读存储器
掩模ROM
掩模ROM是一种纯只可读的存储器,也就是说无论程序是否在执行过程中,都只能读不能写,大致结构如下:
可以看到这种ROM采用的是重合的方式进行译码驱动,判断信息的方式就是判断在两根交叉的地址线上是否存在MOS管,如果存在,则表示**0**
,如果不存在,表示**1**
。
为什么存在是
0
,是因为MOS管旁边会接地,存在MOS管导通之后,电平接地为变为0。
但是在最后输出的时候,通过读放大器,信号会反向输出,所以输出的结果1还是1,0还是0。
所以这种ROM一单制作完成,做不了有任何的修改。
PROM
PROM是一种只可以实现一次性编程的只读存储器,由一个双极型电路和熔丝构成:
判断信息的方式是熔丝是否断裂,如果没有断裂,则表示为1
,如果断裂了,则为0
。
如果想要对信息进行修改,就加一个电流,让熔丝烧断即可。
EPROM
EPROM是一种可擦除,可编程的只读存储器,结构如下:
G、D、S组成的是一个n型的MOS管,其中通过浮动栅可以控制MOS管的导通与否。
加正电压 | 不加正电压 | |
---|---|---|
有浮动栅 | 不导通 | 不导通 |
无浮动栅 | 导通 | 不导通 |
那么如果想要修改信息,就可以通过照射紫外线的方式,使得浮动栅消失(这个过程叫擦除),或者撤销紫外线,使得浮动栅呈现。
但是这样的修改是针对整体的,不能做到局部修改。
EEPROM
EEPROM是指带电可擦可编程只读存储器。是一种掉电后数据不丢失的存储芯片。
EEPROM 可以在电脑上或专用设备上擦除已有信息,重新编程。一般用在即插即用。
EEPROM的特点:
- 电可擦写
- 局部擦写
- 全部擦写
Flash Memory (闪速型存储器)
快闪存储器,是一种电子式可清除程序化只读存储器,允许在操作中被多次擦或写的存储器。这种科技主要用于一般性数据存储,以及在计算机与其他数字产品间交换传输数据,如储存卡与U盘。
闪存是一种非易失性存储器,即断电数据也不会丢失。因为闪存不像RAM(随机存取存储器)一样以字节为单位改写数据,因此不能取代RAM。
Flash Memory既有EPROM的价格便宜、集成度高的优点,又有EEPROM电可擦除重写的特性。参照
计算机组成原理6-主存储器—只读存储器(ROM)swadian2008的博客-CSDN博客计算机组成原理rom存储器和CPU的连接
存储容量的扩展
为什么需要拓展?
因为单片存储芯片的容量有限,需要将若干的存储芯片连接在一起才能组成足够容量的存储器。
扩展方式通常有以下三种:
- 位扩展
位扩展是指增加存储字长(扩展存储字长的位数),比如使用两片1K*4位
的存储芯片组成一个1K*8位
的存储器。
具体的链接方式如下:
其中:
A
:表示地址信号线D
:表示数据线CS
:片选信号线WE
:读写线2214
:1K*4位
的存储芯片
扩展了字长,说明需要一次性读写**8位**
,而一个2114芯片只能一次性读写**4位**
,所以需要把**8根**
数据线,平均分给两个芯片,一片分到D4-D7
四个高位数据线,另一片分到D0-D3
四个低位数据线。
同时CS线
需要同时连接两个芯片,当CS
有效的时候,就可以同时选中两个芯片进行读写。
地址信号线正好10根
,对应1K
,两个芯片共享即可。WE
正常全员共享即可。
- 字扩展
字扩展是指增加存储器字的数量,比如使用两片1K*8位
的存储芯片组成一个2K*8位
的存储器。
具体的链接方式如下:
由于一次性读取的位数是8位
,而芯片的位数也是8位
,所以不需要同时读取两个芯片,只需要将数据分别存储在两个存储芯片当中即可。
一个存储芯片只需要10根
地址线即可,那么剩下的1根A10
就作为片选线CS
。
上图中:
当片A10
为0
的时候,CS0
有效,CS1
无效,此时第一个芯片被选中读写。
当片A10
为1
的时候,CS1
有效,CS0
无效,此时第二个芯片被选中读写。
所以字扩展的关键就是:片选信号的形成。
首先
CS
在低电平(0)有效。 其次第二个芯片与A10
的连接线路上有一个非门(就是红框的1),所以信号会取反。
这样就保证了两个芯片的组合且互不干扰。
- 字-位扩展
字-位扩展就很明显,在增长存储字长的同时还增加存储字的数量:4K * 8位
存储器就说明了:
- 一次性需要读写
2片
芯片 - 需要
4组
芯片才能满足存储字的数量
注意:先做位扩展,再做字扩展。
普通片选线CS
只能有0和1
两种信号,所以这里把多于的**2根**
地址线经过片选译码器得到了四种信号,正好对应了四组芯片。
存储器和CPU的连接
- 地址线的连接
- 通常CPU的地址线比存储器的数据线要多
- CPU地址线的低位和存储器的地址线相连
- CPU地址线的高位在扩充时候作用,或者做其他作用,比如用做片选信号线
- 数据线的连接
- 对于存储器的扩位连接CPU和存储器
- 读写命令线的连接
- 高电平为读,低电平为写
- 如果CPU的读写线是分类的,那么读/写命令线应该和存储芯片内相应的控制端相连
- 片选线的连线
- 片选信号和
MREQ
有关,当MREQ
为低电平的时候,片选信号有效,CPU要求访存;当MREQ
为高电平的时候,I/O
有效,CPU要求输入输出。 - 如果CPU的地址线多于存储器的地址线,那么一般高位的地址线作为片选信号线,和访存控制信号共同控制片选信号。
- 片选信号和
- 合理选择存储芯片
74138译码器
:也叫38译码器
,指的是:3输入,8输出,也就是通过3根线的电平表示8种信号。- 三个控制端是用于控制译码器是否正常输出
**G****1**
为高电平,**G****2A**
与**G****2B**
为低电平的时候译码器正常输出A,B,C
就是输入的三个端口,Y
即为输出端口,例如A,B,C = 0,0,0
的时候,Y0
输出有效,A,B,C = 0,0,1
的时候,Y1
输出有效(Y低电平有效)
- 三个门电路分别是:
非门
,与非门
,非与非门
,作用自己查一下,很简单。 6000H
:其中H
表示前面的数字为16进制,6000
表示
接下来就是步骤解析:
第一步:确定各个存储器的容量
首先所有十六进制数转为二进制,首尾相减再加一即可得出存储地址的范围。
例如这里的:
(67FF - 6000 + 1)16 = (2K)2
8位
是因为通常按照字节编址,一字节等于8位。 所以系统程序区就是2K * 8位
。
第二步:选择存储芯片
选择原则就是上一小节的第五点。
以系统程序区为例,就是选择**1**
片**2K*8位**
的**ROM存储芯片**
。
用户程序区就是选择**2**
片**1K*4位**
的**RAM存储芯片**
。
第三步:分配CPU的地址线
先看完整图:
分配存储器的地址线和数据线:
ROM
:2K * 8位
,一片,所以需要11
根地址线,对应A0-A10
,8
根数据线,对应D0-D7
RAM
:1K * 4位
,两片,需要10
根地址线,对应A0-A9
,4
根数据线,分别对应D0-D3
,D4-D7
第四步:片选信号线的形成
首先连接译码器三个控制端,从地址线的高位开始选择。
由于A15
和A14
分别恒为0
和1
,正好对应的是G2
的低电平,和G1
的高电平,G2
需要两根线,而MREQ
低电平有效,所以可以接入G2
。
接着接入三个输出端,往下就是A13-A11
对应ABC,观察此处的取值:
系统程序区域,A13-A11
就是100
,也就是Y4
有效,选中1片ROM;
用户程序区域,A13-A11
就是101
,也就是Y5
有效,选中2片RAM;
所以Y4
连接ROM,Y5
连接RAM。
但如果Y5
直接连接RAM是有问题的,因为当A13-A11
取101
的部分,也包含了用户程序区后面的区域,
比如地址6C00
,对应二进制就是0 1 1 0 |1 1 0 0 | 0 0 0 0 | 0 0 0 0
,很明显,这个区域不属于用于程序区域,也就是当A10
为低电平(0
)的时候,才属于用户程序区,所以这里需用通过**Y****5**
和**A****10**
一同控制RAM的片选信号。
那么当Y5
和A10
都是0
的时候,怎么选择门电路使得最后输出的信号也是低电平0
呢?这里三个门电路依次使用以下就知道是非与非门
,相当于**或门**
。
最后再补充一些细节:
- 所有芯片直接接入WR
ROM
只读不写,所以ROM
需要接地,也就是连接PD/Progr
为什么接地?因为读信号是高电平
1
,写信号是低电平0
,接地所有信号都为0
,也就不能读了。
参见
本小节图片参见:
计算机组成原理——存储器容量扩展(字扩展、位扩展、字位扩展)Selcouther的博客-CSDN博客字扩展
计算机组成原理7-主存储器—存储器与CPU的连接_swadian2008的博客-CSDN博客
例题拓展
两道题网上找不到,就等PPT下来了再写,直接看书上P95-P99
某机CPU可寻址的最大存储空间为64KB,存储器按字节编址,CPU的数据总线宽度为8位。目前系统中使用的存储器容量为8KB,其中:4KB为ROM,拟采用2K*8的ROM芯片,其地址范围为0000H-0FFFH,4KB为RAM,拟采用4K*2的RAM芯片,其地址范围为4000H-4FFFH,
(1)需RAM和ROM芯片各多少片?
(2)写出各芯片的地址范围?
(3)画出各芯片的选择信号图
提高访存速度的措施
单体多字系统
由于程序和数据在存储体内的地址是连续存放的,因此CPU访存取出的信息也是连续的,所以如果在一个存取周期内,从同一个地址当中取出4条指令,再逐条发送到CPU当中执行,就可以达成1/4
个周期里面,主存向CPU发送一条指令,这样就增大了存储器的带宽。
上图所示的是一个**单体四字结构**
的存储器,每字W
位。按地址在一个存取周期内可读出**4*W**
位的指令或数据,使主存带宽提高到4倍。
采用这种办法的前提是:指令和数据在主存内必须是连续存放的,一旦遇到转移指令,或者操作数不能连续存放,这种方法的效果就不明显。
多体并行系统
多体并行系统就是采用多体模块组成的存储器。每个模块有相同的容量和存取速度,各模块各自都有独立的地址寄存器、地址译码器、驱动电路和读写电路,它们能并行工作,又能交叉工作。
高位交叉编址
所谓并行,就是同时访问N个模块,同时启动, 同时读出。
高位交叉编址中,一个存储体存满后,再存入下一个存储体。显然,高位地址可表示体号(n号存储体)。
按这种编址方式,只要合理调动,便可提高存储器的带宽。
例如,当第一个体用以执行程序时,另一个体可用来与外部设备进行直接存储器访问,实现两个体并行工作。
低位交叉编址
在按低位交叉编址的多体模块结构示意中,程序连续存放在相邻体中,显然低位地址用来表示体号,高位地址为体内地址。
多体模块结构的存储器采用交叉编址后,可以在不改变每个模块存取周期的前提下,提高存储器的带宽。
下图示意了四个存储体交叉访问的时间关系,负脉冲为启动每个体的工作信号。虽然对每个体而言,存取周期均未缩短,但由于CPU交叉访问各体,最终在一个存取周期的时间内,实际上向CPU提供了4个存储字。如果每模块存储字长为32位,则在一个存取周期内,存储器向CPU提供了32×4=128位二进制代码。
上图中,单体访存周期的
1/4
就是一个总线传输周期。
假设每个存储体的存储字长和总线的宽度一致,假设低位交叉编址的总模块数量为n,存取周期为T,总线传输周期为τ,那么为了保证最大的工作效率,需要满足**T = nτ**
,这样才可以使得每一个存取周期之后,第一个存储体上一个存取操作已经完成。
对于低位交叉的存储器,连续读取n个字所需要的时间为:
t1 = T + (n-1)τ
对于高位交叉的存储器,连续读取n个字所需要的时间为:
tq = nT
参见
福建师范大学网络教育学院网络课程《计算机组成原理》WEB教程
4.3 高速缓存存储器
为什么需要高速缓存存储器
首先是由于外设的信息容易丢失,而CPU的信息不易丢失,所以外设向主存请求的级别会高于CPU向主存的请求,这样就会导致CPU访存前会空等一段时间,从而降低CPU的工作效率。
所以为了避免CPU和外设争抢访存,就可以在CPU和主存之间增加一层缓存,主存把一些常用的必要的信息先提前先存储到缓存当中,CPU就可以直接从缓存中读取信息无需等待外设。
其次,主存主要是由**动态RAM**
构成,主存的速度远比CPU来的慢,CPU和主存的速度不匹配。
缓存的特点:
- 造价高
- 速度快
- 容量小
据统计CPU的速度平均每年改进60%,而组成主存的动态RAM速度平均每年只改进7%,结果是CPU和动态RAM之间的速度间隙平均每年增大50%。
需要高速缓存的原因主要有两个:
- 避免CPU空等
-
Cache的工作原理
主存由
2n
个可编址的字组成,每个字有惟一的n位地址。
为了与Cache映射,将主存与缓存都分成若干块,每块内又包含若干个字,并使它们的块大小相同(即块内的字数相同)。
这就将主存的地址分成两段:**高m位**
表示主存的块地址,**低b位**
表示块内地址,则2m=M表示主存的块数。
同样缓存的地址也分为两段:**高c位**
表示缓存的块号,**低b位**
表示块内地址,则表示缓存块数, 且c远小于M。
主存与缓存地址中都用b位表示其块内字数,即B=2**b** 反映了块的大小,称B为块长。
简单总结一下: 主存被分为M块,每一块包含若干个字,每次都按照一块一块向Cache中存入
- Cache大小远小于主存,所以必然主存中多个字块对应Cache中一个字块
- 字块的地址分为两部分:前m或者c位用于表示块号,后b位用于表示块的地址
- 主存的块大小和缓存的块大小一致,大小可以通过
2b
表示
由于Cache大小远小于主存,所以CPU访问缓存的时候,所需要的信息不一定就存储在Cache当中:
- 如果Cacha存在所需要的字:直接访问(缓存命中)
- 如果Cacha不存在所需要的字:向主存访问,然后把访问所需要的字所在的字块调入Cache(缓存不命中)
很明显,缓存命中率越高效率就越高,而影响缓存命中效率的因素主要有两个:
- Cache容量
- 字块大小
Cache容量越大,能存储的信息越多,CPU所需要的信息越可能出现在Cache中,自然缓存命中率越高,但是容量大了造价也就高了。
字块大小对命中率的影响并非越大越高,因为缓存大小是固定的。
- 字块过大,字块数量过少,一旦不命中,整个字块被替换,十分影响效率
- 字块过小,导致缓存内部的字十分琐碎,而一般信息读取都是读取地址连续的,所以这样效率也不高
所以字块大小需要折中取。
Cache命中率
命中率的计算如下:
假设一个程序执行期间内,Nc
是访问Cache的总命中次数,Nm
是访存主存的总次数,那么命中率**h**
为:
假设tc
是访问Cache的时间,tm
是访问主存的时间,那么Cache-主存的平均访问时间ta
就是:
访问效率e为:
当h越接近1的时候,访问效率越高。
Cache的基本结构
Cache的基本结构如下图所示:
主要结构由三个:
Cache替换机构
Cache内容已满,无法接受来自主存块的信息时,就由Cache内的替换机构由按一定的替换算法来确定应从Cache内移出哪个块返回主存,而把新的主存块调入Cache。
主存Cache地址映像变换结构
将CPU送来的主存地址转换为Cache地址。
Cache存储体
Cache存储体以块为单位与主存交换信息,为加速Cache与主存之间的调动,主存大多采用多体结构,且Cache访存的优先级最高。
Cache读/写操作
读操作:
如图:
写操作:
- 写直达法
每次同时写入缓存和主存,能随时保证主存与Cache的数据始终一致。但有可能会增加访存次数,因每向Cache写入时,都需向主存写入。
优点:主存与Cache的数据始终一致。
缺点:写入时间长,等于写入主存的时间
- 写回法
数据每次只是暂时写入Cache,并用标志将该块加以注明,直至该块从Cache替换出时,才写入主存。
Cache中所有字块增加一个标志位,如果字块被修改,标记为
**浊**
状态,如果没有,标记为**清**
状态,字块返回的时候,**浊**
状态的字块会写回主存。
Cache的改进
Cache刚出现时,典型系统只有一个缓存,近年来普遍采用多个Cache。
其含义有两方面:
- 一是增加Cache的级数
- 二是将统一的Cache变成分开的Cache。
单一缓存和二级缓存:
单一缓存即在CPU和主存之间只设一个缓存。随着集成电路逻辑密度的提高,又把这个缓存直接与CPU制作在同一个芯片内,故又叫片内缓存。
片内缓存可以提高外部总线的利用率,因为Cache做在芯片内,CPU直接访问Cache不必占用芯片外的总线(外部总线),而且片内缓存与CPU之间的数据通路很短,大大提高了存取速度,外部总线又可更多地支持I/O设备与主存的信息传输,增强了系统的整体效率。
由于片内缓存制在芯片内,其容量不可能很大,所以需要在主存与片内缓存之间,再加一级缓存,叫做片外缓存,而且它是静态RAM组成。
统一缓存和分开缓存:
统一缓存:是指指令和数据都存放在同一缓存内的Cache
分开缓存:是指指令和数据分别存放在两个缓存中,一个叫指令Cache,一个叫数据Cache。
两种缓存的选用主要考虑如下两个因素:
- 主存结构:
- 主存结构统一(指令、数据存在同一主存内):采用统一缓存
- 主存结构不统一(指令、数据不存在同一主存内):采用分开缓存
- 控制方式:
- 不采用超前控制或流水线控制方式:采用统一缓存
- 采用超前控制或流水线控制方式:采用分开缓存
所谓超前控制,就是在一条指令还没有执行完毕的时候,就去执行下一条指令。采用分开缓存是为了避免指令和数据访存冲突。
4.3附 Cache-主存地址映射变换
前面说过,由于Cache容量有限,所以主存多个字块对应Cache一个字块,这个对应规则就是Cache-主存地址映射。
大致有以下三种映射方式:
直接映射操作示意图如下:
每个字块的地址被分为了三个部分:
- 主存字块标记:t位,用于标记字块在主存中的地址
- Cache字块地址:c位,用于标记字块在Cache中的地址
- 字块内地址:b位
直接映射的方式十分简单粗暴,Cache中的位置和主存位置对应的关系为:
i = j mod C
其中j是在主存中的位置,i是在Cache中的位置,C是总共字块的个数,也可以用2c表示。
例如,C = 10 ,主存有100个字块,Cache有10个字块,那么主存中的第1个字块和第11个字块在Cache中的位置都是Cache中的第一个字块。
CPU如果需要获取信息,就需要将对应存储字的地址信息和Cache中的信息比较,这里不需要比较地址所有的位数,而是只需要比较主存字块标记的位数即可,因为只要主存字块标记匹配成功,就表示该存储字存在于Cache当中。如果匹配不成功,就访问主存获取信息,并把相应的字块存入Cache。
当然这里还要考虑一种情况就是初始情况。在缓存的初始状态下,CPU有可能访问到Cache,但此时Cache实际为空,其内容实际没有意义,访问到的数据是无效的。所以这里需要再判断访问的数据是否有效。
优点:实现方式简单
缺点:空间利用率不高,灵活度低,命中率低
主存中每个字块对应Cache的地址都是固定的,所以就算Cache中有很多空闲的字块,主存的字块也只能存入对应的字块当中,不能存入其他空闲字块汇总。
全相连映射
每个主存块都可映象到任何Cache块的地址映象方式称为全相联映象,如图所示。
在全相联映象方式下,主存中存储块的数据可调入Cache中的任意块框架,如果Cache中能容纳程序所需的绝大部分指令和数据,则可达到很高的Cache命中率。
但全相联映象Cache的实现比较复杂。当访问一个块中的数据时,块地址要同时与块表中的所有地址标志进行比较以确定是否命中。在数据块调入时,还存在着一个比较复杂的替换策略问题,即决定将数据块调入Cache中什么位置,将Cache中哪一块数据调出。
上图也可以看到,只有主存地址块标记了。所以CPU直接匹配主存字块标记判断信息是否存在于Cache当中。
优点:空间利用率高,灵活度高,命中率高
缺点:复杂度高,成本高,逻辑电路多
组相连映射
组相联映象指的是将存储空间分成若干组,各组之间是直接映象,而组内各块之间则是全相联映象。
如上图所示,在组相联映象方式下,主存也按Cache的容量分区,每个分区又分成若干个组,每个组包含若干个块,Cache也进行同样的分组。
上图中的r是用于标记一组的个数的,当r=1的时候,一组就有2r = 2个字块 Q表示组的个数 对应一组n个字块的映射又叫做
n路组相连映射
组内是全相联映象,组间则是直接映象。
在组相联映象中,组的个数一般为2的幂次数,组内块的个数也是2的幂次。
主存地址分成四段,高字段是区号;然后是组标志,用于确定组号;第三段是组中的块地址,用于确定组中的块;低字段是块内寻址段。
Cache地址分三段:组号、组内块号和块内地址。组相联方法在判断块命中以及替换算法上都要比全相联方法简单,块冲突的概率比直接映象的低,其命中率也介于直接映象和全相联映象方法之间。
组相联映象相对于直接映象的优越性随Cache容量的增大而下降,分组的效果随着组数的增加而下降。 实践证明,全相联Cache的失效率只比8路组相联Cache的稍微低一点。全相联和组相联地址映象方法尽管可以提高命中率,但随之增加的复杂性和降低的速度也是不容忽视的。 因此,一般在容量小的Cache中可采用组相联映象或全相联映象方法,而在容量大的Cache中则可以采用直接映象的Cache。在速度要求较高的场合采用直接映象,而在速度要求较低的场合采用组相联或全相联映象。
例题
(1)解:
Cache容量4KB = 212字节
,所以地址位数为12位。
一个字块16个字,一个字32位也就是4个字节,那么一个字块大小就是16 * 4 = 64字节
。
Cache中可以容纳字块的数量就是212/26 =26 = 64 个
(2)解:
同上
根据主存容量可知:512KB = 219个字节,地址也就是19位。
主存中可以容纳字块的数量就是219/26 =213 = 8192 个
(3)解:
由(1)可知,Cache包含64个字块,根据公式:
i = j mod C
可以知道C = 64
,i = 5
,那么也就是求j
除以64余数为5的数,j
的范围就是[1,8192]
,所以主存中映射到Cache中第5块的有:
0 + 5,20 64 +5,21 64 +5,….,212 * 64 +5
(4)解:
直接映射地址分配为三块:
- 主存字块标记
- 缓存字块地址
- 字块内地址
首先算字块内地址,从一个字块的大小反推:一个字块大小为64字节 = 26位
,所以字块内地址需要6位。
再计算缓存字块地址,也就是计算缓存字块有多少个,64个 = 26位
,所以缓存字块地址需要6位。
最后剩下的都是缓存字块地址,也就是19 - 6 - 6 = 7位
,主存字块标记需要7位。
替换算法
- 先进先出(FIFO)算法
FIFO算法的原则总是将最先调入Cache的字块替换出来,它不需要随时记录各字块的使用情况,所以容易实现、开销小。
但其缺点是可能把一些需要经常使用的程序(如循环程序)块也作为最早进入Cache的块而被替换出去。
- 近期最少使用(LRU)算法
LRU算法是将近期最少使用的块替换出来。它需要随时记录Cache中各个字块的使用情况,以便确定哪个字块是近期最少使用的字块。
LRU算法的平均命中率比FIFO高,尤其是当分组容量加大时(组相联映象)更能提高LRU算法的命中率。
- 随机法
随机法就是随机的确定被替换的字块,可以采用一个随机数产生器产生一个随机的被替换的块,但不能提高Cache的命中率。
4.4 辅助存储器
辅助存储器的特点
辅助存储器作为主存的后援设备,又称作外部存储器,简称外存,它与主存一起组成了存储器系统的主存-辅存层次。
与主存相比,辅存具有容量大、速度慢、价格低、可脱机保存信息等特点,属“非易失性”存储器。
而主存具有速度快、成本高、容量小等特点,而且大多由半导体芯片构成,所存信息无法永久保存,属“易失性”存储器。
目前,广泛用于计算机系统的辅助存储器有硬磁盘、软磁盘、磁带、光盘等。前三种均属磁表面存储器。
磁表面存储器是在不同形状(如盘状、带状等)的载体上,涂有磁性材料层,工作时,靠载磁体高速运动,由磁头在磁层上进行读写操作,信息被记录在磁层上,这些信息的轨迹就是磁道。磁盘的磁道是一个个同心圆,见下图 (a),磁带的磁道是沿磁带长度方向的直线,见下图(b)。
磁表面存储器的主要技术指标
- 记录密度
记录密度通常是指单位长度内所存储的二进制信息量。
- Dt:记录密度
- p:道距,指相邻两条磁道中心线之间的距离
- 存储容量
外存所能存储的二进制信息总数量,一般以位或字节为单位。
- C:为存储总容量
- n:存放信息的盘面数
- k:每个盘面的磁道数
- s:每条磁道上记录的二进制代码数
- 平均寻址时间
磁盘采取直接存取方式,寻址时间分为两个部分,
其一是磁头寻找目标磁道的找道时间ts
其二是找到磁道后,磁头等待欲读写的磁道区段旋转到磁头下方所需要的等待时间tw
- 数据传输率
数据传输率Dr
是指单位时间内磁表面存储器向主机传送数据的位数或字节数,它与记录密度D
和记录介质的运动速度V
有关:
- 误码率
磁记录原理和记录方式
磁表面存储器通过磁头和记录介质的相对运动完成读写操作。
写入时,记录介质在磁头下方匀速通过,根据写入代码的要求,对写入线圈输入一定方向和大小的电流,使磁头导磁体磁化,产生一定方向和强度的磁场。
由于磁头与磁层表面间距非常小,磁力线直接穿透到磁层表面,将对应磁头下方的微小区域磁化(叫作磁化单元)。可以根据写入驱动电流的不同方向,使磁层表面被磁化的极性方向不同,以区别记录“0”或“1”。