组成原理-存储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)111
字节 (byte, B)888
半字 (1B/2B/4B)81632
字 (2B/4B/8B,机器字长)163264
双字3264128
四字64128256
  • 指令字长:一个指令字中包含的二进制位数。

  • 存储字长:一个存储单元存储的二进制位数。

指令字长一般取存储字长的整数倍,若指令字长等于存储字长的 2 倍,则需要 2 个访存周期来取出一条指令;若指令字长等于存储字长,则取指周期等于机器周期。

补充:不同机器下的数据类型长度

类型16 位机器32 位机器64 位机器
char888
short161616
int163232
long323232
long long646464
float163232
double646464

补充:以 2 为底的单位

在计算机组成原理课程中,使用 K、M、G、T 均表示以 2 为底的单位。如 2K 个存储单元的意思是 2048 个存储单元,而不是 2000 个。但是,对于磁盘的存储容量及数据传输率,依然使用以 10 为底的单位。

单位大小十六进制数
K210400H
M22010,0000H
G230~
T240~

补充:存储单位

注意!!!408 考试使用 KB、MB、GB、TB 表示 2 为底的存储单位!!!

注意!!!408 考试使用 KB、MB、GB、TB 表示 2 为底的存储单位!!!

注意!!!408 考试使用 KB、MB、GB、TB 表示 2 为底的存储单位!!!

10 为底的存储单位2 为底的存储单位
KB = 103BKiB = 210B
MB = 106BMiB = 220B
GB = 109BGiB = 230B
TB = 1012BTiB = 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 位。

标记组号块内地址
19b3b6b
  • Cache 结构(组号、行号不是 Cache 的组成部分):
(组号)(行号)有效位标记位(Tag)数据(行长)
(0)(0)1b19b64B
(0)(1)1b19b64B
(1)(2)1b19b64B
(1)(3)1b19b64B
(…)(…)
(…)(…)
(7)(14)1b19b64B
(7)(15)1b19b64B
  • 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 位。

标记组号块内地址
19b3b4b
  • Cache 结构(组号、行号不是 Cache 的组成部分):
(组号)(行号)有效位标记位(Tag)数据(行长)
(0)(0)1b19b64B
(0)(1)1b19b64B
(1)(2)1b19b64B
(1)(3)1b19b64B
(…)(…)
(…)(…)
(7)(14)1b19b64B
(7)(15)1b19b64B
  • 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 位。

标记组号块内地址
20b4b4b
  • Cache 结构(组号、行号不是 Cache 的组成部分):

考虑 LRU 算法,因为是四路组相联,2^2=4,所以替换控制位占 2 位;考虑回写策略,所以脏位占 1 位。(注意:如果题目中没有要求考虑,则不需要加这些东西)

(组号)(行号)有效位替换控制位脏位标记位(Tag)数据(行长)
(0)(0)1b2b1b20b16B
(0)(1)1b2b1b20b16B
(0)(2)1b2b1b20b16B
(0)(3)1b2b1b20b16B
(1)(4)1b2b1b20b16B
(1)(5)1b2b1b20b16B
(1)(6)1b2b1b20b16B
(1)(7)1b2b1b20b16B
(…)(…)
(…)(…)
(15)(62)1b2b1b20b16B
(15)(63)1b2b1b20b16B
  • 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 位。

标记组号块内地址
22b0b6b
  • Cache 结构(组号、行号不是 Cache 的组成部分):
(组号)(行号)有效位标记位(Tag)数据(行长)
(0)(0)1b22b64B
(0)(1)1b22b64B
(0)(2)1b22b64B
(0)(3)1b22b64B
(…)(…)
(…)(…)
(0)(14)1b22b64B
(0)(15)1b22b64B
  • 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 位。

标记组号块内地址
24b0b4b
  • Cache 结构(组号、行号不是 Cache 的组成部分):
(组号)(行号)有效位标记位(Tag)数据(行长)
(0)(0)1b24b64B
(0)(1)1b24b64B
(0)(2)1b24b64B
(0)(3)1b24b64B
(…)(…)
(…)(…)
(0)(14)1b24b64B
(0)(15)1b24b64B
  • 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 位。

标记行号(组号)块内地址
18b4b6b
  • Cache 结构(组号、行号不是 Cache 的组成部分):
(组号)(行号)有效位标记位(Tag)数据(行长)
(0)(0)1b18b64B
(1)(1)1b18b64B
(2)(2)1b18b64B
(3)(3)1b18b64B
(…)(…)
(…)(…)
(14)(14)1b18b64B
(15)(15)1b18b64B
  • Cache 行位数 = 标记阵列位数 + Cache 行长 = 1 + 18 + 64 * 8 = 275
  • Cache 总容量 = Cache 总行数 * Cache 行位数 = 16 * (1 + 18 + 64 * 8) b = 4400b

2 页式虚拟存储器

2.1 页表

