# 存储器概述
# 存储器分类
存储介质:
- 磁存储器:机械硬盘
- 半导体存储器:固态硬盘,内存条
- 光存储器:光盘
存取方式:
-
随机存储器:可按照地址随机读写数据存储单元,存取访问时间与存储单元的位置无关
-
顺序存储器:存储单元中的内容只能依地址顺序访问,访问速度与存储单元的位置有关
-
直接存储器:不必经过顺序搜索就能在存储器中直接存取信息的存储器,这类存储器兼有随机存储器和顺序存储器的访问特性。
(绕过 直接传输数据, 是外设与内存间直接传输数据的技术,无需 CPU 逐字节干预,但仍需指定内存地址(非搜索))
# 存储器技术指标
存储容量
可以存储的二进制信息总量,采用比特位或者字节表示
- 位表示: 以存储器中存储单元总数与存储字位数的乘积表示, 表示该芯片有 个单元,每个存储单元长度为 个二进制位
- 字节表示:以存储器中的单元总数表示,存储单元由 个二进制位组成,称为一个字节,用 表示, 表示该芯片由 个单元
存取速度
- 存取时间:启动一次存储器操作到该操作完成所经历的时间
- 存取周期:连续启动两次访问操作之间的最短时间间隔

- 存储器带宽:单位时间内存储器所能传输的信息量,一般而言,存取时间越短,数据位宽越大,存储带宽越高
# 存储系统层次结构
# 主存基本结构
主存是机器指令直接操作的存储器
在存储器芯片的规格(如 8×8、8×16、8×32)中,第一个数字通常表示 地址线的数量(或地址空间大小),第二个数字表示 数据线的位数(字长)

# 主存中数据的存放
# 存储字长和数据字长的概念
存储字长:指主存储器(内存)一次读写操作中传输的数据位数,即内存单元的宽度。例如,内存可能以 64 位为单位进行读写,即使 CPU 的数据字长是 32 位。
数据字长:指 CPU 一次能处理的二进制数据的位数,通常由 ALU(算术逻辑单元)的宽度决定。例如,32 位 CPU 的数据字长为 32 位,表示其能一次性处理 32 位的数据运算。
# 地址访问模式
存储字长都是字节的整数倍,主存通常按字节进行编址
按照访问存储单元的大小,主存地址可以分为字节地址,半字地址,字地址

字节地址逻辑右移一位得到半字地址,右移两位可得到字地址
不同的地址访问模式所使用的主存地址实际上都是字节地址, 在执行指令的时候可以将字节的低两位用于访问控制
- 采用字节访问模式,字节地址的低两位用于选择字存储单元中的哪一个字节
- 采用半字访问模式,字节地址的倒数第 位用于选择字存储单元中的哪个半字
MOV AL,[0x4]
,[AL]=0x00
MOV AX,[0x4]
,[AX]=0xEF00
MOV EAX,[0x4]
,[EAX]=0xABEF00
1MB 按照字节寻址 需要多少位地址线?
按照字节编址,需要 条地址线
1MB 按 16 位字寻址 需要多少位地址线
按照 位字寻址, 字
所以需要 条地址线
# 大端和小端
# 数据的边界对齐
- 字节数据不存在边界对齐问题
- 半字 字节 数据的起始字节地址的最低 位为 ,即地址是 的倍数
- 单字 字节 数据的起始字节地址的最低 位为 ,即地址是 的整数倍
- 双字 字节 数据的起始字节地址的最低 位为 ,即地址是 的整数倍、
# 半导体存储器
# 静态 MOS 存储器
以静态 存储元为基本单位组成的存储器称为静态 存储器
“静态” 指的是只要保持通电,其内部所存储的数据就可以保持不变,而不需要进行周期性地刷新;但是只要断电,数据就会消失
# 存储元
存储元是存储器中的最小存储单元,其作用是存储一位二进制信息
若干存储元组成一个存储单元,若干存储单元组成一个存储器
初始状态
读操作
行列选通信号都为有效高电平

将两个位线的输出信号经过差分放大器放大后,就可以根据电流方向的不同输出不同的数据信息
写操作
行列选通信号都为有效高电平

