4.1 概述

存储器的分类

按照存储介质分类

存储介质是指能寄存“0”,“1”两种代码并且能够却别两种状态的物质或者元件。

  • 半导体存储器
    • 常见有:TTL(速度高),MOS(集成度高)
    • MOS半导体存储由于制造更简单,价格更便宜,功耗更小,所以被广泛应用
    • 优点:体积小,功耗低,存取时间短
    • 缺点:电源消失的时候,所存储的信息也容易丢失
  • 磁表面存储器
    • 根据磁体的形状可以分为:磁盘,磁带,磁鼓
    • 特点:信息不易丢失
  • 磁芯片存储器
    • 优点:信息不易丢失
    • 缺点:体积大,工艺复杂,功耗大
  • 光盘存储器

    • 优点:信息不易丢失,记录密度高,耐用性好,可靠性高

      按照存取方式分类

  • 存取时间和物理地址无关(随机访问)

    • 随机存储器(RAM):在程序的执行过程中,可以读可以写
    • 只读存储器(ROM):在程序的执行过程中,只可以读
  • 存取时间和物理地址有关(串行访问)
    • 顺序存取存储器:磁带
    • 直接存取存储器:磁盘

      只读存储器并不是不能完全不能写入,只有部分只读存储器是纯读取的,大部分的只读存储器在程序没有执行的过程中可以写入,这一点在后面也会讲到原因。 和物理地址无关是随机访问存储器,有关则是按照存储器的物理地址的顺序进行访问,其中直接存取存储器实际上结合了随机访问和串行访问,具体原因无需了解,知道即可。

按照在计算机中的作用进行分类

第四章:存储器 - 图1
所谓主存,就是需要和CPU直接交换信息的存储器,辅存则是不用直接交换的,一般用于存放当前暂时不用的程序和数据。
两者相比:


主存 辅存
速度
容量
每位价格(位价)

由于CPU的速度又远大于主存的速度,所以在CPU和主存之间又设立了一个缓存,起到缓冲的作用。

存储器的层次结构

存储器的三个重要特性

  • 速度
  • 容量
  • 位价

    下图从上到下: 速度越来越慢 容量越来越大 位价越来越低

第四章:存储器 - 图2

三层结构

存储系统的层次结构主要体现在:缓存-主存主存-辅存这两个存储层次上。

CPU和缓存,主存都可以直接交换信息,缓存能和主存CPU直接交换信息,主存则可以和其他三个交换信息。
缓存-主存层次主要解决CPU和主存速度不匹配的问题。主存会把CPU近期最需要调用的信息存入缓存当中,这样可以提高访存速度。
主存-辅存层次主要解决存储系统容量的问题。辅存当中会存放大量暂时用不到的数据,等到需要用到的时候,通过硬件和操作系统统一调入主存当中,供CPU进行访问。
第四章:存储器 - 图3
在主存-辅存这一个层次的发展当中,又逐渐形成了虚拟存储系统,这个系统当中,编程对应的地址范围和虚拟存储器的地址空间相对应。
这个对应就体现在:例如指令地址码有24位,那么虚拟存储器存储单元个数可以达到224 = 16M个。
但是实际上主存的存储单元个数远远小于16M,虚拟存储器之所以能达到这么大容量,是因为借用了外存(辅存)的存储空间,把当前不需要访问的数据存放在外存(辅存)。

参见:https://blog.csdn.net/weixin_40491661/article/details/121269407

在虚拟存储系统中,存储地址被称为:虚地址或者逻辑地址。在实际主存当中,实际地址被称为:物理地址或者实地址。由于虚拟存储系统实际上是借用了外存,所以当虚地址的内容在主存当中的时候,就直接调用,如果不在主存当中,则先把该内容传递到主存再调用。


4.2 主存储器

概述

主存的基本组成

首先看一下主存的基本组成:

这里可以回顾一下第一章的内容

