# 1. 存储器层次结构
# 1.1. 基本概念和主存储器
记忆单元Cell
: 具有两种稳态的表示 0 和 1 的物理器件存储单元Adrressing Unit
: 主存中相同地址的位构成存储体Bank
: 所有存储单元构成一个存储体编址方式Addressing Mode
: 字节编址,按字编址存储器地址寄存器Memory Address Register
: 存放主存地址存储器数据寄存器Memory Data Register
: 存放主存数据
# 1.2. 存储器分类
- 按存取方式分类
- 随机存取存储器 Random Access Memory
- 地址译码时间相同,如内存
- 顺序存取存储器 Sequential Access Memory
- 数据按顺序从存储载体的始端读出,如磁带
- 直接存取存储器 Direct Access Memory
- 直接定位到要读写的数据块,在读写数据块时按顺序进行,如磁盘
- 相联存取存储器 Content Addressed Memory
- 按内容检索到存储位置进行读写,如快表
- 按存储介质分类
- 半导体存储器
- 磁表面存储器
- 光存储器
- 按信息的可更改性分类
- 读写存储器
- 只读存储器
- 按断点后信息的可保存性分类
- 非易失性存储器
- 易失性存储器
- 按功能、容量、速度、所在位置分类
- 寄存器 (Register)
- 封装在 CPU,存放当前正在执行的指令和使用的数据
- 速度快,容量小
- 高速缓存 (Cache)
- CPU 内部或附件,存放当前要执行的局部程序段和数据
- 内存储器 (主存 Main Memory)
- CPU 之外,存放已被启动的程序和所用的数据
- 外存储器
- 主机之外,存放暂不运行的程序、数据或存档文件
# 1.3. 主存的结构
内存中存放的是程序及其数据
CPU 在执行指令时访问主存
# 1.4. 计算机存储器的层次结构
工作过程:
- CPU 运行时,需要的操作数大部分来自寄存器
- 如需要从 (向) 存储器中取 (存) 数据,先访问 cache
- 如操作数不在 cache,则访问 RAM
- 如操作数不在 RAM,则访问硬盘
# 1.5. 内存储器的分类和应用
1 | graph LR |
SRAM: 用作 cache
- 用 MOS 管多,功耗大,集成度低
- 只要加上电源,信息就能一直保持
- 对电器干扰相对不很敏感
- 比 DRAM 更快,也更贵
DRAM: 用作主存储器
- 用 MOS 管少,功耗低,集成度高
- 每隔一段时间必须刷新一次
- 对电器干扰比较敏感
- 比 SRAM 慢,但便宜
Flash ROM: 用作 BIOS
- 在没有电流供应的条件下也能长久保持数据
# 1.5.1. 只读存储器 (ROM)
flash memory
:兼具 RAM 和 ROM 的优点,功耗低,集成度高,不需要后备电源。
# 1.5.2. 半导体 RAM 的组织
1 | graph LR |
存储器芯片:存储体 + 外围电路 (地址译码和读写控制)
存储体 (Memory Bank):存储单元的集合,由记忆单元构成的存储列阵
# 1.5.2.1. 存储器内结构
- 一维编码
字片式存储体阵列组织
对于 m 位地址,则地址译码驱动选择线的条数为 条
一般 SRAM 为字片式芯片,只在 x 方向上译码,同时读出字线上所有位
- 二维编码
位片式存储体阵列组织
对于 m 位地址,则地址译码驱动选择线的条数为 条
位片式在字方向和位方向扩充,需要有片选信号
为什么每出现新一代存储器芯片,容量至少提高到4倍?
行地址和列地址分时复用,每出现新一代存储器芯片,至少要增加一根地址线每加一根地址线,则行地址和列地址各增加一位,所以行数和列数各增加一倍。因而容量至少提高到 4 倍。
# 1.5.2.2. 芯片扩展技术
- 字扩展 (位数不变,扩充容量)
- 位扩展 (字数不变,位数扩展)
- 字位同时扩展 (交叉编址和连续编址)
以 128MB 的 DRAM 为例,采用 8 片
主存地址为 为 27 位
片内地址为 24 位,与高 24 位主存地址相同
内存低三位地址,共 8 个进行片选
# 1.5.3. DRAM 芯片的刷新
刷新周期
:从上次对整个存储器刷新结束到下次对整个存储器全部刷新一遍为止的时间间隔,为电容数据有效保存期的上限 (64ms)存取周期
:即刷新一行的时间
- 集中刷新
前一段时间正常读 / 写,后一段时间停止读 / 写,集中逐行刷新。
特点:集中刷新时间长,不能正常读 / 写 - 分散刷新
前一段用于正常读 / 写,后一段刷新操作
特点:不存在死区,但每个存储周期加长
3. 异步刷新
结合上述两种方式,每隔 64ms / 行数时间刷新一行
特点:效率高
# 1.5.4. CPU 与存储器之间的通信方式
- 异步方式(握手信号)
- CPU 送地址到地址线,主存进行地址译码
- CPU 发读命令,然后等待存储器发回 “完成” 信号
- 主存收到读命令后开始读数,完成后发 “完成” 信号给 CPU
- CPU 接收到 “完成” 信号,从数据线取数
- 同步方式
- CPU 和主存由统一时钟信号控制,无需应答信号,如 “完成”
- 主存总是在确定的时间内准备好数据
- CPU 送出地址和读命令后,总是在确定的时间取数据
- 存储器芯片必须支持同步方式
# 1.5.5. PC 机主存储器的物理结构
由若干内存条组成
内存条是将若干 DRAM 芯片焊接在一起
# 1.5.6. 存储器芯片和 CPU 的连接
** 通过总线连接 **
**ROM 区和 RAM 区的划分 **
- 主存空间包括 ROM 和 RAM 区
- ROM 区存放 BIOS 系统程序,选用 ROM
- RAM 区存放用户程序,选用 RAM
- 选择存储芯片的类型和数量时,必须先确定好 ROM 和 RAM 区的地址范围
CPU地址线A15~A0,数据线D7~D0,WR为读/写信号,MREQ为访存请求信号。0000H~3FFFH为BIOS区,4000H~FFFFH为用户程序区。用8K×4位ROM芯片和16K×8位RAM芯片构成该存储器,要求说明地址译码方案,并将ROM芯片、RAM芯片与CPU连接。
因为 0000H~3FFFH 为 BIOS,故 ROM 区高两位总是 00,低 14 位为全译码。
ROM 区大小为:214×8 位 = 16K×8 位 = 16KB,ROM 芯片数为:
16K×8 位 / 8K×4 位 = 2×2 = 4,字方向扩展 2 倍,位方向扩展 2 倍。
ROM 芯片内地址位数为 13 位,连到 CPU 低 13 位地址线 A12~A0。
因为 4000H~FFFFH 为用户程序区,故 RAM 区高两位是 01、10、11,低 14 位为全译码。RAM 区大小为:3×214×8 位 = 3×16K×8 位 = 48KB。
RAM 芯片数为:
48K×8 位 / 16K×8 位 = 3×1 = 3,字方向上扩展 3 倍,位方向上不扩展。
RAM 芯片内地址位数为 14 位,连到 CPU 低 14 位地址线 A13~A0。
# 1.5.7. 提高 DRAM 存储器速度
- 采用芯片内部行缓冲
- 双口存储器 (同时进行两个数据的读 / 写)
- 多模块存储器
- 连续编址多模块存储器
一个模块读完进入下一模块 - 交叉编址多模块存储器
模块间交替进行
- 连续编址多模块存储器
- 引入 Cache
# 1.6. 高速缓冲存储器 (Cache)
# 1.6.1. 层次化存储器结构
数据总是在相邻两层之间复制传送
# 1.6.2. 程序的局部性特征
- 在较短的时间间隔中,程序产生的地址往往集中在某一很小的范围内。
程序具有局部性特征的原因
指令:指令按序存放,地址连续,循环程序段或子程序段重复执行
数据:连续存放,数组元素重复、按序访问
特性
- 时间局部性:刚被访问的存储单元很可能不久会被访问
- 空间局部性:刚被访问的存储单元的邻近单元很可能不久会被访问
# 1.6.3. Cache 映射 (Cache Mapping)
定义
:把主存块映射到 Cache 槽
块内偏移:(block)
index:Cache 行号
tag:标记
# 1.6.3.1. 直接映射
Cache 行号 = 主存行号 mod Cache 行数
总容量(Total Capacity):
总容量是指整个缓存的物理存储能力,表示缓存可以存储的最大数据量。
它通常以字节(或位)为单位来度量,用于表示缓存的总大小。
总容量包括缓存存储数据所需的所有内存,包括标签存储、索引存储和数据存储。总容量的大小通常是根据硬件设计和系统要求来确定的。
数据容量(Data Capacity):
数据容量指的是缓存中实际用于存储数据的部分,即用于存储有效数据的容量。
数据容量通常小于总容量,因为缓存还需要额外的存储用于标签(tag)和索引(index)等元数据信息。
数据容量表示缓存中可用于存储被缓存数据的存储区域。
# 1.6.3.2. 全相联映射
# 1.6.3.3. 组相联映射
# 1.6.4. 替换算法
# 1.6.4.1. 先进先出 (first in first out)
- 总是把最先进入的那一块淘汰掉
- FIFO 不是堆栈算法,即命中率不随组的增大而提高
# 1.6.4.2. 最近最少用 (least-recently used)
- 总是把最近最少用的那一块淘汰掉
- LRU 是堆栈算法,命中率随组的增大而提高
举例
假定计算机系统有一个容量为32Kx16位的主存,假定主存按字编址,每字16位。且有一个4K字的4路组相联Cache,主存和Cache之间的数据交换块的大小为64字。假定Cache开始为空,处理器顺序地从存储单元0、1、…、4351中取数,一共重复10次。设Cache比主存快10倍。采用LRU算法。试分析Cache的结构和主存地址的划分。说明采用Cache后速度提高了多少?采用MRU算法后呢?
- 每块 64 字,4352/64=68,所以主存单元 0-4351 对应前 68 块(0-67 块),所以访问过程实际上是对前 68 块连续访问 10 次。
# 1.6.4.3. 最不常用 (least-frequency used)
# 1.6.4.4. 随机替换 (Random)
# 1.6.5. 写策略 (Cache 一致性问题)
因为 Cache 中的内容是主存块副本,当对 Cache 中的内容进行更新时,就存在 Cache 和主存如何保持一致的问题。
- 写命中(Write Hit):要写的单元已经在 Cache 中
- Write Through :同时写 Cache 和主存单元
- Write Back :在缺失时一次写回 Cache 块,每块有个修改位
- 写不命中(Write Miss):要写的单元不在 Cache 中
- Write Allocate (写分配) 将主存块装入 Cache,然后更新相应单元
- Not Write Allocate (非写分配) 直接写主存单元,不装入主存块到 Cache
# 1.7. 虚拟存储器
# 1.7.1. 虚拟存储系统的基本概念
# 1.7.1.1. 虚拟存储技术的实质
- 程序员在比实际主存空间大得多的逻辑地址空间中编写程序
- 程序执行时,把当前需要的程序段和相应的数据块调入主存,其他暂不用的部分存放在磁盘上
- 指令执行时,通过硬件将逻辑地址(也称虚拟地址或虚地址)转化为物理地址(也称主存地址或实地址)
- 在发生程序或数据访问失效时,由操作系统进行主存和磁盘之间的信息交换
通过页表建立虚拟空间和物理空间的映射,每次只将当前所需的代码和数据装入主存物理空间
发生缺页时,从磁盘物理空间调入新页
# 1.7.2. 虚拟存储器管理
# 1.7.2.1. 虚拟存储器实现方式
- 分页式
- 分段式
- 段页式
# 1.7.2.2. 主存磁盘层次
和 CPU (Cache) 和主存层次相比:
页大小比 Cache 中 Block 大得多!2KB~64KB
采用全相联映射
通过软件来处理 “缺页”
采用 Write Back 写策略
地址转换用硬件实现
# 1.7.2.3 分页
基本思想:
- 内存被划分为固定长且比较小的存储块
- 进程也被划分为固定长的程序块
- 操作系统为每个进程生成一个页表
- 通过页表实现逻辑地址向物理地址的转换
Virtual Address
Physical Address
# 分页式系统
虚拟地址由虚页号和页内偏移量组成
物理地址由实页号和页内偏移量组成
页表结构
页表包括装入位 (Valid),修改位 (Dirt),使用位,存取方式位,实页号位等
# 信息访问的异常情况
- 缺页 (page fault)
产生条件:Valid=0
处理:从磁盘读信息到内存,若内存已满,则先从内存选择一页替换 - 保护违例 (protection_violation_fault)
产生条件:当 Access Rights 与指定操作不符
# 快表 (Translation Lookside Buffer)
减少到内存查页表的次数