信息的保持
行列选通信号都为无效信号低电平
总结:
# 存储元扩展
同一时刻只能访问一位数据,而实际存储器均是以字节为基本单位的,如何扩展存储器的字长呢?
字长扩展
# 静态 MOS 存储器的结构
存储阵列
驱动器
每个行译码器输出信号都要同时驱动这一行上所有位存储体的 两个门控制
- 对于 个存储阵列并发,每一根行译码输出信号要驱动 个门控制,负载较大,用驱动增强负载功能
每个列译码器输出信号要打开 两个门控制
- 对于 位存储体需要驱动 个门控制,负载较大,用驱动增强负载功能
# 存储器芯片实例
写入时:
均有效(低电平),左侧的三态门打开,数据总线上的数据经输入数据控制逻辑写入存储器
读出时:
无效(高电平),右侧三态门打开,数据从存储器读出并由列 电路送入数据总线
# SRAM 读写时序
存储器由自己的读写周期特性,只有按照存储器的读写周期去访问存储器才能保证读写操作的正确性
习题
芯片的引脚通常包括以下几类:
- 地址线
- 数据线
- 控制信号线
- 电源和地线
地址线:,需要 根地址线
数据线: 根
控制信号线: 和 ,两根
共
# 动态 MOS 存储器
# 存储元

-
电容 没电表示二进制
-
电容 充满电表示二进制
读操作会使电容放电,原来存储的 变成 ,所以在读之后需要进行数据恢复
# 存储元扩展

、
- 预充电操作:将 这些线充到
- 访问操作:接着给出行选通信号。让每个电容上存储 或
- 信号检测:读入时,如果电容本来是 ,操作会使 的电压变成 ,电容变成 ;如果电容本来是 ,操作会使 的电压变成
- 数据恢复
- 数据输出 / 输入
# 动态 MOS 存储器的刷新
# 概念
最大刷新周期:从数据存入 开始,到数据丢失之前为止的这段时间
刷新周期: 实际完成两次完整刷新之间的时间间隔
刷新方式:按行刷新,为了缩短刷新周期,可减少存储阵列的行数,增加列数
# 刷新的方式
因为 在刷新时是不能响应 的访问的,因此 对 进行访问 和 内存控制器对 进行刷新就存在内存争用问题
集中刷新
分散刷新
异步刷新
# 动态 MOS 存储芯片实例
# 动态 MOS 存储器的读写周期
读周期中:
- 行地址必须于 有效前送到地址输入端
- 由于地址复用,因此 必须滞后于 ,直到列地址送入地址输入端为止
- 和 必须保持一定的宽度
- 信号为高电平,必须在 有效前建立
习题
# 主存的组织及与 CPU 的连接
# 存储器的扩展
# 位扩展
当存储芯片数据总线位宽小于 数据总线位宽时,采用位扩展的方式进行扩展
# 字扩展
当存储芯片容量不能满足存储器对存储容量的需求时,采用字扩展方式扩展存储器
# 字位同时扩展
当存储芯片的数据位宽和存储容量均不能满足存储器的数据位和存储容量要求时,可以采用字位同时扩展方式来组织存储器
- 首先通过位扩展满足数据位的要求
- 再通过字扩展满足存储总容量的要求
例题
# 存储器接口设计举例
画出地址译码方案
总容量:
的存储容量:
的存储容量:
其他的存储容量:
因为存储芯片 和 的存储容量不能满足存储器对存储容量的要求,所以需要字扩展
地址译码采用 作为区域单元,则将 的存储空间分为 个
所以需要 根地址线用于区域选择译码;剩下的 需要 根地址线;正好总共 根地址线
如果 ROM 和 RAM 存储器芯片都采用 的芯片,试画出存储器与 CPU 的连接图
注意 是只读存储器,没有读写 控制端
如果 ROM 存储器芯片采用 的芯片,RAM 存储器芯片采用 的芯片,试画出存储器与 的连接图
因为 的芯片只需要 位地址线,所以多出来的一根地址线 用于选择使能端
如果 ROM 存储器芯片采用 的芯片,RAM 存储器芯片采用 的芯片,试画出存储器与 的连接图
# 并行主存系统
提高主存的存取速度的方法:
- 使用高速元件来提高主存的访问速度
- 通过存储器的并行工作来提高主存的访问速度
双端口存储器
单体多字存储器
多体交叉存储器
习题
# 高速缓冲存储器
# cache 工作原理
主存一般采用容量大、功耗较小、成本较低的同步动态随机存取存储器
静态随机存取存储器 的容量小、功耗大、成本高,但 的访问速度远高于
因此,为了提升 访问主存的性能,通常会在 与主存之间添加一个 作为高速缓冲存储器
- 将主存中经常访问或即将访问的数据,复制一份调度到 中,使得大部分数据访问都可以在 中进行,从而提升系统性能
- 采用这种方法的主要原因是 执行的程序具有较强的程序局限性
# 程序局限性
在一段时间内,整个程序的执行仅限于一个较小的局部范围内
# 时间局限性
若程序在某个时刻访问了一个存储位置,该位置在未来可能会被多次访问
# 空间局限性
若程序访问了某个存储位置,则其附近的存储位置也可能被访问