第四章:存储器 - 图4
相比第一章,增添的驱动器译码器的作用是用于解析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)
  • 存储速度
    • 取决于存取周期和存取时间
    • 存取时间:存储器的访问时间,指:启动一次存储器操作到完成的全部时间
      • 读出时间:从存储器接受到有效地址开始,到产生有效输出的全部时间
      • 写入时间:从存储器接受到有效地址开始,到数据写入被选中单元为止的全部时间
    • 存取周期:存储器连续两次独立的存储器操作所需要最小的时间间隔
      • 一般 存取周期 > 存取时间
  • 存储器带宽:单位时间内存储器存取的信息量

    • 带宽 = 每个存取周期访问的位数/字节数/字数 / 存取周期

      半导体存储芯片简介

      半导体存储芯片的基本结构

      图片源自:https://blog.csdn.net/ChenfengZhang/article/details/108252913
  • 地址线:单向输入,用于输入地址信号,假设有n根

  • 数据线:双向输入输出,用于输入输出数据信号,假设有m根
  • 片选线:用于选择存储芯片,也就说说当片选线信号有效的时候,该芯片被激活工作
  • 读写控制线:控制芯片的是读操作还是写操作
    • 如果是一根读写线,那么用高低电平区分操作是读操作还是写操作
    • 如果是两根读写线,那么一根用于读,一根用于写
  • 芯片(存储)容量:容量 = 2n m(容量 = 地址数量 一次操作的数据位数)

例如:地址线10根,数据线4根,那么芯片容量为 1k * 4位

存储芯片片选线的作用

背景如下:
芯片的容量16K * 1位,现在组成64K * 8位存储体
芯片一次性只能输出一位,而存储体要求一次操作输出8位,所以需要八个芯片一同做输出。
满足了一次性操作的数据位数之后,再满足地址个数,所以需要64/16 = 4组芯片,每组有8个芯片。
存储体的组成如下图所示:
图片源自:https://blog.csdn.net/ChenfengZhang/article/details/108252913
一次操作,片选线同时控制8片芯片同时工作做输入输出。

半导体存储芯片的译码驱动方式

驱动方式有两种:

  • 线选法
  • 重合法

    线选法

    图片源自:https://blog.csdn.net/ChenfengZhang/article/details/108254811
    线选法就是用一根字选择线(字线)直接选中一个存储单元的各位
    例如上图中,当四根地址线都是0的时候,表示选中第(0000)2 = (0)10根字线上的8个。
    存储器的大小就是 16 * 8位
    很明显,如果地址线很多,这种方式就不适合做译码驱动。

    这里: 矩阵行数 = 2地址线根数 矩阵列数 = 读写线/位线 根数

重合法

图片源自:https://blog.csdn.net/ChenfengZhang/article/details/108254811
重合法就是使用两跟字线交叉点决定选中的存储单元的位。
例如上图中,所有地执线均为0,那么就选中第0行的第0列。
这里存储器的大小就是1K * 1位

这里读写线只有一位,如果需要构成一个1K * 1字节的存储器, 。

随机存取存储器 SRAM

静态RAM的基本单元电路

在存储器中,用于寄存0和1的电路成为存储器的基本单元电路,以下这张图就是一个基本单元电路
image.png

  • TnMOS管
  • T1 - T4:由MOS管组成的触发器基本电路,也是实际二进制信息存储的地方
  • T5、T6:由行地址选择信号控制,相当于一个开关
  • T1 - T6:基本单元电路
  • T7、T8:由行地址选择信号控制,不在基本单元电路内,由多个基本单元电路共享

静态RAM通过触发器原理来存储信息(触发器保持有电状态记录为1 ,反之为0)。信息读出之后,会仍然保持原状态,但是电源一旦掉电,原存信息就会丢失。
如果触发器的信号是1,那么在A点为高电平,A’为低电平
读操作:
image.png
如果想要读取触发器的信息,就需要使得行信号列信号以及读选择信号均有效,使得电路导通,通过读出放大器放大信号,即可获得触发器的信息。

写操作:
image.png
在做写入的时候,写选择线信号有效,加入DIN写入的是1,那么经过两个写放大器,使两端的输出为相反的电平(01,左边为0,右边为1),同时行信号列信号均有效,那么**A'**为低电平,**A**为高电平,这样就代表写入了1信息。

静态RAM 的读/写时序

这个不重要,浅看一下链接即可:
SRAM DRAM时序分析_德林恩宝的博客-CSDN博客_sram时序

动态存取存储器 DRAM

动态RAM的基本单元电路

动态RAM的基本单元电路有两种:

  • 三管式(左图)
  • 单管式(右图)

image.png
两者的共同特点就是都依赖于电容(C)存放信息,当电容有足够多的电荷的时候就表示存储信息1,反之存储0。由于电容上的电荷维持时间很短,一般维持1-2ms,所以需要每2ms恢复一次电容状态,这个过程叫做刷新,相比静态RAM,有集成度高功耗低的特点。

