涉及:
基本理解 (防止误解映射规则
cache 与 主存 的 "地址"构成
主存块、cache块
cache容量、cache的总容量
有关计算的一些刁难名词
不涉及:
cache 与 主存映射规则
基本理解:
首先我们需要明确的是我们之后针对的位数都是针对的 地址. 与实际的存储的 (01) 二进制无关. 地址与存储的实际数据是两个不同的概念. 我们的映射规则是建立在地址上的.
“块” 的概念其实 和 按字节编址 是相似的.
设 我们能够存储 2 32 b i t 2^{32}bit 232bit 的二进制位.
① 如果是按 比特 编址, 那么会存在如下地址
0000 . . . . . . 0000 0000 ⏟ 32 ∼ 1111 . . . . . . 1111 1111 ⏟ 32 \underbrace{0000 \: ... \: ... \: 0000 \: 0000}_{32} \sim \underbrace{1111 \: ... \: ... \: 1111 \: 1111}_{32} 32 0000......00000000∼32 1111......11111111
② 如果按 字节 (one B = eight bit) 编址:
2 32 2^{32} 232 可以分成 ( 2 32 / 2 3 ) (2^{32}/2^{3}) (232/23) 个部分, 即 ( 32 − 3 ) (32-3) (32−3)
0000 . . . . . . 0000 0000 ⏟ 29 000 ⏟ 3 \underbrace{0000 \: ... \: ... \: 0000 \: 0000}_{29}\underbrace{000}_{3} 29 0000......000000003 000
那么这 29 29 29 位就是表示 每 8 8 8 个 b i t bit bit 一组的地址了.
③ 同理 “块” 是一样的, 假设一个块的大小是 16 b i t 16 bit 16bit
0000 . . . . . . 0000 0000 ⏟ 28 000 ⏟ 4 块内地址 \underbrace{0000 \: ... \: ... \: 0000 \: 0000}_{28}\underbrace{000}_{4 \: 块内地址} 28 0000......000000004块内地址 000
这前 28 28 28 位就是用来划分块的了, 后 4 4 4 位就是所谓的的块内地址
注: 地址在计算机存储中是观测不到的.
cache 与 主存的 " 地址 " 构成:
与其说是地址构成, 不如说成是 地址能分成哪些部分.
注:
c
a
c
h
e
cache
cache 的地址是不包括 标记项 的. 标记项对于
c
a
c
h
e
cache
cache 来说更像是为了方便而方便, 而在原地址上添加的.
经过了上面关于分块的解释,我们就很容易理解地址的划分:
① 全相联映射:
如我们上面假设, 那么 块内地址的位数为:
4
4
4, 用来表示 "块地址"的位数为:
28
28
28.
如果是对
c
a
c
h
e
cache
cache 地址结构的求解, 那么这
28
28
28 位表示的是
c
a
c
h
e
cache
cache 行号的位数.
② 直接映射:
如上面我们假设的块大小, 那么块内地址位数为: 4 4 4, 标记位 与 c a c h e cache cache 行号的位数总和为: 28.
0000 . . . . . . 0000 0000 ⏟ 28 " 块地址 " 000 ⏟ 4 块内地址 \underbrace{0000 \: ... \: ... \: 0000 \: 0000}_{28\:"块地址"}\underbrace{000}_{4块内地址} 28"块地址" 0000......000000004块内地址 000
在原 28 28 28 位的基础上对 标记位 与 c a c h e cache cache行号 的划分涉及到了 直接映射 的规则. (你也可以理解为 “块地址” 是用 标记位 和 c a c h e cache cache行号 表示的.
假设 c a c h e cache cache 有 2 8 2^8 28 行, 那么将如下映射: (有关 c a c h e cache cache 行数的计算之后会涉及
2 28 % 2 8 2^{28} \: \% \: 2^{8} 228%28
二进制运算规则
0000 . . . . . . 0000 ⏟ 20 0000 0000 ⏟ 8 余数 \underbrace{0000 \: ... \: ... \: 0000}_{20} \: \underbrace{0000 \: 0000}_{8 \: 余数} 20 0000......00008余数 00000000
所以 “块地址” 又可以划分为 “标记位” 与 “ c a c h e 行号 cache行号 cache行号”.
③ 组相连映射:
如果理解了 直接映射 的行号划分, 那么组号是一样的.
假设 c a c h e cache cache 有 8 8 8 组, 那么将如下映射: (有关 c a c h e cache cache 行数的计算之后会涉及
2 28 % 2 3 2^{28} \: \% \: 2^{3} 228%23
二进制运算规则
0000 . . . . . . 0000 ⏟ 25 000 ⏟ 3 余数 \underbrace{0000 \: ... \: ... \: 0000}_{25} \: \underbrace{000}_{3 \: 余数} 25 0000......00003余数 000
所以 “块地址” 又可以划分为 “标记位” 与 “ c a c h e 组号 cache组号 cache组号”.
主存块、
c
a
c
h
e
cache
cache块
因为这两个"块"中存储的数据是一样的, 所以 主存块的大小 必然要等于
c
a
c
h
e
cache
cache块大小.
那假设 主存块的大小为 32 32 32 字节, 我们可以知道些什么能?
其实我们上面已经求过了 → \rightarrow → 块内地址的位数. 我们试着求一下
32 B = 2 5 B 32 B = 2^5B 32B=25B 那么 块内地址就是 5 5 5 位 ( 如果没说明按什么方式编址, 那么默认按字节编址.
解读: 存储块的大小 → \rightarrow → 以多大的空间分块.
c
a
c
h
e
cache
cache容量、
c
a
c
h
e
cache
cache总容量
①
c
a
c
h
e
cache
cache容量 =
c
a
c
h
e
cache
cache行数
×
\times
× 存储块大小
上面这个公式是不是相当的眼熟:
c
a
c
h
e
地址结构
{
c
a
c
h
e
行号位
块内地址位
cache地址结构 \begin{cases} cache行号位\\ 块内地址位 \end{cases}
cache地址结构{cache行号位块内地址位
那么 ① 式就可以转换成:
c
a
c
h
e
容量
=
2
行号位数
×
2
块内地址位数
×
2
编码位数
cache容量 = 2^{行号位数} \times 2^{块内地址位数} \times 2^{编码位数}
cache容量=2行号位数×2块内地址位数×2编码位数注: 为什么要乘以编码位数在 基本理解 中已经求过了. 整个容量的位数去除编码位数才是地址表示的位数.
假设 c a c h e cache cache容量大小为 64 K B 64KB 64KB, 存储块大小为 32 B 32B 32B, 按字节编址 ( 3 位 ) (3位) (3位).
64 K B → 2 16 ∗ 2 3 → c a c h e 64KB \rightarrow 2^{16}*2^{3} \rightarrow cache 64KB→216∗23→cache地址 ( 19 − 3 ) = 16 (19-3)=16 (19−3)=16位
32 B → 2 5 ∗ 2 3 → 块内地址 ( 8 − 3 ) = 5 位 32B \rightarrow 2^{5}*2^{3} \rightarrow 块内地址(8-3)=5位 32B→25∗23→块内地址(8−3)=5位
利用公式: c a c h e cache cache行数 = c a c h e 容量 / 存储块大小 cache容量 \: / \: 存储块大小 cache容量/存储块大小.
64 K B / 32 B = 2 11 64KB \: / \: 32B = 2^{11} 64KB/32B=211 所以 c a c h e cache cache 行位数为 11 11 11.
②
c
a
c
h
e
cache
cache总容量 = (各种标指位的位数
+
+
+ 标记位数
+
+
+ 块内地址位数)
×
\times
× 行数
注意这里括号内的位数并不包括
c
a
c
h
e
cache
cache 的行位数. 这个就是规定. 记住就好了
有关计算
① 行长 (有时也称行大小 : 存储块大小
②
c
a
c
h
e
cache
cache有效容量 :
c
a
c
h
e
cache
cache 容量
-- over.