# cache 的基本概念–cache 系统的性能评价
上图的情况下,数据访问时间称为命中访问时间,记作
包括
- 内的查询时间
- 的访问时间
上图的情况下,数据访问时间称为缺失补偿
包括
- 内的查找时间
- 内存访问时间,较长,记作 (一般用 表示缺失补偿)
- 访问时间
为了便于快速查找,主存和 都被划分成若干个固定大小的数据块,每个数据块又包含若干个字
预读策略:出现数据缺失的情况,则需要将缺失数据所在的数据块从慢速主存载入 中(缺失数据相邻的数据也会随着数据块一起载入 )

数据块的地址由地址块和块内偏移地址两部分构成
命中率
程序运行期间命中 的次数记作 ,从主存中访问信息的次数记作 ,命中率记作
缺失率
主存系统的平均访问时间
命中情况下的访问时间记作 ,数据缺失情况下的访问时间记作 , 主存系统的平均访问时间记作
访问效率
一般以 为宜
# cache 的读、写流程与关键技术
# 相联存储器 CAM
通常用于 的快速查找,也可用于在虚拟存储器中存放段表、页表和 表
是一种按内容进行访问的存储器,用于存放查找表,其内部存储的基本数据单元是键值对
的输入是检索关键字 ,输出是该关键字对应的 值
# 地址映射
# 直接相联映射
(注意:上述的 容量是在不考虑脏数据位的情况下)
要读取主存中的某个信息,通过该信息的主存地址的区内数据块号( 行号)直接索引到对应的 行
- 若 行中保存的主存分区号与信息的主存地址中的主存分区号相同且有效位为 时,数据命中。根据信息的主存地址中的数据块内偏移,从该 行中的数据块副本中读取信息
- 若 行中保存的主存分区号与信息的主存地址中的主存分区号不同或有效位为 时,数据缺失。 根据该信息的主存地址,将主存中该信息所在的数据块载入相应 行,相应地,还要将该 行的有效位置 ,以及将该 行的主存分区号设置为该信息的主存地址中的主存分区号,同时将信息送入
硬件实现
假设主存地址长度为 位, 块大小为 , 行
直接映射特点
- 每个主存数据块映射到 中的一个固定的行
- 利用率低,命中率低,冲突高(未满也可能发生数据块替换)
- 成本低,适合于大容量 使用
- 替换算法简单。访问不命中则直接替换相应 行即可;但是,若该 行存在脏数据,需要将脏数据写入二级存储器以保证数据一致性
习题
习题一
计算机字长为 位,主存容量为 ,按字节编址, 采用直接映射, 数据存储体容量为 , 块长度为 个字
-
问主存字节地址的划分情况
-
块(指的是数据块)的长度为 ,所以块内偏移
- 数据块的大小和主存数据块的大小是一样的,所以如果题目中给的是主存数据块的大小,也是可以求出块内偏移的
-
行数为 ,所以区行内地址
-
因为主存容量为 ,所以地址线为 位,即主存地址为 位
- 注意区分计算机字长和主存地址位数
-
区地址位数为
-
-
设 的初始状态为空,若 依次访问主存,从 到 号字单元,并从中读出 个字(假设访问主存一次读出一个字),并重复此顺序 次,计算 访问的命中率
有 行,每行有 个字
读出的 个字会存储在 的前 中,每一行的第一次读访问都不命中,其余的所有都命中
命中率
习题二
习题三
注意:在写回策略中需要在 中增加脏位
习题四
-
数据 的总容量为
对主存地址分析:
- 主存地址 ,所以内存地址位数为
- 行数为 ,所以
- 块大小为 ,所以
那么 的容量为
-
所处的主存地址为
所处的主存地址为
中对应的行号为 主存块号 行数
所处的 行号为
所处的 行号为
-
行优先存储:
因为 块大小为 ,所以每个 数据块可以存储 个 型数据
顺序访问时,第一次访问数据缺失,后 次访问命中
所以命中率为
列有限存储:
每次都不命中,命中率为
# 全相联映射
硬件实现
假设 块大小为 ,共 行,主存按字访问,主存地址长度为 位
习题一
习题二
# 组相联映射
- 若整个 划分为 个组,变成全相联映射
- 若每个 组只包含一个 行,变成直接映射
硬件实现
# 不同映射方式比较
习题
# 替换算法
习题
假定某个程序访问 块信息, 分为 行,采用全相联方式组织。程序访问的块地址流依次为 ,分析 和 算法的访问过程,并计算命中率
# 写入策略
数据命中的情况
数据缺失的情况
# cache 的分类及应用
统一
指令和数据都存放在同一个 中
- 优点:设计和实现简单
- 缺点:对于指令预取技术,存取数据 与 取指令会发生冲突
分离
将 分成各自独立的数据 与指令
多级
将 集成到 中
软件
- buffer cache
- web cache
# 虚拟存储器
# 虚拟存储器的工作原理
虚拟存储器充分利用了程序局限性
加载程序时并不直接将程序和代码载入主存,而仅仅在相应的虚拟地址转换表中登记虚拟地址对应的磁盘地址
# 页式虚拟存储器
# 概述
主存和辅存之间按页交换信息
- 虚拟地址中的页称为虚拟页
- 主存空间中的页称为物理页
页式存储器采用 “请求分页” 的思想
- 进程中活跃的页面从辅存调入主存,不活跃的页面留在辅存
- 当访问的某个信息不在主存中发生缺页异常,从辅存将缺失页面调入主存
因为页式虚拟存储器的缺页处理代价远大于 数据缺失的处理代价,因此页面的大小设置较大;主存和辅存之间采用全相联映射,以提高命中率
在写操作时,因为辅存访问速度远小于主存访问速度,所以采用写回法,而不是写穿法。
# 虚拟地址划分