针对三管式:

  • 读操作
  1. T4会先进行预充电,使得T4导通
  2. 读数据线信号有效,使得T2导通
  3. 判断电容的Cg信息
    1. 如果为1,则T1导通,一路导通接地,读数据线的电平就降为低电平,读出的实际信号为**0**
    2. 如果为0,则T1不导通,读数据线的电平不变,为T4的高电平,读出的实际信号为**1**
  • 写操作
  1. 写信号有效,使得T3导通
  2. 写数据线如果写入1,则表示高电平,于是给电容充电,电容存储的实际信号为**1**
  3. 写数据线如果写入0,则表示低电平,于是给电容放电,电容存储的实际信号为**0**

总结就是:

  • 读出的信息与原存信息相反
  • 写入的信息和输入的信息相同

针对单管式:

  • 读操作
  1. 字线上位高电平,T导通
  2. 判断电容的Cs信息
    1. 如果为1,数据线上有电流,读出的实际信号为**1**
    2. 如果为0,数据线上无电流,读出的实际信号为**0**
  • 写操作
  1. 字线上位高电平,T导通
  2. 写入1,对Cs充电,实际存储的信号为1,反之为0

    相比三管,单管的优势就是集成度更高。

三管动态RAM芯片

以写操作为例,解释一下三管动态RAM的运作。

跟前面一样,没啥好讲的,看看图吧。

image.png

单管动态RAM

这里的图比较特殊。
首先是输入和输出数据线,这里看似有两根(DIN和DOUT),实际上是一根,所以一次操作传输的位数是1位。其次可以看到这里的行译码被分成了两块,阵列的大小都是**64*128**(原图没有给出,这里补充一下),实际上两个合在一起就是一个128 * 128的矩阵,也就是27 * 27,说明至少需要14根地址线,而图上只有A0-A6七根地址线,原因是这里采用了分时复用的方法,行列分时复用这七根地址线。
image.png
不难看出这里就是一个16K * 1位大小的存储芯片。

16K = 27 * 27

参照

以上两个小结的图片均源自:
计算机组成原理笔记——随机存取存储器_Time like water的博客-CSDN博客
计算机组成原理动态RAMChenfengZhang的博客-CSDN博客动态ram基本电路

动态RAM的刷新

  1. 动态RAM的刷新一般2ms一次
  2. 刷新的方式是针对存储矩阵逐行刷新
  3. 每一行的刷新时间 = 存取周期

动态刷新三种方式:

  • 集中刷新
  • 分散刷新
  • 异步刷新

下面都假设:存储矩阵为128 * 128。也就是有128行需要刷新,存取周期0.5μs

集中刷新

所谓集中刷新,就是在2ms这个刷新间隔里面,集中一个时间把128行全部刷新一遍。如下图所示,那么刷新总时间为128 0.5 = 64 μs。
每一行距离下次刷新的时间仍然是*2ms

image.png
在刷新期间,存储单元不能做读写操作,这段时间被称为“死时间”或者“死区”。
死时间率 = 死区占有时间 / 总刷新时间。
所以这样的弊端很明显:死时间很长,这段时间内无法做读写。

分散刷新

分散刷新就是每有一行做完读/写之后就立马紧随其后做一次刷新
每一行距离下次刷新的时间就是 128 0.5 =* 64 μs
image.png
这样做的好处是没有死时间,但是这样存取周期变相延长了一倍,会使得整个系统的速度降低。

异步刷新

异步刷新就是集中刷新和分散刷新的结合,简单的来说就是将2ms的刷新时间进行均分,如果是128行,那么就每2000 / 128 = 15.6 μs刷新一行。
每一行距离下次刷新的时间仍然是2ms
image.png
这样就既没有死时间,同时还提高了工作效率。

动态RAM和静态RAM的对比


DRAM SRAM
存储原理 电容 触发器
集成度
芯片引脚
功耗
价格
速度
刷新

一般情况下,动态RAM的应用比静态RAM广。

参见

本小节参见:
动态RAM刷新及动态RAM和静态RAM的比较你的代码没bug的博客-CSDN博客动态ram

只读存储器

掩模ROM