假设主机地址空间为 32 位,则:

  • 虚拟地址的结构:
虚页号页内地址
20b12b
  • 页表结构(虚页号不属于页表结构):
(虚页号)有效位物理页号(页框号)
(0)1b20b
(1)1b20b
(2)1b20b
(3)1b20b
  • 得到的物理地址结构:
物理页号页内地址
20b12b

2.2 快表(TLB)

2.2.1 组相联 TLB

【假设】

  • 主存空间大小为 256MB,按字节编址,则物理地址位数为 28 位
  • 虚拟地址空间大小为 4GB,页面大小为 4KB,则地址位数为 32 位,有 4GB/4KB = 220 页,所以虚拟地址的虚页号占高 20 位,虚拟地址的页内地址占低 12 位;物理地址的页内地址也占低 12 位,因而物理地址的页号占高 16 位
  • TLB 为二路组相联,一共四组,22=4,则虚页号中组号还要占低 2 位

【则有】

  • (4GB)虚拟地址的结构:
虚页号(标记)组号页内地址
18b2b12b
  • 二路组相联 TLB 结构(组号、行号不是 TLB 的组成部分):
(组号)(行号)有效位标记(Tag)物理页号(页框号)
(0)(0)1b18b16b
(0)(1)1b18b16b
(1)(2)1b18b16b
(1)(3)1b18b16b
(2)(4)1b18b16b
(2)(5)1b18b16b
(3)(6)1b18b16b
(3)(7)1b18b16b
  • (256MB)得到的物理地址的结构:
物理页号页内地址
16b12b

2.2.2 全相联 TLB

【假设】

  • 主存空间大小为 256MB,按字节编址,则物理地址位数为 28 位
  • 虚拟地址空间大小为 4GB,页面大小为 4KB,则地址位数为 32 位,有 4GB/4KB = 220 页,所以虚拟地址的虚页号占高 20 位,虚拟地址的页内地址占低 12 位;物理地址的页内地址也占低 12 位,因而物理地址的页号占高 16 位
  • TLB 为全相联,共 8 行

【则有】

  • (4GB)虚拟地址的结构:
虚页号(标记)组号页内地址
20b0b12b
  • 四路组相联 TLB 结构(组号、行号不是 TLB 的组成部分):
(组号)(行号)有效位标记(Tag)物理页号(页框号)
(0)(0)1b20b16b
(0)(1)1b20b16b
(0)(2)1b20b16b
(0)(3)1b20b16b
(0)(4)1b20b16b
(0)(5)1b20b16b
(0)(6)1b20b16b
(0)(7)1b20b16b
  • (256MB)得到的物理地址的结构:
物理页号页内地址
16b12b

2.2.3 直接相联 TLB

【假设】

  • 主存空间大小为 256MB,按字节编址,则物理地址位数为 28 位
  • 虚拟地址空间大小为 4GB,页面大小为 4KB,则地址位数为 32 位,有 4GB/4KB = 220 页,所以虚拟地址的虚页号占高 20 位,虚拟地址的页内地址占低 12 位;物理地址的页内地址也占低 12 位,因而物理地址的页号占高 16 位
  • TLB 为直接相联,共 8 行,23=8,所以虚页号中行号还要占低 3 位

【则有】

  • (4GB)虚拟地址的结构:
虚页号(标记)行号页内地址
17b3b12b
  • 直接相联 TLB 结构(组号、行号不是 TLB 的组成部分):
(组号)(行号)有效位标记(Tag)物理页号(页框号)
(0)(0)1b17b16b
(1)(1)1b17b16b
(2)(2)1b17b16b
(3)(3)1b17b16b
(4)(4)1b17b16b
(5)(5)1b17b16b
(6)(6)1b17b16b
(7)(7)1b17b16b
  • (256MB)得到的物理地址的结构:
物理页号页内地址
16b12b

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

【解答】(斜体表示命中加粗表示替换

无空闲行且需要替换时,从上一次替换的位置开始,从左往右找每一行的最后一个命中,最后一个命中出现最早(或没有出现命中)的那一行说明访问频率较少(或没有访问),替换那一行。

顺序18172721838327
页#011111111111117
页#18888888888888
页#277777733333
页#32222222222

综上,失效次数(未命中次数)为 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 组。

组号顺序0482068648
0行#0044880088
0行#10488008844
1行#222222
1行#32266666

命中次数为 3,命中率为 3/10。

以上是关于组成原理-存储Cache 和页式虚拟存储器的主要内容,如果未能解决你的问题,请参考以下文章

计算机组成原理3.7虚拟存储器

计算机组成原理3.7虚拟存储器

第三章 存储器的层次结构

(计算机组成原理)第三章存储系统-第七节1:页式存储器页表及快表

LRU算法原理解析

(计算机组成原理)第三章存储系统-第六节1:高速缓冲存储器Cache及其相关基本概念程序访问的局部性原理和命中率