存储器概述
存储器的分类
按作用分类
主存储器,简称主存,又称内存储器(内存):
存放计算机运行期间所需的大量程序和数据,CPU 可以直接随机地对其进行访问
也可以和高速缓冲存储器及辅助存储器交换数据,其特点是容量较小、存取速度较快、每位价格较高
辅助存储器,简称辅存,又称外存储器(外存):
是主存储器的后援存储器,用来存放当前暂时不用的程序和数据,以及一些需要永久性保存的信息
它不能与 CPU 直接交换信息,其特点是容量极大、存取速度较慢、单位成本低
高速缓冲存储器,简称 Cache:
位于主存和 CPU 之间,用来存放正在执行的程序段和数据,以便 CPU 能高速地使用它们
Cache 的存取速度可与 CPU 的速度相匹配,但存储容量小、价格高,现代计算机通常将它们制作在 CPU 中
按存储介质分类
按存储介质,存储器可分为:
磁表面存储器(磁盘、磁带)
磁心存储器半导体存储器(MOS 型存储器、双极型存储器)
光存储器(光盘)
按存取方式分类
随机存储器 RAM:
存储器的每个存储单元的内容都可以随机存取,而且存取时间与存储单元的物理位置无关
其优点是读写方便、使用灵活,主要用作主存或高速缓冲存储器,RAM 又分为静态 RAM 和动态 RAM
只读存储器 ROM:
存储器的内容只能随机读出而不能写入,信息一旦写入存储器就固定不变,即使断电,内容也不会丢失
通常用它存放固定不变的数据;它与随机存储器可共同作为主存的一部分,统一构成主存的地址域
注意:现在已可通过电擦除等方式进行写入,但仍保留了断电内容保留、随机读取特性,但其写入速度比读取速度慢得多
串行访问存储器:
对存储单元进行读/写操作时,需按其物理位置的先后顺序寻址
包括顺序存取存储器(如磁带)与直接存取存储器(如磁盘、光盘)
顺序存取存储器的内容只能按某种顺序存取,存取时间的长短与信息在存储体上的物理位置有关,其特点是存取速度慢
直接存取存储器存取信息时通常先寻找整个存储器中的某个小区域(如磁盘上的磁道,随机访问),再在小区域内顺序查找
按信息的可保存性分类
断电后,存储信息即消失的存储器,称为易失性存储器,如 RAM
断电后,信息仍然保持的存储器,称为非易失性存储器,如 ROM、磁表面存储器和光存储器
若某个存储单元所存储的信息被读出时,原存储信息被破坏,则称为破坏性读出
若读出时,被读单元原存储信息不被破坏,则称为非破坏性读出
具有破坏性读出性能的存储器,每次读出操作后,必须恢复被破坏的信息
存储器的性能指标
存储器有 3 个主要性能指标,即存储容量、单位成本和存储速度,这 3 个指标相互制约
存储容量:存储字数 × 字长(如
1M × 8位)单位换算:
1B(Byte 字节)=8b(bit 位)存储字数表示存储器的地址空间大小,字长表示一次存取操作的数据量
单位成本:每位价格 = 总成本 / 总容量
存储速度:数据传输率 = 数据的宽度 / 存储周期
存取时间
:指一次存储器操作从开始到完成所经历的时间,分为读出时间和写入时间 存取周期
:存取周期又称读写周期或访问周期 指存储器进行一次完整的读或写操作所需的全部时间(存储时间 + 恢复时间)
即连续两次独立访问存储器操作(读或写操作)之间所需的最小时间间隔
主存带宽
:主存带宽又称数据传输率,表示每秒从主存进出信息的最大数量,单位为字/秒、字节/秒、位/秒

存取时间不等于存储周期,通常存储周期大于存取时间
对任何一种存储器,在读写操作之后,总要有一段恢复内部状态的复原时间(电路状态恢复吧)
对于破坏性读出的存储器,存取周期往往比存取时间大得多,甚至可达
选择题:若某存储器存储周期为 250ns,每次读出 16 位,该存储器的数据传输率是
存储器的层次化结构
存储器的性能指标
为了解决存储系统大容量、高速度和低成本 3 个相互制约的矛盾,在计算机系统中,通常采用多级存储器结构

存储系统层次结构主要体现在 Cache - 主存层次和主存 - 辅存层次
前者主要解决 CPU 和主存速度不匹配的问题,后者主要解决存储系统的容量问题
在存储体系中,Cache、主存能与 CPU 直接交换信息,辅存则要通过主存与 CPU 交换信息;主存与 CPU、Cache、辅存都能交换信息