掩模ROM是一种纯只可读的存储器,也就是说无论程序是否在执行过程中,都只能读不能写,大致结构如下:
第四章:存储器 - 图18
可以看到这种ROM采用的是重合的方式进行译码驱动,判断信息的方式就是判断在两根交叉的地址线上是否存在MOS管,如果存在,则表示**0**,如果不存在,表示**1**

为什么存在是0,是因为MOS管旁边会接地,存在MOS管导通之后,电平接地为变为0。

但是在最后输出的时候,通过读放大器,信号会反向输出,所以输出的结果1还是1,0还是0。
所以这种ROM一单制作完成,做不了有任何的修改

PROM

PROM是一种只可以实现一次性编程的只读存储器,由一个双极型电路和熔丝构成:
image.png
判断信息的方式是熔丝是否断裂,如果没有断裂,则表示为1,如果断裂了,则为0
如果想要对信息进行修改,就加一个电流,让熔丝烧断即可。

EPROM

EPROM是一种可擦除,可编程的只读存储器,结构如下:
image.png
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的连接

    存储容量的扩展

    为什么需要拓展?
    因为单片存储芯片的容量有限,需要将若干的存储芯片连接在一起才能组成足够容量的存储器。
    扩展方式通常有以下三种:
  1. 位扩展

位扩展是指增加存储字长(扩展存储字长的位数),比如使用两片1K*4位存储芯片组成一个1K*8位存储器
具体的链接方式如下:
image.png
其中:

  • A:表示地址信号线
  • D:表示数据线
  • CS:片选信号线
  • WE:读写线
  • 22141K*4位存储芯片

扩展了字长,说明需要一次性读写**8位**,而一个2114芯片只能一次性读写**4位**,所以需要把**8根**数据线,平均分给两个芯片,一片分到D4-D7四个高位数据线,另一片分到D0-D3四个低位数据线。
同时CS线需要同时连接两个芯片,当CS有效的时候,就可以同时选中两个芯片进行读写。
地址信号线正好10根,对应1K,两个芯片共享即可。
WE正常全员共享即可。

  1. 字扩展

字扩展是指增加存储器字的数量,比如使用两片1K*8位存储芯片组成一个2K*8位存储器
具体的链接方式如下:
image.png
由于一次性读取的位数是8位,而芯片的位数也是8位,所以不需要同时读取两个芯片,只需要将数据分别存储在两个存储芯片当中即可。
一个存储芯片只需要10根地址线即可,那么剩下的1根A10就作为片选线CS
上图中:
当片A100的时候,CS0有效,CS1无效,此时第一个芯片被选中读写。
当片A101的时候,CS1有效,CS0无效,此时第二个芯片被选中读写。
所以字扩展的关键就是:片选信号的形成。

首先CS在低电平(0)有效。 其次第二个芯片与A10的连接线路上有一个非门(就是红框的1),所以信号会取反。

这样就保证了两个芯片的组合且互不干扰。

  1. 字-位扩展

字-位扩展就很明显,在增长存储字长的同时还增加存储字的数量:
image.png
4K * 8位存储器就说明了:

  • 一次性需要读写2片芯片
  • 需要4组芯片才能满足存储字的数量

注意:先做位扩展,再做字扩展
普通片选线CS只能有0和1两种信号,所以这里把多于的**2根**地址线经过片选译码器得到了四种信号,正好对应了四组芯片

存储器和CPU的连接

  1. 地址线的连接
    1. 通常CPU的地址线比存储器的数据线要多
    2. CPU地址线的低位和存储器的地址线相连
    3. CPU地址线的高位在扩充时候作用,或者做其他作用,比如用做片选信号线
  2. 数据线的连接
    1. 对于存储器的扩位连接CPU和存储器
  3. 读写命令线的连接
    1. 高电平为读,低电平为写
    2. 如果CPU的读写线是分类的,那么读/写命令线应该和存储芯片内相应的控制端相连
  4. 片选线的连线
    1. 片选信号和MREQ有关,当MREQ为低电平的时候,片选信号有效,CPU要求访存;当MREQ为高电平的时候,I/O有效,CPU要求输入输出。
    2. 如果CPU的地址线多于存储器的地址线,那么一般高位的地址线作为片选信号线,和访存控制信号共同控制片选信号。
  5. 合理选择存储芯片
    1. ROM:主要用于存放系统程序
    2. RAM:主要用于存放用户程序
    3. 芯片数量尽量少
    4. 优先采取位扩展

      例题

      image.png
      首先解释一下图中的几个器件和概念的作用:
  • 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表示

