按不同分类标准可作不同的分类。
按存储介质不同可分为半导体存储器(易失或非易失)、磁表面存储器(非易失)、磁芯存储器(非易失)和光盘存储器(非易失)。
按存取方式不同可把存储器分为:
随机存储器(Random Access Memory, RAM):在程序执行过程中可读可写,而且存取时间与存储单元的物理位置无关。计算机中的主存都采用了这种随机存储器。
由于历史原因,首先存取时间与物理地址无关的存储器都称为“随机存储器”,而后来“随机存储器”被分成了两类,一类还是叫做随机存储器(即 RAM),另一类是只读存储器(ROM)。
根据存储信息原理的不同,RAM 又分为静态 RAM(以触发器原理存储信息)和动态 RAM(以电容充放电原理存储信息)。
只读存储器(Read Only Memory, ROM):在程序的执行过程中只读。通常用它存放固定不变的程序、常数等,它与 RAM 可共同作为主存的一部分,统一构成主存的地址域。
早期的 ROM 采用掩模工艺,把原始信息记录在芯片中且无法修改,称为掩模型只读存储器(Mask ROM, MROM);随着半导体技术的发展,出现了可编程只读存储器(Programmable ROM, PROM)、可擦除可编程只读存储器(Erasable PROM, EPROM)和用电可擦除可编程只读存储器(Electrically EPROM, EEPROM)。
按在计算机中的作用不同,存储器主要分为主存储器、辅助存储器、缓冲存储器。主存的主要特点是它可以和 CPU 直接交换信息;辅存是主存的后援存储器,用来存放当前暂时不用的程序和数据,它不能与 CPU 直接交换信息;缓冲存储器(简称缓存)用在两个速度不同的部件之中,例如,CPU 与主存之间可设置一个高速缓存,起到缓冲作用。
为了达到用户对存储器速度、容量、价格的要求,任何一种单一类型的存储器都做不到,解决方法便是采用下面这种层次结构构成的存储体系,将各种存储介质不同的存储器以软硬件相结合的方式构成统一整体,满足用户对存储器速度快、容量大、价格低的要求。
实际上,存储系统层次结构主要体现在缓存 - 主存、主存 - 辅存这两个存储层次上,如下图所示。CPU 和缓存、主存都能直接交换信息;缓存能直接和主存、CPU交换信息;主存可以和 CPU、缓存、辅存交换信息。
主存储器(简称主存或内存)包括存储体、各种逻辑部件及控制电路等。
存储体由存储单元组成,存储单元是多个存储元件的集合,存储单元是 CPU 访问存储器的基本单位,每个存储单元有一个地址。每个存储单元可存储一串二进制代码,称这串二进制代码为一个存储字,这串二进制代码的位数为存储字长。
存放一个机器字的存储单元,通常称为字存储单元,相应的单元地址叫字地址。而存放一个字节的单元,称为字节存储单元,相应的地址称为字节地址。
现代计算机主存的编址单位为字节,每个字节都有一个地址,即地址总线的位数体现了主存中的字节数(“地址总线体现了存储单元的个数”这句话也是对的,这里的存储单元指的是字节存储单元)。而一般我们所说的存储单元都是指的字存储单元,每个字存储单元包含了若干个可独立寻址的字节。
而且通常计算机既可按字寻址,又可按字节寻址(有的还可按半字、双字来寻址,但编址的最小单位一般都是字节)。对每一个字节进行编址的 24 位地址线的主存而言:按字节寻址的范围是 16M;若字长为 16 位,按字寻址的范围为 8MW;若字长为 32 位,按字寻址的范围为 4MW。例如 IBM 370 机的字长(机器字长和存储字长)为 32 位,它可按字节寻址,即它的每一个存储单元包含 4 个可独立寻址的字节,其字地址是用该字高位字节的地址来表示,故其字地址是 4 的整数倍,正好用地址码的末两位来区分同一字的 4 个字节的位置。
为了能实现按地址访问的方式,主存中还必须配置两个寄存器 MAR 和 MDR:
假设机器的存储字长为 32 位,且可按字节寻址,即每一个存储字包括 4 个可独立寻址的字节。举个例子,十六进制数 12345678H
在一个存储单元中可有两种存储方式——大端方式和小端方式:
现代计算机的主存由半导体集成电路构成,图中的驱动器、译码器和读写电路制作在主存中,而 MAR 和 MDR 制作在 CPU 芯片内。主存和 CPU 通过总线连接。
❀ 当要从存储器读出某一信息字时,首先由 CPU 将该字的地址送到 MAR,经地址总线送至主存,然后发出读命令。主存接到读命令后,将该地址单元的内容读出,便完成读操作,将该单元的内容读至数据总线上,至于该内容由 MDR 送至什么地方,这不是主存需要关心的,由 CPU 决定。
❀ 当要想主存写入一个信息字时,首先 CPU 将该字所在的主存单元的地址经 MAR 送到地址总线,并将信息字送入 MDR,然后向主存发出写命令。主存接到写命令后,便将数据线上的信息写入到对应地址线指出的主存单元中。
存储元件由半导体器件组成的存储器称为半导体存储器。现代半导体存储器都用超大规模集成电路工艺制成芯片,其优点是体积小、功耗低、存取时间短。
RAM 和 ROM 都属于半导体存储器,ROM 在系统停止供电的时候仍然可以保持数据,而 RAM 通常都是在掉电之后就丢失数据,所以 RAM 是易失性半导体存储器,ROM 是非易失性半导体存储器。
半导体存储器又可按其材料的不同,分为双极型(TTL)半导体存储器和 MOS 半导体存储器。前者具有高速的特点;后者具有高集成度的特点,而且制造简单,成本低廉,功耗小,故 MOS 半导体存储器被广泛使用。
半导体存储芯片采用超大规模集成电路制造工艺,在一个芯片内集成具有记忆功能的存储矩阵、译码驱动电路和读/写电路等。
① 译码驱动能把地址总线送来的地址信号翻译成对应存储单元的选择信号,该信号在读/写电路的配合下完成对被选中单元的读/写操作。
② 读写电路包括读出放大器和写入电路,用来完成读/写操作。
存储芯片通过地址总线(单向)、数据总线(双向)和控制总线与外部连接,控制总线主要有读/写控制线与片选线两种,读/写控制线决定芯片进行读/写操作,片选线用来选择存储芯片。由于半导体存储器是由许多芯片组成的,为此需用片选信号来确定哪个芯片被选中。例如,一个 64K * 8 位的存储器可由 32 片 16K * 1 位的存储芯片组成,如下图所示。但每次读出一个存储字时,只需选中 8 片。
半导体存储芯片的译码驱动方式有两种:线选法和重合法。
(1)线选法
上图是一个 16 * 8 位线选法存储芯片的结构示意图,它的特点是利用一根字线直接选中一个存储单元的各位。这种方式只适于容量不大的存储芯片,如 1K * 8 位线选法存储芯片,有 10 根地址线接入地址译码器,输出 1K 条字线,每给出一个地址,1K 条线中只有一条是有效的。
(2)重合法
上图是一个 1K * 1 位重合法存储芯片的结构示意图,由于被选单元是由 X、Y 两个方向的地址决定的,故称为重合法。显然只需要用 64 根选择线,便可选择 32 * 32 矩阵中的任一位。例如,当地址线位全 0 时,译码输出 X 0 X_0 X0 和 Y 0 Y_0 Y0 有效,矩阵中第 0 行、第 0 列共同选中的那位即被选中。如果要构成 1K * 8 位的存储器,只需用 8 片上图所示的芯片即可。
随机存取存储器按其存储信息的原理不同,可分为静态 RAM 和动态 RAM。静态 RAM 采用触发器原理来存储信息,动态 RAM 采用电容存储电荷原理来存储信息,都属于易失性半导体存储器。
(1)静态 RAM 基本单元电路
用于存放一个 “0” 和 “1” 代码的电路称为存储器的基本单元电路。下图是一个由 6 个 MOS 管组成的基本单元电路。
静态 RAM 是用触发器工作原理存储信息,因此即使信息读出后,它仍然保持其原状态,不需要再生。但电源掉电时,原存信息丢失,故它属于易失性半导体存储器。
(2)静态 RAM 芯片举例
Intel 2114 RAM 芯片的外特性示意图如下图所示,其存储容量大小为 1K * 4 位。图中, A 9 A_9 A9~ A 0 A_0 A0 为地址输入端, I / O 1 I/O_1 I/O1~ I / O 4 I/O_4 I/O4 为数据输入/输出端。 C S ‾ \overline{CS} CS 为片选信号(低电平有效), W E ‾ \overline{WE} WE 为写允许信号(低电平为写,高电平为读), V c c V_{cc} Vcc 为电源端,GND 为接地端。
2114 RAM 芯片的结构示意图如上所示,存储矩阵由 64 * 64 个基本单元电路组成,如果每次只访问一位的话,按重合法需要 6+6=12 条地址线,但每次需要访问 4 位,便将存储矩阵按列均匀分为 4 组,每组内可编号从 0 到 15,这样定位行依旧需要 6 条地址线( A 8 A_8 A8~ A 3 A_3 A3),但列定位只需要 4 条地址线( A 9 A_9 A9, A 2 A_2 A2, A 1 A_1 A1, A 0 A_0 A0),共需 10 条地址线。如果列地址为 1111,那么便从这 4 组每组中选出编号为 15 的列,再结合行地址找到相应的行,便可找到要访问的 4 位。
(1)动态 RAM 基本单元电路
常见的动态 RAM 基本单元电路有三管式和单管式(MOS 管)两种,分别如下面左右两图所示,它们的共同特点都是靠电容存储电荷的原理来寄存信息。若电容上有足够多的电荷表示存“1”,电容上无电荷表示存“0”。电容上的电荷一般只能维持1~2ms,必须在 2ms 内对其所有存储单元恢复一次原状态,这个过程称为再生或刷新。
(2)动态 RAM 芯片举例
三管动态 RAM 芯片如 Intel 1103 芯片,其结构示意图如下图所示。这是一个 1K * 1 位的存储芯片,图中每一小方块位一个三管式基本单元电路,它们排成 32 * 32 的存储矩阵。每列都有一个刷新放大器(用来形成再生信息)和一个预充电管(图中未画)。采用重合法选择基本单元,因此只需要 10 根地址线。
(3)动态 RAM 刷新
刷新的过程实质上是先将原存信息读出,再由刷新放大器形成原信息并重新写入的再生过程。动态 RAM 采用定时刷新的方式,它规定在一定的时间内,对动态 RAM 的全部基本单元电路必作一次刷新,一般取 2 ms,这个时间称为刷新周期或再生周期。
刷新是一行一行进行的(如Intel 1103 芯片所示,每一列有一个刷新放大器),必须在刷新周期内,由专用的刷新电路来完成对基本单元电路的逐行刷新,才能保证动态 RAM 中的信息不丢失。通常由三种方式刷新:集中刷新、分散刷新和异步刷新。
集中刷新:在刷新周期内,集中一段时间进行逐行刷新,这段时间必须停止读/写操作,这段时间称为“死时间”,又称访存“死区”。例如,对于 128 * 128 矩阵的存储芯片进行刷新,若存储周期为 0.5μs,设刷新周期为 2ms(4000 个存取周期),则对这 128 行集中刷新共需 0.5μs * 128 = 64μs,所以死区为 64μs(128 个存取周期),死时间率为 128/4000 = 3.2%。
分散刷新:对每个存储基本单元的刷新分散到每个存取周期内完成。把存取周期 t C t_C tC 分成两段,前段 t M t_M tM 用来读/写(或维持信息),后半段 t R t_R tR 用来刷新。仍以 128 * 128 矩阵的存储芯片为例,存取周期为 1μs,读写周期为 0.5μs,那么 128μs 就可将存储芯片全部刷新一遍。这样不存在停止读/写操作的死时间,但存取周期变长了,整个系统速度降低了。
异步刷新:分散刷新和集中刷新相结合,将对每行的刷新分散到整个刷新周期内。仍是对 128 * 128 矩阵的存储芯片进行刷新,存取周期为 0.5μs,每隔 2ms/128 = 15.6μs 刷新一行,每行刷新的时间仍为 0.5μs(一个存储周期),相对于每个 15.6 μs来说这是一个集中刷新,相对于刷新周期来说这是一个分散刷新。死区总时间是不变的,为 64μs,但分散到了整个刷新周期内。
理想情况下,如果将 RAM 的刷新安排在 CPU 对指令的译码阶段,由于这个阶段 CPU 不访问存储器,所以就不会出现“死区”,而且还能避免分散刷新需要存取周期加长且降低系统速度的缺点。
DRAM | SRAM | |
---|---|---|
存储原理 | 电容 | 触发器 |
集成度 | 高 | 低 |
芯片引脚 | 少 | 多 |
功耗 | 低 | 高 |
价格 | 低 | 高 |
速度 | 慢 | 快 |
刷新 | 有 | 无 |
因此通常情况下,静态 RAM 用于主存,动态 RAM 用于缓存。
ROM 属于非易失性半导体存储器。
早期的 ROM 采用掩模工艺,把原始信息记录在芯片中且无法修改,称为掩模型只读存储器(Mask ROM, MROM);随着半导体技术的发展,出现了可编程只读存储器(Programmable ROM, PROM)、可擦除可编程只读存储器(Erasable PROM, EPROM)和用电可擦除可编程只读存储器(Electrically EPROM, EEPROM)。
(1)MROM
(2)PROM
(3)EPROM
(4)EEPROM
(5)Flash Memory
闪存存储器既有 EPROM 价格便宜、集成度高的优点,又有 EEPROM 电可擦除重写的特性。闪存具有整片擦除的特点(因此不能代替 RAM,因为做不到以字节为单位改写数据),其擦除、重写的速度快,比一般标准的 EEPROM 快得多。
闪存具备了 RAM 的功能,可与 CPU 直接连接。
非易失性、长期反复使用的大容量闪存存储器还可以代替磁盘,如存储卡与 U 盘。闪存正朝大容量、低功耗、低成本的方向发展。与传统硬盘相比,闪存的读写速度高、功耗较低,市场上已经出现了闪存硬盘,也就是 SSD 硬盘,该硬盘的性价比进一步提升。随着制造工艺的提高、成本的降低,闪存将更多地出现在日常生活之中。
由于单片存储芯片的容量是有限的,很难满足实际的需要。因此,必须将若干存储芯片连在一起才能组成足够容量的存储器,称为存储容量的扩展,通常有位扩展和字扩展。
(1)位扩展
位扩展是指增加存储字长,地址线不需要扩展,但需要扩展数据线。
例如,用 2 片 1K * 4 位的芯片可组成 1K * 8 位的存储器,如下图所示。图中两个 2114 芯片的地址线 A 9 A_9 A9~ A 0 A_0 A0、 C S ‾ \overline{CS} CS、 W E ‾ \overline{WE} WE 线都分别连在一起(都共用),其中一片的数据线作为高 4 位 D 7 D_7 D7~ D 4 D_4 D4,另一片的数据线作为低 4 位 D 3 D_3 D3~ D 0 D_0 D0。这样,便构成了一个 1K * 8 位的存储器。这两个芯片需要同时进行工作。
这也反映了地址线数反映了存储单元的个数,而不是主存储器中可存储字节的个数。
(2)字扩展
字扩展是指增加存储器字的数量,数据线不需要扩展,但需要扩展地址线(作为片选线)。
例如,用 2 片 1K * 8 位的芯片可组成 2K * 8 位的存储器,即存储字的个数增加了一倍,如下图所示。这两个芯片不能同时进行工作。将 A 10 A_{10} A10 作为片选信号(扩展的地址线), A 10 A_{10} A10 为低电平时, C S ‾ 0 \overline{CS}_0 CS0 有效,选中左边的 1K * 8 位芯片,否则选中右边的 1K * 8 位芯片。
(3)位、字同时扩展
字、位扩展是指既增加存储字的数量,又增加存储字长,数据线和地址线同时需要扩展。
例如,用 8 片 1K * 4 位的芯片组成 4 K * 8 位的存储器,由图中可见,每 2 片构成一组 1K * 8 位的存储器,4 组便构成 4K * 8 位的存储器。地址线 A 11 , A 10 A_{11},A_{10} A11,A10 经片选译码器得到 4 个片选信号 C S ‾ 0 \overline{CS}_0 CS0、 C S ‾ 1 \overline{CS}_1 CS1、 C S ‾ 2 \overline{CS}_2 CS2、 C S ‾ 3 \overline{CS}_3 CS3,分别选择其中 1K * 8 位芯片。
存储芯片与 CPU 芯片相连时,特别要注意片与片之间的地址线、数据线和控制线的连接。
(1)地址线的连接
存储芯片的容量不容,其地址线数也不同,CPU 的地址线数往往比存储芯片的地址线数多。通常总是将 CPU 地址线的低位与存储芯片的地址线相连,CPU 地址线的高位或在存储芯片扩充时使用(子扩展时用作片选线),或做其他用途。
例如,设 CPU 的地址线为 16 位 A 15 A_{15} A15~ A 0 A_{0} A0,1K * 4 位的存储芯片仅有 10 根地址线 A 9 A_{9} A9~ A 0 A_{0} A0,此时将 CPU 的低位地址 A 9 A_{9} A9~ A 0 A_{0} A0 与存储芯片地址线相连。又如,当用 16K * 1 位存储芯片时,其地址线有 14 根 A 13 A_{13} A13~ A 0 A_0 A0,此时将 CPU 的低位地址 A 13 A_{13} A13~ A 0 A_{0} A0 与存储芯片地址线相连。
(2)数据线的连接
CPU 数据线的条数可能比存储器数据线的条数要多,此时必须对存储芯片扩位,使其数据位数与 CPU 的数据线数相等。
(3)读/写命令的连接
这个信号的连接比较简单,一般来说,CPU 将读/写命令线连接到每一个芯片上即可。
(4)片选线的连接
片选线的连接是 CPU 与 存储芯片正确工作的关键。
❀ 第一,要确认 CPU 这次要访问的是存储器而不是 I/O 设备,这通过访存控制信号 MREQ ‾ \overline{\textbf{MREQ}} MREQ实现(低电平有效)。
❀ 第二,要确认访问那一片存储芯片:存储器由许多存储芯片组成,哪一片被选中完全取决于该存储芯片的片选控制端 C S ‾ \overline{CS} CS 是否能接收到来自 CPU 的片选有效信号,这通过 CPU 上未与存储芯片连上的高位地址线产生片选信号,通过译码器等逻辑电路来实现。
(5)合理选择存储芯片
合理选择存储芯片主要是指存储芯片类型(RAM 或 ROM)和数量的选择。通常选用 ROM 存放系统程序、标准子程序和各类常数等;RAM 则是为用户编程而设计的。在考虑芯片数量时,要尽量使连线简单方便。
(6)其他
实际组成计算机的时候,还会遇到 CPU 和存储器两者时序的配合、速度、负载匹配等问题。
随着计算机处理的信息越来越多,对存储器的工作速度和容量要求越来越高;此外,因 CPU 的功能不断增强,I/O 设备不断增多,致使主存的存取速度已成为计算机系统的瓶颈!除了寻找高速原件和采用层次结构(Cache - 主存)以外,调整主存的结构也可以提高访存速度。
(1)单体多字系统
加长存储器的存储字长,如下图的单体四字结构存储器。在一个存取周期内,从同一地址取出 4 条指令或数据,然后再逐条将单字长数据送至 CPU,即每隔 1/4 存储周期,主存向 CPU 送一条指令,这样显然增加了存储器的带宽。
显然,采用这种方法的前提是:指令和数据在主存内必须是连续存放的,一旦遇到转移指令,或者操作数不连续存放,这种方法的效果就不明显。
(2)多体并行系统
多体并行系统就是采用多个存储体组成的存储器,每个模块有相同的容量和存取速度,各模块各自都有独立的 MAR、MDR、地址译码驱动电路和读/写电路,因此每个模块可以并行工作,但同时读出的存储字在总线上需分时传送。
上图给出了一个高位交叉编址的多体存储器的结构示意图,高位地址表示存储体编号(体号),低位地址为体内地址(地址 = 体号 + 体内地址),图中信息按体内地址顺序存放(一个存储体存满后,再存入下一个),这种编址方法称为顺序编址。按这种高位交叉编址方式,只要合理调动,同时访问不同的存储器,便可实现并行工作。
这种高位交叉编址方式由于一个存储体内的地址是连续的,有利于存储器的扩充;其缺点是数据和指令在存储器内也是连续存放的,这在程序执行过程中也容易造成某一个存储体非常繁忙,而其他存储体空闲,这就与存储器的字扩展区别不大了。
为了解决高位交叉存在的问题,便有了低位交叉编址方式,高位地址表示体内地址,低位地址表示体号(地址 = 体内地址 + 体号),如上图所示。程序还是按照顺序地址的方式存储,但此时程序是连续存放在相邻体中,故又称为交叉编址或模 M 编址(M 等于存储体数,一般模块数 M 取 2 的方幂,使硬件电路比较简单。有的机器为了减少存储器冲突,采用质数个模块,例如我国银河机的 M 为 31,其硬件实现比较复杂)。
多存储体结构的存储器采用了低位交叉编址后,可以在不改变每个模块存取周期的前提下,提高存储器的带宽。上图示意了 CPU 交叉访问 4 个存储体的时间关系,负脉冲为启动每个存储体的工作信号。虽然对每个存储体而言,存取周期均未缩短,但由于 CPU 交叉访问各体,使 4 个存储体的读/写过程重叠进行,最终在一个存取周期内,存储器实际上向 CPU 提供了 4 个存储字,大大增加了存储器的带宽。低位交叉编址其实就是利用了分离式总线通信和流水线机制。
设 n n n 体低位交叉存储器,存取周期为 T T T,总线传输周期为 τ \tau τ,为实现流水线方式存取,应满足 T = n τ T=n\tau T=nτ,连续存取 n n n 个字所需的时间为 T + ( n − 1 ) τ T+(n-1)\tau T+(n−1)τ;若采用高位交叉编址时,连续读取 n n n 个字所需的时间为 n T nT nT。上图为四体低位交叉存储器采用流水线方式存取的示意图。
总结:高位交叉编址适合应用于存储器容量的扩展,低位交叉编址适合应用于存储器带宽的提高。
(1)为什么要使用高速缓冲存储器?
首先,主存速度的提高始终跟不上 CPU 的发展。据统计,CPU 的速度平均每年改进 60%,而动态 RAM 速度平均每年只改进 7%。例如,100MHz 的 Pentium 处理器平均 10ns 就执行一条指令,而动态 RAM 的典型访问时间为 60~120 ns。为了避免 CPU “空等”现象,所以由高速缓存 Cache 来解决主存与CPU 速度的不匹配问题。
其次,可能会出现 CPU 和 I/O 设备争抢访存的情况,这样在 CPU 和主存之间加一级缓存,一旦主存在与 I/O 设备交换时,CPU 可直接从缓存中读取所需信息,不必空等而影响效率。
由于指令和数据在主存内都是连续存放的,并且有些指令和数据往往会被多次调用(如子程序、循环程序和一些常数),使得 CPU 在执行程序时,访存具有相对的局部性。根据程序访问的局部性原理,只要将 CPU 近期要用到的程序和数据提前从主存送到 Cache,那么就可以做到 CPU 在一定时间内只访问 Cache。
(2)Cache 的工作原理
主存由 2 n 2^n 2n 个可编址的字组成,每个字有唯一的 n n n 位低址。为了与 Cache 映射,将主存与缓存分成大小相同的块(每个块内的字数相同),主存和 Cache 之间块以整体传送。将主存的地址分成两段:高 m m m 位表示主存的块地址,低 b b b 位表示块内地址,则 2 m = M 2^m=M 2m=M 表示主存的块数;同样,将 Cache 的地址也分为两段:高 c c c 位表示缓存的块号,低 b b b 位表示块内地址,则 2 c = C 2^c=C 2c=C 表示缓存块数。主存和 Cache 都用 b b b 位表示其块内字数,即 B = 2 b B=2^b B=2b 反映了块的大小,称为块长。实际上 Cache 地址意义并不大,也不需要形成 Cache 地址。
Cache 中每个块需设一个标记字段,用来表示当前存放的是哪一个主存块(映射)。任何时刻都有部分主存块处在缓存块中,CPU 想读取主存中的某字时,有两种可能:
Cache 的容量和块长是影响 Cache 效率的重要因素,通常用“命中率”来衡量 Cache 的效率,命中率是指CPU访问 Cache 的命中次数占访问总次数的比。
(3)Cache 的基本结构
它主要有 Cache 存储体、地址映射变换机构、Cache 替换机构几大模块组成。
Cache 存储体:Cache 存储体以块为单位与主存交换信息,且 Cache 访存的优先级最高。
地址映射变换机构:将 CPU 送来的主存地址转换为 Cache 地址。
由于主存和 Cache 的块大小相同,块内地址都是相对于块的起始地址的偏移量,所以块内地址相同。因此地址变换主要是主存的块号与 Cache 块号间的转换。
如果转换后的 Cache 块已与 CPU 欲访问的主存块建立了对应关系,即已命中,则 CPU 可直接访问 Cache 存储体。如果没有命中,此刻 CPU 在访问主存时,不仅将该字从主存取出,同时将它所在的主存块一并调入 Cache,供 CPU 使用。如果 Cache 已被装满,就得采用替换策略。(内容重复太多次,都放在下面Cache 读写操作中)
Cache 替换机构:当 Cache 内容已满,无法接受来自主存块的信息时,就由 Cache 内的替换机构按一定的替换算法来确定应从 Cache 内移出哪个块。
(4)Cache 的读写操作
读操作:
当 CPU 发出主存地址后,首先判断该存储字是否在 Cache 中。若命中,直接访问 Cache,将该字送至 CPU;若未命中,一方面要访问主存,将该字传送给 CPU,与此同时,要将该字所在的主存块装入 Cache,如果此时 Cache 已装满,就要执行替换算法,腾出空位才能将新的主存块调入。
写操作:
写操作比较复杂,因为需要解决 Cache 和主存的一致性问题。目前主要采用以下几种方法:
写直达法:写操作时数据既写入 Cache 又写入主存。写直达法能保证 Cache 和主存的数据始终一致,但增加了访存次数。
在写直达法中,由于 Cache 和主存的数据始终一致,在读失效且需要替换块时,被替换的块不需要写回主存,即读操作不涉及对主存的写操作,所以更新策略比较容易实现。
但是在写操作时,必须写入主存,“写”操作时间就是访问主存的时间,时间开销较大。
写回法:写操作时只把数据写入 Cache 而不写入主存,但当 Cache 数据被替换出去时才写回主存。写回法 Cache 中的数据会与主存中的不一致。Cache 中的每一块要增设一个标志位来表示该块中的数据有没有被修改,只有被修改过的块被替换出去时才写回主存。
写操作时只写入 Cache,故“写”操作时间就是访问 Cache 的时间,因此速度快;而且对 Cache 中一个数据块的多次写操作只需一次写入主存,因此可减少主存的写操作次数。
但是在读失效时要发生数据替换,被替换的块可能需要写回主存,因此读操作也涉及到了对主存的写操作,这增加了 Cache 的复杂性。
(5)Cache 的改进
Cache 刚出现时,典型系统只有一个缓存,近年来普遍采用多个 Cache。其含义有两个方面:一是增加 Cache 的级数;二是将统一的 Cache 变成分立的Cache。
增加 Cache 的级数:片内 Cache 和片外 Cache。
片内 Cache 与 CPU 制作在同一个芯片内,CPU 直接访问 Cache 不比占用系统总线,提高了系统总线的利用率和系统的整体效率。
由于片内 Cache 在芯片内,其容量不可能很大,这就可能致使 CPU 欲访问的信息不在缓存内,势必通过系统总线访问主存,这会导致整机速度下降,所以再增加一级片外缓存。
分立 Cache:将指令和数据分别存放在两个缓存中,一个称为指令 Cache,一个称为数据 Cache。相对应的为统一 Cache。
两种缓存的选用主要考虑:① 主存结构:如果主存是统一的,则相应的 Cache 采用统一缓存;如果主存采用指令、数据分开存储的方案,则相应的 Cache 采用分立Cache;② 机器对指令执行的控制方式:当采用流水线控制方式时,一般都采用分立 Cache。
由主存地址映射到 Cache 地址称为地址映射。
(1)直接映射
每个主存块只与一个缓存块相对应,而一个缓存块可以对应多个主存块。映射关系为 i = j m o d C i=j\ mod\ C i=j mod C,或 i = j m o d 2 c i=j\ mod\ 2^c i=j mod 2c,其中, i i i 为缓存块号, j j j 为主存块号, C C C 为缓存块数, c c c 为缓存中表示块数的位数。
主存地址高 m m m 位(主存块号)被分成两部分:低 c c c 位是指 Cache 的字块地址,高 t t t 位( t t t = m m m - c c c)是指主存字块标记,它被记录在了缓存块的“标记”位中。当缓存接到 CPU 传来的主存地址后,只需根据中间 c c c 位(假设为00…01)便可找到 Cache 块1,然后根据该 Cache 块的“标记”是否与主存地址的高 t t t 位相符来判断要找的主存块是否已经在 Cache 中了。
这种方式的优点是实现简单,只需利用主存地址的某些位直接判断,即可确定所需字块是否在缓存中;缺点是不够灵活,因每个主存块只能固定地对应某个缓存块,是缓存的存储空间得不到充分的利用。
(2)全相联映射
主存中的任一块可以映射到缓存中的任一块。
当缓存接到 CPU 传来的主存地址后,将全部的高 m m m 位与缓存中所有块的“标记”位进行比较,因此标记位的位数也应与 m m m 相等,如果存在与所访问主存块号相等的标记位,则说明缓存命中,否则不命中。
这种方式灵活,命中率也高;但是 Cache 标记位数增多,所需的逻辑电路甚多,成本较高。
(3)组相联映射
组相联映射是对直接映射和全相联映射的一种折中,它把 Cache 分为 Q Q Q 组,每组有 R R R 块,并有以下关系: i = j m o d Q i=j\ mod\ Q i=j mod Q,其中 i i i 为缓存的组号, j j j 为主存的块号,即某一主存块按模 Q Q Q 将其映射到缓存的第 i i i 组内。如下图所示。
组相联映射的主存地址各段与直接映射相比,虽然还是将主存块号部分分成了两部分,还是有区别的。Cache 字段地址由 c c c 位变为组地址字段 q q q 位,且 q q q = c c c - r r r,其中 2 c = C 2^c=C 2c=C 还是表示 Cache 块数, 2 q = Q 2^q=Q 2q=Q 表示组相联映射中 Cache 分组个数, 2 r = R 2^r=R 2r=R 表示组内包含的块数。主存字段标记由 t t t 位变为 s s s = t t t + r r r 位。当缓存接到 CPU 传来的主存地址后,先根据中间的 q q q 位 Cache 组地址字段确定该地址所在的主存块 j j j 会映射到 Cache 的第 i i i 组内,两者之间一一对应,属于直接映射关系;另一方面,主存的第 j j j 块可以映射到 Cache 的第 j j j 组内的任一块,这又体现出全相联映射关系。
可见,组相联映射的性能及其复杂性介于直接映射和全相联映射两者之间。
当新的主存块需要调入 Cache 并且它的 可用空间位置又被占满时,需要替换掉 Cache 的数据,这就产生了替换策略(算法)问题。在直接映射的 Cache 中,由于某个主存块只与一个 Cache 字块有映射关系,因此替换策略很简单。而在组相联和全相联映射的 Cache 中,主存块可以写入 Cache 中若干位置,这就有一个选择替换掉哪一个 Cache 字块的问题,即所谓替换算法问题。
常用的替换算法有先进先出算法、近期最少使用算法和随机法。
辅助存储器(外存)作为主存的后援设备,与主存一起组成了存储器系统的主存 - 辅存层次。与主存相比,辅存具有容量大、速度慢、价格低、可脱机保存信息等特点,但是不能直接与 CPU 交换信息。
目前广泛用于计算机系统的辅助存储器有硬磁盘、软磁盘、磁带、光盘等,前三种均属于磁表面存储器(载体上涂有磁性材料层,工作时靠载体高速运动,由磁头在磁层上进行读/写操作,信息被记录在磁层上,这些信息的轨迹就是磁道)。磁表面存储器的主要技术指标有:
记录密度:磁盘存储器用道密度和位密度表示,磁带存储器则用位密度表示。
磁盘沿半径方向单位长度的磁道数为道密度。
单位长度磁道能记录二进制信息的位数为位密度。磁带各磁道的位密度是相同的,但是在磁盘上各磁道上所记录的信息量是相同的,所以位密度不同,一般泛指磁盘位密度时,是指最内圈磁道上的位密度(最大位密度)。
存储容量:指外存所能存储的二进制信息总数量。
平均寻址时间。
磁盘:采用直接存取方式,寻址时间分为两个部分,即寻道时间和等待时间。寻道时间是磁头寻找目标磁道的时间,等待时间是找到磁道后,磁头等待欲读/写的磁道区段旋转到磁头下方所需要的等待时间。硬磁盘的平均寻址时间比软磁盘的平均寻址时间短,所以速度更快。
磁带:采用顺序存取方式,磁头不动,磁带移动,不需要找到磁道,但要考虑磁头寻找记录区段的等待时间,所以磁带寻址时间是指磁带空转倒磁头应访问的记录区段所在位置的时间。
数据传输率:指单位时间内磁表面存储器向主机传送数据的数据量。
误码率:等于从辅存读出时,出错信息位数和读出信息的总位数之比。为了减少出错率,磁表面存储器通常采用循环冗余编码来发现并纠正错误。
本BLOG上所有的原创文章未经本人许可,不得用于商业用途及传统媒体。网络媒体转载请注明出处,否则属于侵权行为:
https://blog.csdn.net/qq_39583450/article/details/114258674