存储器层次结构的主要思想是上一层的存储器作为低一层存储器的高速缓存
Cache - 主存层次速度接近于 Cache,容量和位价却接近于主存;主存 - 辅存层次速度接近于主存,容量和位价却接近于辅存
这就解决了速度、容量、成本这三者之间的矛盾,现代计算机系统几乎都采用这种三级存储系统
主存和 Cache 之间的数据调动是由硬件自动完成的,对所有程序员均是透明的;而主存和辅存之间的数据调动则是由硬件和操作系统共同完成的,对应用程序员是透明的
在主存 - 辅存这一层次的不断发展中,逐渐形成了虚拟存储系统,在这个系统中程序员编程的地址范围与虚拟存储器的地址空间相对应
注意:在 Cache - 主存和主存 - 辅存层次中,上一层中的内容都只是下一层中的内容的副本
Cache - 主存效率计算
求 Cache 的命中率:Cache 命中次数 / 主存命中次数
求平均访问时间:Cache 命中率 × Cache 访问时间 + 主存命中率 × 主存访问时间
求 Cache - 主存储系统效率:访问 Cache 时间 / 平均访问时间
题目:Cache 的存储时间是 100ns,主存的存储时间是 1000ns,若希望平均存储时间不超过 Cache 存储时间的 115%,则 Cache 的命中率至少为多少?
平均存储时间为 100ns × 115% = 115ns
设命中率为 x,得 100x + 1000(1 - x) ≤ 115 得 x = 98.33%,因此命中率至少为 99%
半导体随机存储器
SRAM 和 DRAM
SRAM 的工作原理
通常把存放一个二进制位的物理器件称为存储元,它是存储器的最基本的构件
地址码相同的多个存储元构成一个存储单元,若干存储单元的集合构成存储体
静态随机存储器(SRAM)的存储元是用双稳态触发器(六晶体管 MOS)来记忆信息的,因此即使信息被读出后,它仍保持其原状态而不需要再生(非破坏性读出)
SRAM 的存取速度快,但集成度低,功耗较大,所以一般用来组成高速缓冲存储器
DRAM 的工作原理
DRAM 的定义
动态随机存储器(DRAM)是利用存储元电路中栅极电容上的电荷来存储信息的,DRAM 通常只使用一个晶体管,所以它比SRAM 的密度要高很多,由于 DRAM 使用电容存储信息,所以它是破坏性读出,每次读取后要恢复
DRAM 采用地址复用技术,地址线是原来的 1 / 2,地址信号分行、列两次传送;SRAM 行和列不一定一样不能使用
相对于 SRAM 来说,DRAM 具有容易集成、位价低、容量大和功耗低等优点,但 DRAM 的存取速度比 SRAM 的慢,一般用来组成大容量主存系统
DRAM 电容上的电荷一般只能维持 1~2ms,信息会自动消失,每隔一定时间必须刷新,通常取 2ms,称为刷新周期
DRAM 的刷新
集中刷新:在一个刷新周期内使用一段固定的时间,对存储器的行逐一刷新,期间停止对存储器的读写操作,称为死时间,或访存死区
优点:读写操作时不受刷新工作的影响;缺点:在集中刷新期间不能访问存储器
分散刷新:把对每行的刷新分散到各个工作周期中
一个存储器的系统工作周期分为两部分:前半部分用于正常读、写或保持,后半部分用于刷新
优点:没有死区;缺点:加长了系统的存取周期,降低了整机的速度
注意:刷新的行与读的行不是同一行,而且即使没有前半部分也要进行后半部分
异步刷新:是前两种方法的结合,它既可缩短死时间,又能充分利用最大刷新间隔为
2ms的特点具体做法是将刷新周期除以行数,得到两次刷新操作之间的间间隔 t,利用逻辑电路每隔时间 t 产生一次刷新请求
这样可以避免使 CPU 连续等待过长的时间,而且减少了刷新次数,从根本上提高了整机的工作效率
DRAM 的刷新需注意以下问题:
刷新对 CPU 是透明的,即刷新不依赖于外部的访问
动态 RAM 的刷新单位是行,由芯片内部自行生成行地址
刷新操作是把信息读出,通过刷新放大器存回存储单元,即读取恢复,所以仅占用一个存储周期
刷新时不需要选片,即整个存储器中的所有芯片同时被刷新
核心结论:DRAM 刷新的三种方式计算 (2025 重点)
- 集中刷新:刷新期间 CPU 访存“死区”时间 =
。
- 分散刷新:存取周期
翻倍( ),无死区但速度慢。
- 异步刷新:刷新间隔 =
。每隔此间隔刷新一行。死区仅为“一个存储周期”。
考点追踪:DRAM 刷新与地址复用(2014、2015、2018、2022)
- 刷新单位是“行”,且由芯片内自行生成行地址。2. 异步刷新可减少“死区”,刷新期间 CPU 无法访存。3. DRAM 地址复用:行/列地址按两次送入,地址引脚数减半。
存储器芯片的内部结构
存储器芯片由存储体、IO 读写电路、地址译码和控制电路等部分组成

存储体(存储矩阵)存储体是存储单元的集合,它由行选择线 X 和列选择线 Y 来选择所访问单元,存储体的相同行、列上的位同时被读出或写入
地址译码器:用来将地址转换相应的行或列的位置,如 101 转化为第 5 条线输出高电平,其他线均为低电平
I/O 控制电路:用以控制被选中的单元的读出或写入,具有放大信息的作用
片选控制信号:用于选择使用哪一个芯片,因为单个芯片容量太少
如果为高电平时对该存储芯片的操作是有效的,否则操作是无效的,多个存储芯片中只会有一个是高电平
读/写控制信号:根据 CPU 给出的是读命令还是写命令,控制被选中单元进行读或写
外面可视的针脚是:

地址:针脚和 log(地址) 一样多
输出:阵脚和其位数一样多
片选:一般是 1 根,但在 DRAM 中片选会变成行通选和列通选各占 1 根
读写:读写控制可能共用一根,也可能分开使用
存储器的读、写周期
RAM 的读周期

高电平优先是指在高电平时才是有效的;低电平优先是在低电平才是有效的;
地址有效是指给出了地址,但地址并不是真正的稳定,因为需要等待电流流动
地址稳定后
输出片选信号,和地址一起就可以找到要读取的单元 确定要读取的单元后,需要等待数据的电流流出,即数据稳定
数据稳定后
就完成工作了,输出完毕 读取完成,输出都取消,但需要等待电流流完,这等待的时间就是恢复
其中
里面很多地方需要等电流移动,即电流流到合适位置,如片选输出后要等他和地址汇合后才能得到数据位置
RAM 的写周期

读和写一样,是计算电流等待的过程,确定各自输出的时间
地址有效等到地址稳定
发生片选信号和写命令信号,等片选信号和地址汇合就数据有效
等数据稳定就开始写入数据
写入完就把输出收起,等待电流结束(恢复)
SRAM 和 DRAM 的比较