接下来就是步骤解析:
第一步:确定各个存储器的容量
image.png
首先所有十六进制数转为二进制,首尾相减再加一即可得出存储地址的范围

例如这里的:(67FF - 6000 + 1)16 = (2K)2 8位是因为通常按照字节编址,一字节等于8位。 所以系统程序区就是2K * 8位

第二步:选择存储芯片
选择原则就是上一小节的第五点
以系统程序区为例,就是选择**1****2K*8位****ROM存储芯片**
用户程序区就是选择**2****1K*4位****RAM存储芯片**
第三步:分配CPU的地址线
先看完整图:
image.png
分配存储器的地址线数据线

  • ROM2K * 8位,一片,所以需要11根地址线,对应A0-A108根数据线,对应D0-D7
  • RAM1K * 4位,两片,需要10根地址线,对应A0-A94根数据线,分别对应D0-D3D4-D7

image.png
第四步:片选信号线的形成
首先连接译码器三个控制端,从地址线的高位开始选择。
image.png
由于A15A14分别恒为01,正好对应的是G2的低电平,和G1的高电平,G2需要两根线,而MREQ低电平有效,所以可以接入G2
接着接入三个输出端,往下就是A13-A11对应ABC,观察此处的取值:
image.png
系统程序区域A13-A11就是100,也就是Y4有效,选中1片ROM;
用户程序区域A13-A11就是101,也就是Y5有效,选中2片RAM;
所以Y4连接ROM,Y5连接RAM。
但如果Y5直接连接RAM是有问题的,因为当A13-A11101的部分,也包含了用户程序区后面的区域
比如地址6C00,对应二进制就是0 1 1 0 |1 1 0 0 | 0 0 0 0 | 0 0 0 0,很明显,这个区域不属于用于程序区域,也就是当A10为低电平(0)的时候,才属于用户程序区,所以这里需用通过**Y****5****A****10**一同控制RAM的片选信号
image.png
那么当Y5A10都是0的时候,怎么选择门电路使得最后输出的信号也是低电平0呢?这里三个门电路依次使用以下就知道是非与非门,相当于**或门**
最后再补充一些细节:

  • 所有芯片直接接入WR
  • ROM只读不写,所以ROM需要接地,也就是连接PD/Progr

    为什么接地?因为读信号是高电平1,写信号是低电平0,接地所有信号都为0,也就不能读了。

参见

本小节图片参见:
计算机组成原理——存储器容量扩展(字扩展、位扩展、字位扩展)Selcouther的博客-CSDN博客字扩展
计算机组成原理7-主存储器—存储器与CPU的连接_swadian2008的博客-CSDN博客

例题拓展

两道题网上找不到,就等PPT下来了再写,直接看书上P95-P99

  1. 某机CPU可寻址的最大存储空间为64KB,存储器按字节编址,CPU的数据总线宽度为8位。目前系统中使用的存储器容量为8KB,其中:4KBROM,拟采用2K*8ROM芯片,其地址范围为0000H-0FFFH,4KBRAM,拟采用4K*2RAM芯片,其地址范围为4000H-4FFFH,
  2. (1)需RAMROM芯片各多少片?
  3. (2)写出各芯片的地址范围?
  4. (3)画出各芯片的选择信号图

题目答案:
第四章:存储器 - 图31

提高访存速度的措施

单体多字系统

由于程序和数据在存储体内的地址是连续存放的,因此CPU访存取出的信息也是连续的,所以如果在一个存取周期内,从同一个地址当中取出4条指令,再逐条发送到CPU当中执行,就可以达成1/4个周期里面,主存向CPU发送一条指令,这样就增大了存储器的带宽。
第四章:存储器 - 图32
上图所示的是一个**单体四字结构**的存储器,每字W位。按地址在一个存取周期内可读出**4*W**位的指令或数据,使主存带宽提高到4倍。
采用这种办法的前提是:指令和数据在主存内必须是连续存放的,一旦遇到转移指令,或者操作数不能连续存放,这种方法的效果就不明显。

多体并行系统