虚拟地址被划分成虚拟页号 和 虚拟页偏移
物理地址被划分成物理页号 和 物理页偏移
和 的位数决定了页面的大小,因为虚拟页和物理页大小相同,所以二者位数相同
# 页表
页表是保存虚拟页号 和物理页号 对应关系的查找表
页表常驻内存,属于进程控制信息
页表在主存中的首地址记录在页表基址寄存器 中,进行进程切换时只需要简单地切换 的值就可以实现页表的快速切换
关于虚拟存储器的常见概念:
- 虚拟地址
- 物理地址
- 页表项
- 页表项地址
虚拟地址转换成物理地址的过程:
如果访问对应页时触发缺页异常,由操作系统的缺页异常处理程序负责将磁盘上对应的页载入主存,并同时更新页表项。
习题
32 位虚拟地址空间的页表规模?页面大小为 4K;页表项大小为 4 字节
则:
一个进程地址空间有
页
其页表需要占
页
注意:页表项数量和虚拟页号对应
# 虚拟存储器访问流程
# 结合 cache 的虚拟存储器访问流程
在不发生缺页的情况下:
- 最好的情况:页表在 中命中,数据也在 中命中
- 最坏的情况:页表缺失,数据也缺失,需要访问主存两次才能访问数据
在发生缺页时:
- 需访问极慢速的磁盘才能获取数据
# 利用 TLB 加速虚拟存储器地址转换
转换旁路缓冲区 ,用来缓冲经常访问的页表项
本质上是一个容量较小的 ,为提高查找速度,大多采用全相联或组相联方式,且采用随机替换算法
全相联方式
组相联方式
在包含快表和慢表的页式虚拟存储系统中,在进行地址转换时,往往会同时查快表和慢表
- 快表是按内容访问
- 慢表是按地址访问