只读存储器
只读存储器的特点
ROM 和 RAM 都是支持随机存取的存储器,其中 SRAM 和 DRAM 均为易失性半导体存储器
而 ROM 中有了信息,就不能轻易改变,即使掉电也不会丢失,它在计算机系统中是只供读出的存储器
ROM 器件有两个显著的优点:
结构简单,所以位密度比可读写存储器的高
具有非易失性,所以可靠性高
ROM 的类型
掩模式只读存储器(MROM)
MROM 的内容由半导体制造厂按用户提出的要求在芯片的生产过程中直接写入,写入以后任何人都无法改变其内容
优点是可靠性高,集成度高,价格便宜;缺点是灵活性差
一次可编程只读存储器(PROM)
PROM 允许用户利用专门的设备(编程器)写入自己的程序,一旦写入,内容就无法改变
可擦除可编程只读存储器(EPROM)
EPROM 不仅可以由用户利用编程器写入信息,而且可以对其内容进行多次改写
修改 EPROM 的内容时,先将其全部内容擦除,然后编程,紫外线擦除(
UVEPROM)和电擦除(EEPROM)EPROM 虽然既可读又可写,但它的编程次数有限,且写入时间过长
闪速存储器(Flash Memory)
Flash Memory 是在 EPROM 与 EEPROM 的基础上发展起来的,其主要特点是既可在不加电的情况下长期保存信息,又能在线进行快速擦除与重写
闪速存储器既有 EPROM 的价格便宜、集成度高的优点,又有 EEPROM 电可擦除重写的特点,且擦除重写的速度快
固态硬盘(Solid State Drives,SSD)
基于闪存的固态硬盘是用固态电子存储芯片阵列制成的硬盘,由控制单元和存储单元(FLASH芯片)组成
保留了 Flash Memory 长期保存信息、快速擦除与重写的特性
对比传统硬盘也具有读写速度快、低功耗的特性,缺点是价格较高
选择题:U 盘属于只读存储器,采用 EEPROM 技术,注意:ROM 虽然是随机存储但不是随机存储器
选择题:闪存用 MOS 管,写入前必须先擦出数据,因此写速度比读速度慢,SSD 就是由 Flash 芯片组成
主存储器的基本组成

由一个个存储 0 或 1 的记忆单元(也称存储元件)构成的存储矩阵(也称存储体)是存储器的核心部分
为了存取存储体中的信息,必须对存储单元编号(也称编址)
编址单位是指把多少个位编成一个单位,可以按字节编址,也可以按字编址,现代计算机通常采用字节编址方式
访问主存的步骤:
CPU 把被访问单元的地址送到 MAR 中
通过地址线将主存地址送到主存中的地址寄存器
地址译码器进行译码选中相应单元,同时 CPU 将读写信号通过控制线送到主存的读写控制电路
如果是写操作:CPU 同时将要写的信息送到 MDR 中,在读写控制电路的控制下,经数据线将信号写入选中的单元
如果是读操作,那么主存读出选中单元的内容送到数据线,然后送到 MDR 中
数据线的宽度与 MDR 的宽度相同,地址线的宽度与 MAR 的宽度相同,数据线数和地址线数共同反映存储体容量的大小
如上图,64 位数据线,每次可取 8 个单元的内容,36 位地址寻址范围
主存储器与 CPU 的连接
连接原理
主存储器通过数据总线、地址总线、控制总线与 CPU 连接
数据总线的位数与工作频率的乘积正比于数据传输率
地址总线的位数决定了可寻址的最大内存空间
控制总线(读/写)指出总线周期的类型和本次输入/输出操作完成的时刻
主存容量的扩展
单个存储芯片的容量是有限的,在字数或字长方面与实际要求都有差距,因此要扩展以满足要求
位扩展法
在 CPU 的数据线数与存储芯片的数据位数不相等时,必须对存储芯片扩位,使其数据位数与 CPU 的数据线数相等
位扩展的连接方式是将多个存储芯片的地址端、片选端和读写控制端相应并联,数据端分别引出

注意:连接地址线的方式相同,连接数据线的方式不同;会选中所有的芯片,片选信号
字扩展法
字扩展(增加存储器中字的数量)将芯片的地址线、数据线、读写控制线相应并联,由片选信号来区分各芯片的地址范围

使用地址高 2 位选择使用的芯片,低 14 位选择芯片的地址,
注意:仅采用字扩展时,各芯片连接地址线、连接数据线的方式也相同,但要通过
字位同时扩展法