多体并行系统就是采用多体模块组成的存储器。每个模块有相同的容量和存取速度,各模块各自都有独立的地址寄存器、地址译码器、驱动电路和读写电路,它们能并行工作,又能交叉工作
高位交叉编址
高位交叉编址
所谓并行,就是同时访问N个模块,同时启动, 同时读出。
高位交叉编址中,一个存储体存满后,再存入下一个存储体。显然,高位地址可表示体号(n号存储体)。
按这种编址方式,只要合理调动,便可提高存储器的带宽。

例如,当第一个体用以执行程序时,另一个体可用来与外部设备进行直接存储器访问,实现两个体并行工作。

低位交叉编址
低位交叉编址
在按低位交叉编址的多体模块结构示意中,程序连续存放在相邻体中,显然低位地址用来表示体号高位地址体内地址
多体模块结构的存储器采用交叉编址后,可以在不改变每个模块存取周期的前提下,提高存储器的带宽。
下图示意了四个存储体交叉访问的时间关系,负脉冲为启动每个体的工作信号。虽然对每个体而言,存取周期均未缩短,但由于CPU交叉访问各体,最终在一个存取周期的时间内,实际上向CPU提供了4个存储字。如果每模块存储字长为32位,则在一个存取周期内,存储器向CPU提供了32×4=128位二进制代码。
第四章:存储器 - 图35

上图中,单体访存周期的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空等
  • 解决CPU和主存速度不匹配的问题

    Cache的工作原理

    主存由2n个可编址的字组成,每个字有惟一的n位地址。
    为了与Cache映射,将主存与缓存都分成若干块,每块内又包含若干个字,并使它们的块大小相同(即块内的字数相同)。
    这就将主存的地址分成两段:**高m位**表示主存的块地址, **低b位**表示块内地址,则2m=M表示主存的块数。
    同样缓存的地址也分为两段:**高c位**表示缓存的块号,**低b位**表示块内地址,则表示缓存块数, 且c远小于M。
    主存与缓存地址中都用b位表示其块内字数,即B=2**b** 反映了块的大小,称B为块长。
    第四章:存储器 - 图36
    简单总结一下:

  • 主存被分为M块,每一块包含若干个字,每次都按照一块一块向Cache中存入

  • Cache大小远小于主存,所以必然主存中多个字块对应Cache中一个字块
  • 字块的地址分为两部分:前m或者c位用于表示块号,后b位用于表示块的地址
  • 主存的块大小和缓存的块大小一致,大小可以通过2b表示

