组成原理-存储Cache 和页式虚拟存储器
Posted Mount256
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了组成原理-存储Cache 和页式虚拟存储器相关的知识,希望对你有一定的参考价值。
文章目录
0 基本知识
0.1 主存储器
0.1.1 随机存储器 RAM
特点 | SRAM(静态) | DRAM(动态) |
---|---|---|
存储信息 | 触发器 | 电容 |
破坏性读出 | 否 | 是 |
需要刷新 | 不要 | 需要(分散刷新、集中刷新、异步刷新) |
地址传送 | 行、列地址同时送 | 行、列地址分开两次送(地址复用技术) |
读写速度 | 快 | 慢 |
成本 | 高 | 低 |
用途 | Cache | 主存 |
0.1.2 只读存储器 ROM
- EPROM、EEPROM、Flash(U盘)
- SSD(固态硬盘)
0.1.3 串行访问存储器
- 磁带、磁盘、光盘(CD-ROM)
补充:多模块存储器
- 高位交叉存储器:高位地址表示体号,低位地址表示体内地址
- 低位交叉存储器:低位地址表示体号,高位地址表示体内地址
0.2 字长
-
字长:用于表示 CPU 内部通用寄存器的宽度。字长包括机器字长、指令字长、存储字长,必须为字节(8 位)的整数倍。
-
机器字长:机器进行一次整数运算所能处理的二进制数据的位数,即 CPU 位数,或简称为字长。
【注】操作系统位数:操作系统可寻址位数(小于等于 CPU 位数)。32 位处理器只能装 32 位操作系统而不能装 64 位操作系统,64 位处理器能装 32 或 64 位操作系统。
名称 | 16 位机器(CPU)中的位数 | 32 位机器(CPU)中的位数 | 64 位机器(CPU)中的位数 |
---|---|---|---|
位 (bit, b) | 1 | 1 | 1 |
字节 (byte, B) | 8 | 8 | 8 |
半字 (1B/2B/4B) | 8 | 16 | 32 |
字 (2B/4B/8B,机器字长) | 16 | 32 | 64 |
双字 | 32 | 64 | 128 |
四字 | 64 | 128 | 256 |
-
指令字长:一个指令字中包含的二进制位数。
-
存储字长:一个存储单元存储的二进制位数。
指令字长一般取存储字长的整数倍,若指令字长等于存储字长的 2 倍,则需要 2 个访存周期来取出一条指令;若指令字长等于存储字长,则取指周期等于机器周期。
补充:不同机器下的数据类型长度
类型 | 16 位机器 | 32 位机器 | 64 位机器 |
---|---|---|---|
char | 8 | 8 | 8 |
short | 16 | 16 | 16 |
int | 16 | 32 | 32 |
long | 32 | 32 | 32 |
long long | 64 | 64 | 64 |
float | 16 | 32 | 32 |
double | 64 | 64 | 64 |
补充:以 2 为底的单位
在计算机组成原理课程中,使用 K、M、G、T 均表示以 2 为底的单位。如 2K 个存储单元的意思是 2048 个存储单元,而不是 2000 个。但是,对于磁盘的存储容量及数据传输率,依然使用以 10 为底的单位。
单位 | 大小 | 十六进制数 |
---|---|---|
K | 210 | 400H |
M | 220 | 10,0000H |
G | 230 | ~ |
T | 240 | ~ |
补充:存储单位
注意!!!408 考试使用 KB、MB、GB、TB 表示 2 为底的存储单位!!!
注意!!!408 考试使用 KB、MB、GB、TB 表示 2 为底的存储单位!!!
注意!!!408 考试使用 KB、MB、GB、TB 表示 2 为底的存储单位!!!
10 为底的存储单位 | 2 为底的存储单位 |
---|---|
KB = 103B | KiB = 210B |
MB = 106B | MiB = 220B |
GB = 109B | GiB = 230B |
TB = 1012B | TiB = 240B |
【例】128 MB = 128 * 220 B = 27 * 220 B = 227 B
16MB = 16 * 220 B = 24 * 220 B = 224 B
0.3 存储容量
存储容量 = 存储单元个数 * 每个存储单元的长度(位数,又称为存储字长)
【例 1】存储器容量为 2M * 8 位,表示该存储器有 2 * 220 = 221 个存储单元(若为 SRAM,则有 21 根地址线),每个存储单元存放 8 位二进制数据(有 8 根数据线,存储字长为 8 位,即 1 字节),存储容量为 2M * 1B = 2MB。
【例 2】存储器容量为 8K * 16 位,表示该存储器有 8 * 210 = 213 个存储单元(若为 SRAM,则有 13 根地址线),每个存储单元存放 16 位二进制数据(有 16 根数据线,存储字长为 16 位,即 2 字节),存储容量为 8K * 2B = 16KB。
- 设 A 存储器容量为 x1 * y1 位,B 存储芯片容量为 x2 * y2 位,则组成 A 存储器所需要的 B 芯片片数为
(x1 * y1)/(x2 * y2)
【例 3】16 片 2K * 4 位的存储芯片,可设计为多少存储容量的 16 位存储器?
设存储单元个数为 M,则有:
(M * 16) / (2K * 4) = 16
,解得 M = 8K。
【例 4】内存按字节编址,地址从 90000H 到 CFFFFH,若用存储容量为 16K * 8 位芯片构成该内存,则需要多少块芯片?
存储单元个数为 D0000H - 90000H = 40000H = 4 * 164 = 218 = 28 * 210 = 256K,且内存按字节编址(8 位),所以有:
(256K * 8) / (16K * 8) = 16
,即需要 16 块芯片。
【例 5】某 32 位机器的内存按字编址,地址从 90000H 到 CFFFFH,若用存储容量为 16K * 8 位芯片构成该内存,则需要多少块芯片?
存储单元个数为 D0000H - 90000H = 40000H = 4 * 164 = 218 = 28 * 210 = 256K,且内存按字编址(每个存储单元大小为 32 位),所以有:
(256K * 32) / (16K * 8) = 64
,即需要 64 块芯片。
补充:主存容量的扩展
- 位扩展法:8K * 1b --> 8K * 8b
- 字扩展法:16K * 8b --> 64K * 8b
- 字位同时扩展法:16K * 4b --> 64K * 8b
0.4 磁盘的平均存取时间
- 设磁盘转数为 r 转/秒,每条磁道容量为 N 字节,则磁盘传输速率 = r * N
【注】对于磁盘,K、M、G、T 是以 10 为底的单位,而不是以 2 为底!
1K = 103,1M = 106,1G = 109,1T = 1012
。比如 20MB/s = 20 * 106 B/s ≠ 20 * 220 B/s。
(一个扇区的)平均存取时间 = 寻道时间 + 旋转延迟时间(磁头定位到所在扇区的时间)+ 传输时间(磁头扫过一个扇区所用的时间)
- 默认情况下:
旋转延迟时间 = (旋转一圈的时间 / 2) = (1 / 磁盘转数) / 2
传输时间 = (旋转一圈的时间 / 每条磁道的平均扇区数) = (一个扇区的大小 / 数据传输率)
【注】因为在定位过程中,最多旋转 1 圈,最少不用旋转(0 圈),所以在平均情况下,需要旋转半圈,时间需除于 2。
相关例题
【例 1】设磁盘转速为 7200 转/分,平均寻道时间为 9ms,每条磁道的平均扇区数为 400,则访问一个扇区的平均存取时间是多少?
- 旋转一圈的时间 = (60s / 7200) * 1000 = 8ms,旋转延迟时间 = 1/2 * 旋转一圈所用时间 = 4ms
- 传输时间 = (60s / 7200) / 400 * 1000 = 0.02ms
- 寻道时间 = 9ms
- 平均存取时间 = 寻道时间 + 旋转延迟时间 + 传输时间 = 9ms + 4ms + 0.02ms = 13.02ms
【例 2】设磁盘的转速为 10000 转/分,平均寻道时间为 6ms,磁盘传输速率为 20MB/s,磁盘控制器延迟为 0.2ms,读取一个 4KB 扇区所需的平均时间是多少?
- 旋转一圈的时间 = (60s / 10000) * 1000 = 6ms,旋转延迟时间 = 1/2 * 旋转一圈所用时间 = 3ms
- 传输时间 = 读取时间 + 延迟时间 = (4KB) / (20MB/s) * 1000 + 0.2 = 0.2ms + 0.2ms = 0.4ms
- 寻道时间 = 6ms
- 平均存取时间 = 寻道时间 + 旋转延迟时间 + 传输时间 = 6ms + 3ms + 0.4ms = 9.4ms
1 高速缓冲存储器(Cache)
1.1 组相联映射
将 Cache 分为 Q 个大小相等的组,每组有 r 个 Cache行,称为 r 路组相联。
Cache 组号 = 主存块号 mod Cache 组数 (Q)
例 1(按字节编址)
【假设】
- 某计算机的主存地址空间为 256MB,按字节编址(1B),则有 256MB/1B = 256M = 228 个存储单元,地址位数为 28
- 一个主存块大小为 64B(即 Cache 行长为 64B),则一个主存块的存储单元个数为 64B/1B = 64
- Cache 有 16 行,又已知 Cache 行长为 64B,二路组相联,一共 16/2=8 组
【解答】
- 主存的物理地址的结构:
Cache 一共 23 = 8 组,所以组号占 3 位;主存块(行长)存储单元个数为 26 = 64,所以块内地址占 6 位;因此标记占 28-3-6=19 位。
标记 | 组号 | 块内地址 |
---|---|---|
19b | 3b | 6b |
- Cache 结构(组号、行号不是 Cache 的组成部分):
(组号) | (行号) | 有效位 | 标记位(Tag) | 数据(行长) |
---|---|---|---|---|
(0) | (0) | 1b | 19b | 64B |
(0) | (1) | 1b | 19b | 64B |
(1) | (2) | 1b | 19b | 64B |
(1) | (3) | 1b | 19b | 64B |
(…) | (…) | … | … | … |
(…) | (…) | … | … | … |
(7) | (14) | 1b | 19b | 64B |
(7) | (15) | 1b | 19b | 64B |
- Cache 行位数 = 标记阵列位数 + Cache 行长 = 1 + 19 + 64 * 8 = 532
- Cache 总容量 = Cache 总行数 * Cache 行位数 = 16 * (1 + 19 + 64 * 8) b = 8512b
【注】有些题目中, Cache 的容量大小指的是 Cache 存储容量,不包括标记阵列(标记位、有效位、脏位等)。比如某个 Cache 容量大小为 64KB,指的是 Cache 存储容量为 64KB,若再加条件:Cache 行长(即主存块大小)为 128B,则该 Cache 总行数为 64KB/128B = 512 行。
例 2(按字编址)
【假设】
- 某计算机的主存地址空间为 256MB,按字编址(4B),则有 256MB/4B = 64M = 226 个存储单元,地址位数为 26
- 一个主存块大小为 64B(即 Cache 行长为 64B),则一个主存块的存储单元个数为 64B/4B = 16
- Cache 有 16 行,又已知 Cache 行长为 64B,二路组相联,一共 16/2=8 组
【解答】
- 主存的物理地址的结构:
Cache 一共 23 = 8 组,所以组号占 3 位;主存块(行长)存储单元个数为 24 = 16,所以块内地址占 4 位;因此标记占 26-3-4=19 位。
标记 | 组号 | 块内地址 |
---|---|---|
19b | 3b | 4b |
- Cache 结构(组号、行号不是 Cache 的组成部分):
(组号) | (行号) | 有效位 | 标记位(Tag) | 数据(行长) |
---|---|---|---|---|
(0) | (0) | 1b | 19b | 64B |
(0) | (1) | 1b | 19b | 64B |
(1) | (2) | 1b | 19b | 64B |
(1) | (3) | 1b | 19b | 64B |
(…) | (…) | … | … | … |
(…) | (…) | … | … | … |
(7) | (14) | 1b | 19b | 64B |
(7) | (15) | 1b | 19b | 64B |
- Cache 行位数 = 标记阵列位数 + Cache 行长 = 1 + 19 + 64 * 8 = 532
- Cache 总容量 = Cache 总行数 * Cache 行位数 = 16 * (1 + 19 + 64 * 8) b = 8512b
例 3(按字节编址,考虑 LRU 算法、回写策略)
【假设】
- 某计算机的主存地址空间为 256MB,按字节编址(1B),则有 256MB/1B = 256M = 228 个存储单元,地址位数为 28
- 一个主存块大小为 16B(即 Cache 行长为 16B),则一个主存块的存储单元个数为 16B/1B = 16
- Cache 有 64 行,又已知 Cache 行长为 16B,四路组相联,一共 64/4=16 组
- 考虑 LRU 算法、回写策略
【解答】
- 主存的物理地址的结构:
Cache 一共 24 = 16 组,所以组号占 4 位;主存块(行长)存储单元个数为 24 = 16,所以块内地址占 4 位;因此标记占 28-4-4=20 位。
标记 | 组号 | 块内地址 |
---|---|---|
20b | 4b | 4b |
- Cache 结构(组号、行号不是 Cache 的组成部分):
考虑 LRU 算法,因为是四路组相联,2^2=4,所以替换控制位占 2 位;考虑回写策略,所以脏位占 1 位。(注意:如果题目中没有要求考虑,则不需要加这些东西)
(组号) | (行号) | 有效位 | 替换控制位 | 脏位 | 标记位(Tag) | 数据(行长) |
---|---|---|---|---|---|---|
(0) | (0) | 1b | 2b | 1b | 20b | 16B |
(0) | (1) | 1b | 2b | 1b | 20b | 16B |
(0) | (2) | 1b | 2b | 1b | 20b | 16B |
(0) | (3) | 1b | 2b | 1b | 20b | 16B |
(1) | (4) | 1b | 2b | 1b | 20b | 16B |
(1) | (5) | 1b | 2b | 1b | 20b | 16B |
(1) | (6) | 1b | 2b | 1b | 20b | 16B |
(1) | (7) | 1b | 2b | 1b | 20b | 16B |
(…) | (…) | … | … | … | ||
(…) | (…) | … | … | … | ||
(15) | (62) | 1b | 2b | 1b | 20b | 16B |
(15) | (63) | 1b | 2b | 1b | 20b | 16B |
- Cache 行位数 = 标记阵列位数 + Cache 行长 = 1 + 2 + 1 + 20 + 16 * 8 = 152
- Cache 总容量 = Cache 总行数 * Cache 行位数 = 64 * (1 + 2 + 1 + 20 + 16 * 8) b = 9728b
1.2 全相联映射
当 Q=1 时变为全相联映射,即整个 Cache 都是一个组。
例 4(按字节编址)
【假设】
- 某计算机的主存地址空间为 256MB,按字节编址(1B),则有 256MB/1B = 256M = 228 个存储单元,地址位数为 28
- 一个主存块大小为 64B(即 Cache 行长为 64B),则一个主存块的存储单元个数为 64B/1B = 64
- Cache 有 16 行,又已知 Cache 行长为 64B
【解答】
- 主存的物理地址的结构:
主存块(行长)存储单元个数为 26 = 64,所以块内地址占 6 位;因此标记占 28-6=22 位。
标记 | 组号 | 块内地址 |
---|---|---|
22b | 0b | 6b |
- Cache 结构(组号、行号不是 Cache 的组成部分):
(组号) | (行号) | 有效位 | 标记位(Tag) | 数据(行长) |
---|---|---|---|---|
(0) | (0) | 1b | 22b | 64B |
(0) | (1) | 1b | 22b | 64B |
(0) | (2) | 1b | 22b | 64B |
(0) | (3) | 1b | 22b | 64B |
(…) | (…) | … | … | … |
(…) | (…) | … | … | … |
(0) | (14) | 1b | 22b | 64B |
(0) | (15) | 1b | 22b | 64B |
- Cache 行位数 = 标记阵列位数 + Cache 行长 = 1 + 22 + 64 * 8 = 279
- Cache 总容量 = Cache 总行数 * Cache 行位数 = 16 * (1 + 22 + 64 * 8) b = 4464b
例 5(按字编址)
【假设】
- 某计算机的主存地址空间为 256MB,按字编址(4B),则有 256MB/4B = 64M = 226 个存储单元,地址位数为 26
- 一个主存块大小为 64B(即 Cache 行长为 64B),则一个主存块的存储单元个数为 64B/4B = 16
- Cache 有 16 行,又已知 Cache 行长为 64B
【解答】
- 主存的物理地址的结构:
主存块(行长)存储单元个数为 24 = 16,所以块内地址占 4 位;因此标记占 28-4=24 位。
标记 | 组号 | 块内地址 |
---|---|---|
24b | 0b | 4b |
- Cache 结构(组号、行号不是 Cache 的组成部分):
(组号) | (行号) | 有效位 | 标记位(Tag) | 数据(行长) |
---|---|---|---|---|
(0) | (0) | 1b | 24b | 64B |
(0) | (1) | 1b | 24b | 64B |
(0) | (2) | 1b | 24b | 64B |
(0) | (3) | 1b | 24b | 64B |
(…) | (…) | … | … | … |
(…) | (…) | … | … | … |
(0) | (14) | 1b | 24b | 64B |
(0) | (15) | 1b | 24b | 64B |
- Cache 行位数 = 标记阵列位数 + Cache 行长 = 1 + 24 + 64 * 8 = 281
- Cache 总容量 = Cache 总行数 * Cache 行位数 = 16 * (1 + 24 + 64 * 8) b = 4496b
1.3 直接映射
当 r=1 时变为直接映射,即每行 Cache 都是一个组。
Cache 组号 = 主存块号 mod Cache 总行数
例 6(按字节编址)
【假设】
- 某计算机的主存地址空间为 256MB,按字节编址(1B),则有 256MB/1B = 256M = 228 个存储单元,地址位数为 28
- 一个主存块大小为 64B(即 Cache 行长为 64B),则一个主存块的存储单元个数为 64B/1B = 64
- Cache 有 16 行,又已知 Cache 行长为 64B
【解答】
- 主存的物理地址的结构:
Cache 一共 24 = 16 行,所以行号占 4 位;主存块(行长)存储单元个数为 26 = 64,所以块内地址占 6 位;因此标记占 28-4-6=18 位。
标记 | 行号(组号) | 块内地址 |
---|---|---|
18b | 4b | 6b |
- Cache 结构(组号、行号不是 Cache 的组成部分):
(组号) | (行号) | 有效位 | 标记位(Tag) | 数据(行长) |
---|---|---|---|---|
(0) | (0) | 1b | 18b | 64B |
(1) | (1) | 1b | 18b | 64B |
(2) | (2) | 1b | 18b | 64B |
(3) | (3) | 1b | 18b | 64B |
(…) | (…) | … | … | … |
(…) | (…) | … | … | … |
(14) | (14) | 1b | 18b | 64B |
(15) | (15) | 1b | 18b | 64B |
- Cache 行位数 = 标记阵列位数 + Cache 行长 = 1 + 18 + 64 * 8 = 275
- Cache 总容量 = Cache 总行数 * Cache 行位数 = 16 * (1 + 18 + 64 * 8) b = 4400b
2 页式虚拟存储器
2.1 页表
假设主机地址空间为 32 位,则:
- 虚拟地址的结构:
虚页号 | 页内地址 |
---|---|
20b | 12b |
- 页表结构(虚页号不属于页表结构):
(虚页号) | 有效位 | 物理页号(页框号) |
---|---|---|
(0) | 1b | 20b |
(1) | 1b | 20b |
(2) | 1b | 20b |
(3) | 1b | 20b |
- 得到的物理地址结构:
物理页号 | 页内地址 |
---|---|
20b | 12b |
2.2 快表(TLB)
2.2.1 组相联 TLB
【假设】
- 主存空间大小为 256MB,按字节编址,则物理地址位数为 28 位
- 虚拟地址空间大小为 4GB,页面大小为 4KB,则地址位数为 32 位,有 4GB/4KB = 220 页,所以虚拟地址的虚页号占高 20 位,虚拟地址的页内地址占低 12 位;物理地址的页内地址也占低 12 位,因而物理地址的页号占高 16 位
- TLB 为二路组相联,一共四组,22=4,则虚页号中组号还要占低 2 位
【则有】
- (4GB)虚拟地址的结构:
虚页号(标记) | 组号 | 页内地址 |
---|---|---|
18b | 2b | 12b |
- 二路组相联 TLB 结构(组号、行号不是 TLB 的组成部分):
(组号) | (行号) | 有效位 | 标记(Tag) | 物理页号(页框号) |
---|---|---|---|---|
(0) | (0) | 1b | 18b | 16b |
(0) | (1) | 1b | 18b | 16b |
(1) | (2) | 1b | 18b | 16b |
(1) | (3) | 1b | 18b | 16b |
(2) | (4) | 1b | 18b | 16b |
(2) | (5) | 1b | 18b | 16b |
(3) | (6) | 1b | 18b | 16b |
(3) | (7) | 1b | 18b | 16b |
- (256MB)得到的物理地址的结构:
物理页号 | 页内地址 |
---|---|
16b | 12b |
2.2.2 全相联 TLB
【假设】
- 主存空间大小为 256MB,按字节编址,则物理地址位数为 28 位
- 虚拟地址空间大小为 4GB,页面大小为 4KB,则地址位数为 32 位,有 4GB/4KB = 220 页,所以虚拟地址的虚页号占高 20 位,虚拟地址的页内地址占低 12 位;物理地址的页内地址也占低 12 位,因而物理地址的页号占高 16 位
- TLB 为全相联,共 8 行
【则有】
- (4GB)虚拟地址的结构:
虚页号(标记) | 组号 | 页内地址 |
---|---|---|
20b | 0b | 12b |
- 四路组相联 TLB 结构(组号、行号不是 TLB 的组成部分):
(组号) | (行号) | 有效位 | 标记(Tag) | 物理页号(页框号) |
---|---|---|---|---|
(0) | (0) | 1b | 20b | 16b |
(0) | (1) | 1b | 20b | 16b |
(0) | (2) | 1b | 20b | 16b |
(0) | (3) | 1b | 20b | 16b |
(0) | (4) | 1b | 20b | 16b |
(0) | (5) | 1b | 20b | 16b |
(0) | (6) | 1b | 20b | 16b |
(0) | (7) | 1b | 20b | 16b |
- (256MB)得到的物理地址的结构:
物理页号 | 页内地址 |
---|---|
16b | 12b |
2.2.3 直接相联 TLB
【假设】
- 主存空间大小为 256MB,按字节编址,则物理地址位数为 28 位
- 虚拟地址空间大小为 4GB,页面大小为 4KB,则地址位数为 32 位,有 4GB/4KB = 220 页,所以虚拟地址的虚页号占高 20 位,虚拟地址的页内地址占低 12 位;物理地址的页内地址也占低 12 位,因而物理地址的页号占高 16 位
- TLB 为直接相联,共 8 行,23=8,所以虚页号中行号还要占低 3 位
【则有】
- (4GB)虚拟地址的结构:
虚页号(标记) | 行号 | 页内地址 |
---|---|---|
17b | 3b | 12b |
- 直接相联 TLB 结构(组号、行号不是 TLB 的组成部分):
(组号) | (行号) | 有效位 | 标记(Tag) | 物理页号(页框号) |
---|---|---|---|---|
(0) | (0) | 1b | 17b | 16b |
(1) | (1) | 1b | 17b | 16b |
(2) | (2) | 1b | 17b | 16b |
(3) | (3) | 1b | 17b | 16b |
(4) | (4) | 1b | 17b | 16b |
(5) | (5) | 1b | 17b | 16b |
(6) | (6) | 1b | 17b | 16b |
(7) | (7) | 1b | 17b | 16b |
- (256MB)得到的物理地址的结构:
物理页号 | 页内地址 |
---|---|
16b | 12b |
3 LRU 替换算法
3.1 直接映射的 LRU 算法
计数器变化规则:
- 命中时,所命中的行计数器清零,比其低的计数器加 1,其余不变;
- 未命中且有空闲行时,新装入的行的计数器置 0,其余全加 1;
- 未命中且无空闲行时,计数值为 3 的行的信息块被淘汰,新装入的行的块计数器置 0,其余全加 1。
【假设】内存容量为 4 个页面,使用 LRU 页面替换算法,考虑以下页面访问顺序:1, 8, 1, 7, 2, 7, 2, 1, 8, 3, 8, 3, 2, 7
【解答】(斜体表示命中,加粗表示替换)
无空闲行且需要替换时,从上一次替换的位置开始,从左往右找每一行的最后一个命中,最后一个命中出现最早(或没有出现命中)的那一行说明访问频率较少(或没有访问),替换那一行。
顺序 | 1 | 8 | 1 | 7 | 2 | 7 | 2 | 1 | 8 | 3 | 8 | 3 | 2 | 7 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
页#0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 7 |
页#1 | 8 | 8 | 8 | 8 | 8 | 8 | 8 | 8 | 8 | 8 | 8 | 8 | 8 | |
页#2 | 7 | 7 | 7 | 7 | 7 | 7 | 3 | 3 | 3 | 3 | 3 | |||
页#3 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 |
综上,失效次数(未命中次数)为 6 次,命中率为 8/14。
3.2 组相联的 LRU 算法
先计算 Cache 组号 = 主存块号 mod Cache 组数 (Q)
,看对应的 Cache 组里面有无命中的行,然后按照以下计数器变化规则处理(注意只处理对应组里面的所有行,其他组不用管):
- 命中时,所命中的行计数器清零,比其低的计数器加 1,其余不变;
- 未命中且有空闲行时,新装入的行的计数器置 0,其余全加 1;
- 未命中且无空闲行时,计数值为 3 的行的信息块被淘汰,新装入的行的块计数器置 0,其余全加 1。
【假设】Cache 采用二路组相联方式,访问主存地址顺序:0, 4, 8, 2, 0, 6, 8, 6, 4, 8
【解答】(斜体表示命中或有空闲行插入,加粗表示替换)
无空闲行且需要替换时,从上一次替换的位置开始,从左往右找每一行的最后一个命中,最后一个命中出现最早(或没有出现命中)的那一行说明访问频率较少(或没有访问),替换那一行。注意该操作需要在对应组内进行。
注意:0,1,4,5,8,9 映射到第 0 组,2,3,6,7 映射到第 1 组。
组号 | 顺序 | 0 | 4 | 8 | 2 | 0 | 6 | 8 | 6 | 4 | 8 |
---|---|---|---|---|---|---|---|---|---|---|---|
0 | 行#0 | 0 | 4 | 4 | 8 | 8 | 0 | 0 | 8 | 8 | |
0 | 行#1 | 0 | 4 | 8 | 8 | 0 | 0 | 8 | 8 | 4 | 4 |
1 | 行#2 | 2 | 2 | 2 | 2 | 2 | |||||
1 | 行#3 | 2 | 2 | 6 | 6 | 6 | 6 | 6 |
命中次数为 3,命中率为 3/10。
以上是关于组成原理-存储Cache 和页式虚拟存储器的主要内容,如果未能解决你的问题,请参考以下文章