就是字面意思,使用两个芯片位扩展到 8 位一组,然后增加 3 组扩展到 64K 字
扩展位就使用位扩展的连接,扩展字就使用字扩展的连接
注意:采用字位同时扩展时,各芯片连接地址线的方式相同,但连接数据线的方式不同,片选信号
存储芯片的地址分配和片选
CPU 要实现对存储单元的访问,首先进行片选;然后进行字选,片内的字选通常是由 CPU 送出的 N 条低位地址线完成的
线选法
选择芯片时,使用一个地址针脚直接连接一个芯片的
优点:不需要地址译码器,线路简单;缺点:地址空间不连续,选片的地址线必须分时为低电平(否则不能工作),不能充分利用系统的存储器空间,造成地址资源的浪费
译码片选法
译码器可以让 n 根地址针脚选择从
8 个芯片如果采用线性法需要 8 位地址,而使用译码片选法仅需要
存储器与 CPU 的连接
合理选择存储芯片
要组成一个主存系统,主要指存储芯片的类型(RAM 或 ROM)和数量的选择,考虑芯片数量时,要尽量使连线简单、方便
通常选用 ROM 存放系统程序、标准子程序和各类常数,RAM 则是为用户编程而设置的
地址线的连接
存储芯片的容量不同,其地址线数也不同,而 CPU 的地址线数往往比存储芯片的地址线数要多
通常将 CPU 地址线的低位与存储芯片的地址线相连,以选择芯片中的某一单元,译码由芯片的片内逻辑完成的
而 CPU 地址线的高位则在扩充存储芯片时使用,用来选择存储芯片,译码由外接译码器逻辑完成
选择题:实际的主存容量不能代表 MAR 的位数,因为有扩展的需求,MAR 的位数和主存地址空间大小有关
数据线的连接
CPU 的数据线数与存储芯片的数据线数不一定相等,在相等时可直接相连
在不等时必须对存储芯片扩位,使其数据位数与 CPU 的数据线数相等
读/写命令线的连接
CPU 读/写命令线一般可直接与存储芯片的读/写控制端相连,通常高电平为读,低电平为写
有些 CPU 的读/写命令线是分开的(读为
片选线的连接
片选线的连接是 CPU 与存储芯片连接的关键,存储器由许多存储芯片叠加而成,CPU 会给选择的芯片发
片选有效信号与 CPU 的访存控制信号
若 CPU 访问 IO,则 MREQ 为高(低电平有效的),表示不要求存储器工作
逻辑图绘制
题目:设 CPU 有 16 根地址线,8 根数据线,并用 2K×8 位的 ROM 芯片地址 6000H ~67FFH 为系统程序区;使用 2 片 1K×4 位的 RAM 芯片地址 6800H ~6BFFH 为用户程序区,请详细画出存储芯片的片选逻辑图

首先把地址转成二进制:6000H = 0b0110 0000 0000 0000,6800H = 0b0110 1000 0000 0000
那么可以注意到只需要在高位 01 100 时选择 ROM,在 01 101 0 时选择 RAM
两个共同的高位是 5 位,所以译码器是五位,然后 CPU 的
对 RAM 来说高位比译码器多一位,所以除了移码其挑选外还要判断
双端口 RAM 和多模块存储器
双端口 RAM
双端口 RAM 是指同一个存储器有左、右两个独立的端口,分别具有两组相互独立的地址线、数据线和读写控制线

允许两个独立的控制器同时异步地访问存储单元,当两个端口的地址不相同时,不会发生冲突
两个端口同时存取存储器的同一地址单元时,会因数据冲突造成数据存储或读取错误,有以下 4 种情况:
两个端口不同时对同一地址单元存取数据
两个端口同时对同一地址单元读出数据
两个端口同时对同一地址单元写入数据(写错误)
两个端口同时对同一地址单元操作,一个写入数据,另一个读出数据(读错误)
解决方法:置忙信号 BUSY 为 0,由判断逻辑决定暂时关闭一个端口,未被关闭的端口正常访问,被关闭的端口延长一个很短的时间段后再访问
多模块存储器
单体多字存储器
单体多字系统的特点是存储器中只有一个存储体,每个存储单元存储 m 个字,总线宽度也为 m个字
CPU 访问主存储器时,主存储器一次读出 m 个字,并根据地址返回一个给 CPU,下次地址在上次取出的 m 个字里面直接返回,如果不在就重新取一次
显然,这增大了存储器的带宽,提高了单体存储器的工作速度
缺点:指令和数据在主存内必须是连续存放的,一旦遇到转移指令,或操作数不能连续存放,这种方法的效果就不明显
多体并行存储器
多体并行存储器由多体模块组成,每个模块都有相同的容量和存取速度,各模块都有独立的读写控制电路、地址寄存器和数据寄存器,它们既能并行工作,又能交叉工作
高位交叉编址
高位地址表示体号,低位地址为体内地址

高位交叉编址方式下,总是把低位的体内地址送到由高位体号确定的模块内进行译码
访问一个连续主存块时,总是访问同一个模块,存储模块不能被并行访问,因而不能提高存储器的吞吐率
注意:模块内的地址是连续的,存取方式仍是串行存取,因此这种存储器仍是顺序存储器(顺序方式)
选择题:虽然连续时像顺序存储,但隔 n 个地址来寻址也是可以让模块并行工作的,但可能性比较小
低位交叉编址
低位地址为体号,高位地址为体内地址

低位交叉编址方式下,总是把高位的体内地址送到由低位体号确定的模块内进行译码
连续地址数据存放在相邻模块中,因此称采用此编址方式的存储器为交叉存储器(交叉方式)
采用低位交叉编址后,可在不改变每个模块存取周期的前提下,采用流水线的方式并行存取,提高存储器的带宽
考点追踪:多模块交叉存储(2011、2016、2017、2020)
- 掌握低位交叉编址计算:模块号
。2. 实现流水线的模块数 。3. 注意:只有在连续访问多个不同模块时才能体现带宽优势。
核心结论:低位交叉存储的流水线时间
- 计算公式:连续存取
个字的时间 。
- 带宽提升:理想状态下带宽提升为原来的
倍( 为交叉模块数)。

设模块字长等于数据总线宽度,模块存取一个字的存取周期为 T,总线传送周期为 r
为实现流水线方式存取,存储器交叉模块数必须大于等于
连续存取 m 个字所需的时间为
思考:跳转地址后,加载的地址可能依然是流水线的地址,如 4 个模块加载地址为 0123 8567 依然是流水线,因为 8 地址也是在第一模块的,所以这里虽然连续地址没有单体快,但适合于跳转
思考:双端口是多核 CPU 使用,而多模块是流水线增加带宽,那么我们的 CPU 是不是两个都使用?
选择题:4 个 8 位存储器采用交叉方式,与 32 位的存储器总线相连,主存每次最多读写 32 位数据,则读 double 型变量需要 3 个存储周期,因为
高速缓冲存储器
程序访问的局部性原理
程序访问的局部性原理包括时间局部性和空间局部性
时间局部性:未来可能会再次使用现在使用的信息,因为程序中存在循环
空间局部性:未来可能会使用现在信息附近的信息,因为指令通常是顺序存放执行,数据一般也是群聚地存储
高速缓冲技术就是利用局部性原理,把正在使用的部分存放在快且小的 Cache 中,使 CPU 的访存操作大多数针对 Cache 进行,从而大大提高程序的执行速度

对于数组 a,程序 A 的访问是
空间局部性好,而对于程序 B 的访问是 空间局部性差 对于数据 a,程序 A 和程序 B 里面数组的每一个元素都只访问一次,时间局部性差
对于指令的 for 循环体,本身及周围指令一直被访问,因此时间和空间局部性好
选择题:程序访问的局部性原理,是指在程序执行过程中,程序对主存的访问是不均匀的,有些会访问比较多
Cache 的基本工作原理
Cache 位于存储器层次结构的顶层,通常由 SRAM 构成,且位于 CPU 内部

Cache 的分块:
Cache 和主存都被划分为相等的块 Cache 块又称 Cache 行,每块由若干字节组成,块的长度称为块长(Cache 行长)
Cache 中的块数要远少于主存中的块数,它仅保存主存中最活跃的若干块的副本
Cache 按照某种策略,预测 CPU 在未来一段时间内欲访存的数据,将其装入 Cache
CPU 的访存过程:
当 CPU 发出读请求时,若命中 Cache,只对 Cache 进行读操作,与主存无关
若 Cache 不命中,则仍需访问主存,并把此字所在的块一次性地从主存调入 Cache
若此时 Cache 已满,则需根据某种替换算法,用这个块替换 Cache中原来的某块信息
值得注意的是,CPU 与 Cache 之间的数据交换以字为单位,而 Cache 与主存之间的数据交换则以 Cache 块为单位
注意:某些计算机中也采用同时访问 Cache 和主存的方式,若 Cache 命中,则主存访问终止;否则访问主存并替换 Cache
设一个程序执行期间,Cache 的总命中次数为
设
Cache 和主存的映射关系
Cache 行中的信息是主存中某个块的副本,地址映射是指把存放在主存中的信息按照某种规则装入 Cache
主存中只有一部分块的信息可放在 Cache 中,因此在 Cache 中要为每块加一个标记,指明它是主存中哪一块的副本
该标记的内容相当于主存中块的编号,为了说明 Cache 行中的信息是否有效,每个 Cache 行需要一个有效位
直接映射
主存中的每一块只能装入 Cache 中的唯一位置,若这个位置已有内容则产生块冲突,原来的块将无条件地被替换出去
直接映射实现简单,但 Cache 的其他许多地址空着也不能占用,这使得直接映射的块冲突概率最高,空间利用率最低
直接映射的关系可定义为

主存地址分成:标记 tag、Cache 行号、块内地址,其中标记需要 Cache 额外使用空间来存储
CPU 访存过程:
首先根据访存地址中间的 c 位,找到对应的 Cache 行
将对应 Cache 行中的标记和主存地址的高 t 位标记进行比较
若相等且有效位为 1,则访问 Cache 命中,此时根据主存地址中低位的块内地址,在对应的 Cache 行中存取信息
若不相等或有效位为 0,则不命中,CPU 从主存中读出该地址所在的一块信息送到对应的 Cache 行中,将有效位置 1,并将标记设置为地址中的高 t 位,同时将该地址中的内容送 CPU
注意:很多时候在 Cache 缺失时是先把内存加载到 Cache,然后 CPU 再从 Cache 里面拿数据
全相联映射
主存中的每一块可以装入 Cache 中的任何位置,每行的标记用于指出该行取自主存的哪一块,所以 CPU 访存时需要与所有Cache 行的标记进行比较
优点:比较灵活,Cache 块的冲突概率低,空间利用率高,命中率也高
缺点:标记的比较速度较慢,实现成本较高,通常需采用昂贵的按内容寻址的相联存储器进行地址映射

主存地址分成:标记 tag、块内地址,由于少了行号,需要更多的空间来存放标记
组相联映射
将 Cache 空间分成大小相同的组,主存的数据块可以装入组内的任何位置,即组间采取直接映射,组内采取全相联映射
它是对直接映射和全相联映射的一种折中,假设每组有 r 个 Cache 行,则称之为 r 路组相联
组相联映射的关系可以定义为 j = i mod Q 式中,j 是 Cache 行的组号,i 是主存的块号,Q 是 Cache 的组数
路数越大,即每组 Cache 行的数量越大,发生块冲突的概率越低,但相联比较电路也越复杂
选定适当的数量,可使组相联映射的成本接近直接映射,而性能上仍接近全相联映射

主存地址分成:标记 tag、组号、块内地址,这里的标记占用空间比直接映射多,但比全相联映射少
CPU 访存过程如下:
先根据访存地址中间的组号找到对应的 Cache 组
将对应 Cache 组中每个行的标记与主存地址的高位标记进行比较
若有一个相等且有效位为 1,则访问 Cache 命中,此时根据主存地址中的块内地址,在对应 Cache 行中存取信息
若都不相等或虽相等但有效位为 0,则不命中,CPU 从主存中读出该地址所在的一块信息送到对应 Cache 组的任意一个空闲行中,将有效位置 1,并设置标记,同时将该地址中的内容送 CPU
额外:现在的 Cache 的组不是随便取的,它是和 CPU 的多线路并发查找数量一样,即可以同时检查多少个 Cache 行数
选择题:还有一种组映射的方式,假设一组 2 行,一共 4 行,那么 0~1、4~5、8~9 映射到第 0 组,2~3,6~7 映射到第 1 组
总结
直接映射的只能映射到 Cache 中的某一固定行;全相联映射可以映射到所有 Cache 行;N 路组相联映射可以映射到 N 行
当 Cache 大小、主存块大小一定时:
直接映射的命中率最低,全相联映射的命中率最高
直接映射的判断开销最小、所需时间最短,全相联映射的判断开销最大、所需时间最长
直接映射标记所占的额外空间开销最少,全相联映射标记所占的额外空间开销最大
考点追踪:Cache 的映射、替换与容量计算(2010、2012、2013、2014、2016、2017、2018、2022、2023、2024)
- 直接映射:主存地址划分
。2. 组相联: 。3. Cache 总容量 = 。4. 标记位(Tag)长度 = 主存地址位数 - 索引位数 - 块内偏移位数。
计算细节:哪位需要加?
- 有效位 (Valid): 1 位。必须有。
- 脏位 (Dirty): 1 位。仅在“写回法 (Write Back)”时需要。
- 替换位 (LRU):
位。仅在组相联/全相联时需要。
- Tag: 必须有。
例子
假设某个计算机的主存地址空间大小为 256MB,按字节编址,其数据 Cache 有 8 个 Cache 行,行长为 64B
若不考虑用于 Cache 的一致维护性和替换算法控制位,并且采用直接映射方式,则该数据 Cache 的总容量为多少?
若该 Cache 采用直接映射方式,则主存地址为 3200(十进制)的主存块对应的 Cache 行号是多少?采用二路组相联映射时又是多少?
解答:
Cache 的总容量是存储容量 + 标记矩阵容量,其中**标记矩阵(地址映射表)**包含存储器地址进行跟踪的信息
256MB有 28 位主存地址,64B是 6 位块内地址,8 是 3 位行号,所以标记长度是 28 - 6 - 3 = 19 位有效位为 1 位,行长
64B是 512 位,则总容量是位 注意:每个 Cache 行对应一个标记项,包含有效位、标记位、一致性维护位、替换算法控制位
主存的字块号是
3200B / 64B = 50,直接映射的行号为 50 mod 8 = 2;二路组相联映射的组号为50 mod 4 = 2,行号为 4 或 5
Cache 中主存储块的替换算法
主存向 Cache 传送一个新块,但没地方放这个新块时:
全相联映射、组相联映射:需要使用替换算法置换 Cache 行
直接映射:只对应一个块位置,莫得选择,直接替换,不需要替换算法
常用的替换算法有(近期最少用 LRU 算法最常考):
随机算法 RANG:随机地确定替换的 Cache 块,实现比较简单,但未依据程序访问的局部性原理,可能命中率较低
先进先出算法 FIFO:选择最早调入的行进行替换,比较容易实现,但未依据程序访问的局部性原理,可能命中率较低
近期最少使用算法 LRU:依据程序访问的局部性原理,选择近期内长久未访问过的 Cache 行作为替换的行,平均命中率要比 FIFO 的高,是堆栈类算法
计数值的位数与 Cache 组大小有关,2 路时有一位 LRU 位,4 路时有两位 LRU 位(log)
图中左边阴影的数字是对应 Cache 行的计数值,右边的数字是存放在该行中的主存块号

计数器的变化规则:
命中时,所命中的行的计数器清零,比最大值低的计数器加 1,其余不变
未命中且还有空闲行时,新装入的行的计数器置 0,其余全加 1
未命中且无空闲行时,计数值为最大值的行的信息块被淘汰,新装行的块的计数器置 0,其余全加 1
当集中访问的存储区超过 Cache 组的大小时,命中率可能变得很低,如上例的访问序列变为 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, …,而 Cache每组只有 4 行,那么命中率为 0,这种现象称为抖动
最不经常使用算法
LFU:将一段时间内被访问次数最少的存储行换出每行也设置一个计数器,新行建立后从 0 开始计数,每访问一次,被访问的行计数器加 1,需要替换时比较各特定行的计数值,将计数值最小的行换出
提示:手算时可以把每个组作为一个队列,优先级高(要换)的元素放在队头,优先级低的在队尾,换块时取出队头元素,把新块按它的优先级插入队列
Cache 写策略
因为 Cache 中的内容是主存块副本,当对 Cache 中的内容进行更新时就需选用写操作策略使 Cache 内容和主存内容保持一致
现代计算机的 Cache 通常设立多级 Cache(通常为 3 级),假定设 3 级 Cache
按离 CPU 的远近可各自命名为 L1 Cache、L2 Cache、L3 Cache,离 CPU 越远,访问速度越慢,容量越大
指令 Cache 与数据 Cache 分离一般在 L1 级,此时通常为写分配法与写回法合用
选择题:采用指令 Cache 与数据 Cache 分离的主要目的是减少指令流水线资源冲突,取指和取数在不同 Cache 中寻找,不会发生冲突
写命中时
全写法(写直通法、write-through):
当 CPU 对 Cache 写命中时,必须把数据同时写入 Cache 和主存,替换时不需要写回内存
优点:这种方法实现简单,能随时保持主存数据的正确性;缺点:是增加了访存次数,降低了Cache 的效率
写缓冲:为减少全写法直接写入主存的时间损耗,在 Cache 和主存之间加一个写缓冲(Write Buffer)

CPU 同时写数据到 Cache 和写缓冲中,写缓冲再控制将内容写入主存
写缓冲是一个 FIFO 队列,写缓冲可以解决速度不匹配的问题;但若出现频繁写时,会使写缓冲饱和溢出
为了防止写缓存溢出,还可以在 Cache 和 DRAM 中再加一个更大的 L2 Cache,L2 与内存使用写回法
写回法 write-back:
当 CPU 对 Cache 写命中时,只修改 Cache 的内容,而不立即写入主存,只有当此块被换出时才写回主存
这种方法减少了访存次数,但存在不一致的隐患,采用这种策略时,每个 Cache 行必须设置一个标志位(脏位),以反映此块是否被 CPU 修改过
写不命中
写分配法 write-allocate:
先加载主存中的块到 Cache 中,然后更新这个 Cache 块
它试图利用程序的空间局部性,但缺点是每次不命中都需要从主存中读取一块
非写分配法 not-write-allocate:只写入主存,不进行调块
非写分配法通常与全写法合用,写分配法通常和写回法合用
考点追踪:Cache 的写策略(2011、2013、2016)
- 写回法:脏位(Dirty bit)是关键。2. 全写法:需要写缓冲(Write Buffer)减小延迟。3. 注意写缺失时的“写分配”策略。
综合应用题
某32位计算机,CPU主频为 800MHz,Cache 命中时的 CPI 为 4,Cache 块大小为 32B;主存采用 8 体交叉存储方式,每个体的存储字长为 32 位、存储周期为 40ns;存储器总线宽度为 32 位,总线时钟频率为 200MHz,支持突发传送总线事务。每次读突发传送总线事务的过程包括:送首地址和命令、存储器准备数据、传送数据。每次突发传送 32B,传送地址或 32 位数据均需要一个总线时钟周期。请回答下列问题,要求给出理由或计算过程。
CPU 和总线的时钟周期各为多少?总线的带宽(即最大数据传输率)为多少?
Cache 缺失时,需要用几个读突发传送总线事务来完成一个主存块的读取?
存储器总线完成一次读突发传送总线事务所需的时间是多少?
若程序
BP执行过程中共执行了 100 条指令,平均每条指令需进行 1.2 次访存,Cache 缺失率为 5%,不考虑替换等开销,则BP的 CPU 执行时间是多少?
解答:
CPU 的时间周期是
1s / 800MHz = 1.25ns,总线的时间周期是1s / 200MHz = 5ns;总线带宽为4B × 1s / 0.5ns = 800MB/sCache 一块是
32B而一次读突发传送总线事务也是32B,所以仅需要一次题目仅给出存储周期,没有给存储时间,所以存储器经过存储时间后才把数据发给总线
题目给的过程:送首地址和命令
5ns+ 存储器准备数据40ns + (8 - 1)5ns+ 传送数据(最后一次非重叠5ns)=85ns注意:要看题目给的信息,存储周期分为存储时间和恢复时间,其实在存储时间就可以拿到数据
因为题目没有给出详细的执行时间信息,所以 Cache 不命中时是先从内存放入 Cache 再访问 Cache 的模式
时间是:基本执行时间(
4 × 1.25ns × 100 = 500ns)+ 内存入 Cache 时间(100 × 120% × 5% × 85ns = 505ns)=1010ns
虚拟存储器
主存和联机工作的辅存共同构成了虚拟存储器,二者在硬件和系统软件的共同管理下工作
对于应用程序员而言,虚拟存储器是透明的,虚拟存储器具有主存的速度和辅存的容量,提高了存储系统的性价比
虚拟存储器的基本概念
虚拟存储器将主存和辅存的地址空间统一编址,构造出庞大的地址空间,用户可以自由编程,不必关心实际容量和位置
用户编程允许涉及的地址称为虚地址或逻辑地址,虚地址对应的存储空间称为虚拟空间或程序空间
实际的主存单元地址称为实地址或物理地址,实地址对应的是主存地址空间,也称实地址空间,虚地址比实地址要大很多

CPU 使用虚地址:
由辅助硬件找出虚地址和实地址之间的对应关系,并判断这个虚地址对应的存储单元内容是否已装入主存
若已在主存中,则通过地址变换,CPU 可直接访问主存指示的实际单元
若不在主存中,则把包含这个字的一页或一段调入主存后再由 CPU 访问
若主存已满,则采用替换算法置换主存中的一页或一段
思考:当运行一个很大的程序时,加载需要的部分,其他部分等使用时再加载进内存
页式虚拟存储器
页表
以页为基本单位的虚拟存储器称为页式虚拟存储器,虚拟空间与主存空间都被划分成同样大小的页,主存的页称为实页,虚存的页称为虚页
虚拟地址分为两个字段:虚页号和页内地址,虚拟地址到物理地址的转换是由页表实现的
页表是虚页号和实页号的对照表,它长久地存放在主存中,记录程序的虚页调入主存时被安排在主存中的位置

有效位也称装入位,用来表示对应页面是否在主存
若为 1,表示该虚拟页已调入主存,存放该页的物理页号(页框号)
若为 0,表示没有调入主存,可能存放该页的磁盘地址
脏位也称修改位,用来表示页面是否被修改过,虚存机制中采用回写策略
引用位也称使用位,用来配合替换策略进行设置

CPU 执行指令时,需要先将虚拟地址转换为主存物理地址:
每个进程都有一个页表基址寄存器,存放该进程的页表首地址
根据虚拟地址高位部分(虚拟页号)找到对应的页表项
若装入位为 1,则取出物理页号,和虚拟地址低位部分的页内地址拼接,形成实际物理地址
若装入位为 0,则说明缺页,需要操作系统进行缺页处理
优点:页面的长度固定,页表简单,调入方便;缺点:由于程序不可能正好是页面的整数倍,最后一页的零头将无法利用而造成浪费,并且页不是逻辑上独立的实体,所以处理、保护和共享都不及段式虚拟存储器方便
选择题:把虚拟地址转换为物理地址给 CPU 寻址,找不到对应的内存会发出错误,就知道是缺页了
快表(TLB)
依据程序执行的局部性原理,把常用页对应的页表项存放在高速缓冲器组成的快表(TLB)中,则可以明显提高效率;相应地把放在主存中的页表称为慢表(Page)
在地址转换时,首先查找快表,若命中,则无须访问主存中的页表,快表通常采用全相联或组相联方式
每个 TLB 项由页表表项内容加上一个 TLB 标记字段组成,TLB 标记用来表示该表项取自页表中哪个虚页号对应的页表项
TLB 标记的内容:
在全相联方式下就是该页表项对应的虚页号
组相联方式下则是对应虚页号的高位部分,而虚页号的低位部分用于选择 TLB 组的组索引
TLB + Cache 的多级存储系统

这是两级页表方式,虚页号被分成页目录索引和页表索引两部分,由这两部分得到对应的页表项
Cache 采用二路组相联方式,TLB 采用全相联方式,每一项都有一个比较器,下面是地址转换过程:
首先根据虚页号与每个 TLB 标记字段比较,若某项相等且有效位为 1,则直接转换成物理地址
若未命中,首先根据高 10 位在页目录找到页表的地址,然后根据中 10 位在页表拿到对应的物理地址
把虚拟号和物理地址加入 TLB 表,如果表满就使用某个替换算法进行替换
拿到物理地址后,要使用之前的 Cache 映射的方法进行获取数据

快表和慢表也可以同步进行,若快表中有此虚页号,使慢表的查找作废;可以做到访问主存速度几乎没有下降
在一个具有 Cache 和 TLB 的虚拟存储系统中,CPU 一次访存操作可能涉及 TLB、页表、Cache、主存和磁盘的访问
CPU 访存过程中存在三种缺失情况:
TLB 缺失:要访问的页面对应的页表项不在 TLB 中
Cache 缺失:要访问的主存块不在 Cache 中
缺页 Page:要访问的页面不在主存中

最好的情况是第 1 种组合,此时无须访问主存
第 2 种和第 3 种组合都需要访问一次主存
第 4 种组合需要访问两次主存
第 5 种组合发生缺页异常,需要访问磁盘,并且至少访问两次主存
Cache 缺失处理由硬件完成;缺页处理由软件完成,操作系统通过缺页异常处理程序来实现;而 TLB 缺失可用硬件或软件处理,比如操作系统有 TLB 缺失异常处理程序
考点追踪:TLB、页表与物理地址转换(2010、2011、2013、2015、2016、2017、2021、2022、2023、2025)
- TLB 命中则页表必命中;TLB 缺失页表可能命中。2. 缺页异常会引起磁盘 I/O(最费时)。3. 多级页表:减少了页表占用的连续内存空间,但增加了访存次数。4. 区分 Cache 块号、页框号与虚页号。
核心结论:联合访存的次数分析 (极高频)
- TLB 命中 -> Cache 命中:只需 1 次访存(Cache 访问)。
- TLB 命中 -> Cache 缺失:需要 2 次访存(Cache + 主存)。
- TLB 缺失 -> 页表命中 -> Cache 命中:需要 2 次访存(页表 + Cache)。
- TLB 缺失 -> 页表命中 -> Cache 缺失:需要 3 次访存(页表 + Cache + 主存)。
- 页表缺失 (缺页):涉及操作系统处理,需访问磁盘。
段式虚拟存储器
段式虚拟存储器中的段是按程序的逻辑结构划分的,各个段的长度因程序而异;把虚拟地址分为段号和段内地址
虚拟地址到实地址之间的变换是由段表来实现的,段表是程序的逻辑段和在主存中存放位置的对照表

段表的每行记录包含段号、装入位、段起点、段长等信息;段的长度可变,要给出各段的起始地址与段的长度
CPU 根据虚拟地址访存:
首先根据段号与段表基地址拼接成对应的段表行
根据该段表行的装入位判断该段是否已调入主存(1 在,0 不在)
已调入主存时,从段表读出该段在主存中的起始地址,与段内地址(偏移量)相加,得到对应的主存实地址
优点:段的分界与程序的自然分界相对应,具有逻辑独立性,易于编译、管理、修改和保护,也便于多道程序的共享
缺点:因为段长度可变,分配空间不便,容易在段间留下碎片,不好利用,造成浪费
段页式虚拟存储器
段页式虚拟存储器:把程序按逻辑结构分段,每段再划分为固定大小的页,对主存的调入、调出仍以页为基本传送单位
每个程序对应一个段表,每段对应一个页表,段的长度必须是页长的整数倍,段的起点必须是某一页的起点
虚地址分为段号、段内页号、页内地址三部分
CPU 根据虚地址访存:
首先根据段号得到段表地址
从段表中取出该段的页表起始地址,与虚地址段内页号合成,得到页表地址
从页表中取出实页号,与页内地址拼接形成主存实地址
优点:兼具页式和段式虚拟存储器的优点,可以按段实现共享和保护
缺点:在地址变换过程中需要两次查表,系统开销较大
虚拟存储器与 Cache 的比较
相同之处
最终目标都是为了提高系统性能,两者都有容量、速度、价格的梯度
都把数据划分为小信息块,并作为基本的传递单位,虚存系统的信息块更大
都有地址的映射、替换算法、更新策略等问题
依据程序的局部性原理应用快速缓存的思想,将活跃的数据放在相对高速的部件中
不同之处
Cache 主要解决系统速度,而虚拟存储器却是为了解决主存容量
Cache 全由硬件实现,是硬件存储器;而虚拟存储器由 OS 和硬件共同实现,是逻辑上的存储器(OS 程序员可见)
对于不命中性能影响,虚拟存储器系统不命中时对系统性能影响更大(Cache/主存 < 主存/硬盘)
CPU 与 Cache 和主存都建立了直接访问的通路,而辅存与 CPU 没有直接通路(必须先装入主存)
易混知识点
在虚拟存储器中,页面是设置得大一些好还是设置得小一些好?
页面不能设置得过大,也不能设置得过小
页面太小时,平均页内剩余空间较少,但页表会增大,且不能充分利用访存的空间局部性来提高命中率
页面太大时,可减少页表空间,但平均页内剩余空间较大,页面太大还会使页面调入/调出的时间较长
存取时间
就是存储周期 吗? 存取时间
是执行一次读操作或写操作的时间,分为读出时间和写入时间 读出时间是从主存接收到有效地址开始到数据稳定为止的时间
写入时间是从主存接收到有效地址开始到数据写入被写单元为止的时间
存储周期
是指存储器进行连续两次独立地读或写操作所需的最小时间间隔 所以存取时间
不等于存储周期 ,通常存储周期 大于存取时间 发生取指令 Cache 缺失的处理过程是什么?
程序计数器恢复当前指令的值
对主存进行读的操作
将读入的指令写入 Cache 中,更改有效位和标记位
重新执行当前指令