由于Cache大小远小于主存,所以CPU访问缓存的时候,所需要的信息不一定就存储在Cache当中:

  • 如果Cacha存在所需要的字:直接访问(缓存命中
  • 如果Cacha不存在所需要的字:向主存访问,然后把访问所需要的字所在的字块调入Cache(缓存不命中

很明显,缓存命中率越高效率就越高,而影响缓存命中效率的因素主要有两个:

  • Cache容量
  • 字块大小

Cache容量越大,能存储的信息越多,CPU所需要的信息越可能出现在Cache中,自然缓存命中率越高,但是容量大了造价也就高了。
字块大小对命中率的影响并非越大越高,因为缓存大小是固定的。

  • 字块过大,字块数量过少,一旦不命中,整个字块被替换,十分影响效率
  • 字块过小,导致缓存内部的字十分琐碎,而一般信息读取都是读取地址连续的,所以这样效率也不高

所以字块大小需要折中取

Cache命中率

命中率的计算如下:
假设一个程序执行期间内,Nc是访问Cache的总命中次数Nm是访存主存的总次数,那么命中率**h**为:
第四章:存储器 - 图37
假设tc是访问Cache的时间,tm是访问主存的时间,那么Cache-主存的平均访问时间ta就是:
第四章:存储器 - 图38
访问效率e为:
第四章:存储器 - 图39

当h越接近1的时候,访问效率越高。

Cache的基本结构

Cache的基本结构如下图所示:
第四章:存储器 - 图40
主要结构由三个:

  • Cache替换机构

    Cache内容已满,无法接受来自主存块的信息时,就由Cache内的替换机构由按一定的替换算法来确定应从Cache内移出哪个块返回主存,而把新的主存块调入Cache。

  • 主存Cache地址映像变换结构

    将CPU送来的主存地址转换为Cache地址。

  • Cache存储体

    Cache存储体以块为单位与主存交换信息,为加速Cache与主存之间的调动,主存大多采用多体结构,且Cache访存的优先级最高。

Cache读/写操作

读操作
如图:
第四章:存储器 - 图41
写操作

  1. 写直达法

每次同时写入缓存和主存,能随时保证主存与Cache的数据始终一致。但有可能会增加访存次数,因每向Cache写入时,都需向主存写入。
优点:主存与Cache的数据始终一致。
缺点:写入时间长,等于写入主存的时间

  1. 写回法

数据每次只是暂时写入Cache,并用标志将该块加以注明,直至该块从Cache替换出时,才写入主存。

Cache中所有字块增加一个标志位,如果字块被修改,标记为**浊**状态,如果没有,标记为**清**状态,字块返回的时候,**浊**状态的字块会写回主存

优点:速度快
缺点:信息可能失效,增加了Cache的复杂性

Cache的改进

Cache刚出现时,典型系统只有一个缓存,近年来普遍采用多个Cache。
其含义有两方面:

  • 一是增加Cache的级数
  • 二是将统一的Cache变成分开的Cache。

单一缓存和二级缓存:
单一缓存即在CPU和主存之间只设一个缓存。随着集成电路逻辑密度的提高,又把这个缓存直接与CPU制作在同一个芯片内,故又叫片内缓存
片内缓存可以提高外部总线的利用率,因为Cache做在芯片内,CPU直接访问Cache不必占用芯片外的总线(外部总线),而且片内缓存与CPU之间的数据通路很短,大大提高了存取速度,外部总线又可更多地支持I/O设备与主存的信息传输,增强了系统的整体效率。
由于片内缓存制在芯片内,其容量不可能很大,所以需要在主存与片内缓存之间,再加一级缓存,叫做片外缓存,而且它是静态RAM组成。

统一缓存和分开缓存:
统一缓存:是指指令和数据都存放在同一缓存内的Cache
分开缓存:是指指令和数据分别存放在两个缓存中,一个叫指令Cache,一个叫数据Cache
两种缓存的选用主要考虑如下两个因素:

  1. 主存结构
    1. 主存结构统一(指令、数据存在同一主存内):采用统一缓存
    2. 主存结构不统一(指令、数据不存在同一主存内):采用分开缓存
  2. 控制方式
    1. 不采用超前控制或流水线控制方式:采用统一缓存
    2. 采用超前控制或流水线控制方式:采用分开缓存

      所谓超前控制,就是在一条指令还没有执行完毕的时候,就去执行下一条指令。采用分开缓存是为了避免指令和数据访存冲突

4.3附 Cache-主存地址映射变换

前面说过,由于Cache容量有限,所以主存多个字块对应Cache一个字块,这个对应规则就是Cache-主存地址映射。
大致有以下三种映射方式:

  • 直接映射
  • 全相连映射
  • 组相连映射

    直接映射

    在直接映象方式下,主存中存储块的数据只可调入Cache中的一个位置。

    也就是主存中每个字块在Cache中的字块位置是固定的

直接映射操作示意图如下:
image.png
每个字块的地址被分为了三个部分:

  • 主存字块标记: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块的地址映象方式称为全相联映象,如图所示。
image.png
在全相联映象方式下,主存中存储块的数据可调入Cache中的任意块框架,如果Cache中能容纳程序所需的绝大部分指令和数据,则可达到很高的Cache命中率。
但全相联映象Cache的实现比较复杂。当访问一个块中的数据时,块地址要同时与块表中的所有地址标志进行比较以确定是否命中。在数据块调入时,还存在着一个比较复杂的替换策略问题,即决定将数据块调入Cache中什么位置,将Cache中哪一块数据调出。

上图也可以看到,只有主存地址块标记了。所以CPU直接匹配主存字块标记判断信息是否存在于Cache当中。

优点:空间利用率高,灵活度高,命中率高
缺点:复杂度高,成本高,逻辑电路多

组相连映射

组相联映象指的是将存储空间分成若干组,各组之间是直接映象,而组内各块之间则是全相联映象
image.png
如上图所示,在组相联映象方式下,主存也按Cache的容量分区,每个分区又分成若干个组,每个组包含若干个块,Cache也进行同样的分组。

上图中的r是用于标记一组的个数的,当r=1的时候,一组就有2r = 2个字块 Q表示组的个数 对应一组n个字块的映射又叫做 n路组相连映射

组内是全相联映象,组间则是直接映象
  在组相联映象中,组的个数一般为2的幂次数,组内块的个数也是2的幂次
主存地址分成四段,高字段是区号;然后是组标志,用于确定组号;第三段是组中的块地址,用于确定组中的块;低字段是块内寻址段。
Cache地址分三段:组号、组内块号和块内地址。组相联方法在判断块命中以及替换算法上都要比全相联方法简单,块冲突的概率比直接映象的低,其命中率也介于直接映象和全相联映象方法之间。

组相联映象相对于直接映象的优越性随Cache容量的增大而下降分组的效果随着组数的增加而下降。 实践证明,全相联Cache的失效率只比8路组相联Cache的稍微低一点。全相联和组相联地址映象方法尽管可以提高命中率,但随之增加的复杂性和降低的速度也是不容忽视的。 因此,一般在容量小的Cache中可采用组相联映象或全相联映象方法,而在容量大的Cache中则可以采用直接映象的Cache。在速度要求较高的场合采用直接映象,而在速度要求较低的场合采用组相联或全相联映象。

例题

image.png
(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 = 64i = 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位
image.png

替换算法

  1. 先进先出(FIFO)算法

  FIFO算法的原则总是将最先调入Cache的字块替换出来,它不需要随时记录各字块的使用情况,所以容易实现、开销小。
但其缺点是可能把一些需要经常使用的程序(如循环程序)块也作为最早进入Cache的块而被替换出去。

  1. 近期最少使用(LRU)算法

  LRU算法是将近期最少使用的块替换出来。它需要随时记录Cache中各个字块的使用情况,以便确定哪个字块是近期最少使用的字块。
LRU算法的平均命中率比FIFO高,尤其是当分组容量加大时(组相联映象)更能提高LRU算法的命中率。

  1. 随机法

随机法就是随机的确定被替换的字块,可以采用一个随机数产生器产生一个随机的被替换的块,但不能提高Cache的命中率。

4.4 辅助存储器

辅助存储器的特点

辅助存储器作为主存的后援设备,又称作外部存储器,简称外存,它与主存一起组成了存储器系统的主存-辅存层次。
与主存相比,辅存具有容量大、速度慢、价格低、可脱机保存信息等特点,属“非易失性”存储器。
而主存具有速度快、成本高、容量小等特点,而且大多由半导体芯片构成,所存信息无法永久保存,属“易失性”存储器。
目前,广泛用于计算机系统的辅助存储器有硬磁盘、软磁盘、磁带、光盘等。前三种均属磁表面存储器
磁表面存储器是在不同形状(如盘状、带状等)的载体上,涂有磁性材料层,工作时,靠载磁体高速运动,由磁头在磁层上进行读写操作,信息被记录在磁层上,这些信息的轨迹就是磁道。磁盘的磁道是一个个同心圆,见下图 (a),磁带的磁道是沿磁带长度方向的直线,见下图(b)。
image.png

磁表面存储器的主要技术指标

  1. 记录密度

记录密度通常是指单位长度内所存储的二进制信息量。
第四章:存储器 - 图48

  • Dt:记录密度
  • p:道距,指相邻两条磁道中心线之间的距离
  1. 存储容量

外存所能存储的二进制信息总数量,一般以位或字节为单位。
第四章:存储器 - 图49

  • C:为存储总容量
  • n:存放信息的盘面数
  • k:每个盘面的磁道数
  • s:每条磁道上记录的二进制代码数
  1. 平均寻址时间

磁盘采取直接存取方式,寻址时间分为两个部分,
其一是磁头寻找目标磁道的找道时间ts
其二是找到磁道后,磁头等待欲读写的磁道区段旋转到磁头下方所需要的等待时间tw

  1. 数据传输率

数据传输率Dr是指单位时间内磁表面存储器向主机传送数据的位数或字节数,它与记录密度D和记录介质的运动速度V有关:
第四章:存储器 - 图50

  1. 误码率

衡量磁表面存储器出错概率的参数。

磁记录原理和记录方式

磁表面存储器通过磁头和记录介质的相对运动完成读写操作。
写入时,记录介质在磁头下方匀速通过,根据写入代码的要求,对写入线圈输入一定方向和大小的电流,使磁头导磁体磁化,产生一定方向和强度的磁场。
由于磁头与磁层表面间距非常小,磁力线直接穿透到磁层表面,将对应磁头下方的微小区域磁化(叫作磁化单元)。可以根据写入驱动电流的不同方向,使磁层表面被磁化的极性方向不同,以区别记录“0”或“1”。