层次化存储
空间局部性是被访问了相邻的可能还要被访问。
时间局部性是被访问了,可能会再次被访问。
虚拟存储体系由 主存-外存(辅存) 两级存储器构成
Cache- 主存-外存(辅存)叫三级存储结构
ROM,掉电安全
RAM,掉电丢数据
BIOS系统掉电不会丢失,一直存在,所以选A。
Cache
Cache性能分析与计算
-
命中率(Hit Rate)
-
命中率 = 命中次数 / 总访问次数。
-
-
平均访问时间
-
平均时间(t3) = 命中时间(命中率 (h)* Cache周期(t1)) + 缺失率(1-h) × 缺失惩罚(访问主存时间(t2))。
-
-
缺失类型
-
强制缺失(Compulsory Miss):首次访问数据必然缺失。
-
冲突缺失(Conflict Miss):因映射冲突导致的缺失(直接/组相联中存在)。
-
容量缺失(Capacity Miss):Cache容量不足导致。
-
了解一下主存与Cache的映射关系。
主存与Cache之间的映射关系由硬件直接完成,与程序员和操作系统都无关。
Cache的三大映射方式
1. 直接映射(Direct Mapped)
-
原理:主存块固定映射到Cache的唯一位置(如
Cache行号 = 主存块号 % Cache行数
)。 -
优点:硬件简单,访问速度快。
-
缺点:易冲突(不同主存块竞争同一Cache行)。
-
软考题:给定主存地址(标记位+行号+块内偏移),计算Cache命中位置。
2. 全相联映射(Fully Associative)
-
原理:主存块可存入Cache的任意位置。
-
优点:冲突率低。
-
缺点:查找需比较所有行的标记位(硬件成本高)。
-
应用场景:小容量Cache(如TLB)。
3. 组相联映射(Set Associative)
-
原理:Cache分组,主存块映射到特定组内的任意行(如2路组相联:每组2行)。
-
优点:平衡冲突率和硬件成本(最常用)。
-
计算题:
-
组号 = 主存块号 % 组数
-
标记位 = 主存块号 / 组数
-
当Cache满且需要调入新数据时,如何选择被替换的行?
策略 | 规则 | 特点 | 应用场景 |
---|---|---|---|
随机(RAND) | 随机选择一行替换 | 实现简单,性能不稳定 | 极少使用 |
FIFO | 替换最早调入的行 | 可能替换频繁使用的行 | 较少使用 |
LRU | 替换最久未使用的行 | 命中率高,硬件实现复杂 | 最常用(如4路组相联) |
LFU | 替换使用频率最低的行 | 需维护计数器,可能积累旧数据 | 特定场景 |
例题
Cache的命中率并不会随其容量增大而线性提高,当容量越大,提升率就越低,提升曲线越平缓。
全相联是任意地方都能映射,直接相连是映射到Cache的对应位置,组相连是分组对应,是前两个的折中。
软考高频考点
-
选择题
-
问:“2路组相联Cache,容量8KB,每行32B,主存地址32位,块内偏移占多少位?”
-
解:块内偏移 = log₂(32B) = 5位;组数 = 8KB/(2×32B) = 128组 → 组号占7位;标记位 = 32-5-7=20位。
-
-
-
简答题
-
比较直接映射和全相联映射的优缺点。
-
-
设计题
-
如何通过优化Cache行大小提升命中率?(权衡空间局部性与容量利用率)
-
自测题
-
某系统Cache命中率95%,命中时间2ns,缺失惩罚100ns,求平均访问时间?
-
答:2ns + 5%×100ns = 7ns。
-
-
为什么组相联映射能减少冲突缺失?
-
答:同一主存块可映射到组内多行,降低竞争概率。
-
主存编址计算
内存不够时可以横向扩容也可以纵向扩容
核心概念
1. 主存编址的基本单位
-
位(bit):最小单位,0或1。
-
字节(Byte):1 Byte = 8 bit(现代计算机的基本编址单位)。
-
字(Word):与CPU位数相关(如32位CPU的1 Word = 4 Byte)。
2. 关键术语
-
地址线(Address Bus):CPU通过地址线访问主存,
n
根地址线可寻址2^n
个单元。 -
数据线(Data Bus):决定每次读写的数据位数(如32位数据线一次传输4 Byte)。
-
存储容量:
存储单元数 × 每个单元的位数
(如64K×8位表示64K个单元,每单元8位)。
主存编址计算步骤
1. 确定地址空间
-
例:若地址线为20根,按字节编址,则:
-
可寻址空间 =
2^20 = 1MB
(因为2^20 Byte = 1MB
)。 -
地址范围:
0x00000 ~ 0xFFFFF
(十六进制)。
-
2. 计算芯片数量
-
需求容量 vs 芯片容量:
-
若需
64KB
主存,使用16K×4位
的存储芯片:-
数量 = (总容量) / (单芯片容量) =
(64K×8) / (16K×4) = 8片
。
-
-
连接方式:位扩展 + 字扩展(见下文)。
-
3. 地址分配与片选逻辑
-
地址线分配:
-
低位地址线连接芯片内部地址(如
16K=2^14
,需14根地址线A0~A13
)。 -
高位地址线通过译码器生成片选信号(如剩余
A14~A15
用于片选)。
-
-
片选信号:通过译码器(如2-4译码器)选择不同芯片组。
例题
题型1:计算主存容量
-
题目:CPU地址线24根,按字节编址,主存容量是多少?
-
解法:
-
可寻址单元数 =
2^24 = 16M
。 -
容量 =
16M × 1 Byte = 16MB
。
-
题型2:存储芯片扩展
-
题目:用
8K×8位
芯片扩展为32K×16位
主存,需多少芯片?如何连接? -
解法:
-
字扩展:容量从
8K→32K
,需32K/8K=4组
。 -
位扩展:位数从
8位→16位
,需16/8=2片/组
。 -
总芯片数 =
4组 × 2片/组 = 8片
。 -
连接图:
-
低位地址线
A0~A12
连接所有芯片(8K=2^13
)。 -
高位
A13~A14
通过译码器选择组(4组需2根线)。 -
数据线:每组2片分别提供高8位和低8位。
-
-
题型3:地址范围计算
-
题目:某存储芯片地址范围为
8000H~BFFFH
,求容量(按字节编址)。 -
解法:
-
计算地址跨度:
BFFFH - 8000H + 1 = 4000H
。 -
转十进制:
4000H = 2^14 = 16K
。 -
容量 =
16K × 1 Byte = 16KB
。
-
第一步:计算内存总容量
1. 确定地址范围跨度
-
起始地址:
A0000H
-
结束地址:
CFFFFH
-
地址跨度 = 结束地址 - 起始地址 + 1
CFFFFH - A0000H + 1 = 30000H
-
注意:
CFFFFH - A0000H = 2FFFFH
,再加1得到30000H
。
-
2. 将十六进制转换为十进制
-
30000H
转换为十进制:3 × 16^4 + 0 × 16^3 + 0 × 16^2 + 0 × 16^1 + 0 × 16^0 = 3 × 65536 = 196608 Byte
-
转换为KB(1KB = 1024 Byte):
196608 / 1024 = 192 KB
-
选项匹配:
D、192KB
。
3. 快速验证
-
十六进制
30000H
直接转换为十进制:-
30000H
=3 × 64K
=192KB
(因为10000H
=64KB
)。
-
第二步:计算所需芯片数量
1. 明确芯片容量
-
题目给出芯片规格:
64K×8bit
。-
64K
表示地址单元数(字扩展)。 -
8bit
表示每个单元的数据位数(位扩展)。
-
-
芯片容量 =
64K × 1 Byte
=64KB
(因为8bit = 1Byte
)。
2. 计算芯片数量
-
总内存容量 =
192KB
(第一步结果)。 -
单芯片容量 =
64KB
。 -
所需芯片数量 =
总容量 / 单芯片容量
=192KB / 64KB = 3片
。 -
选项匹配:
B、3
。
3. 连接方式说明
-
由于题目要求的是按字节编址,且芯片本身是
64K×8bit
(即64KB
),因此:-
无需位扩展(因为
8bit
已经满足字节编址要求)。 -
只需字扩展,将
3
片64KB
芯片的地址空间拼接为192KB
。
-