[!TIP] 存储器层次结构

p10


为了更清晰地理解 命中率平均访问时间访问效率,我们可以通过一个具体的例子来说明这些概念。

1. 命中率,平均访问时间,访问效率基础概念说明

在缓存系统中:

  • 命中(Hit):当 CPU 访问一个地址时,数据在 cache 中找到,即为命中。
  • 未命中(Miss):当数据不在 cache 中,需要从主存读取,即为未命中。
  • 命中率(Hit Rate):成功在 cache 中找到数据的次数占总访问次数的比例。
  • 平均访问时间(Average Access Time):CPU 访问数据的平均所需时间,综合了 cache 命中和未命中的情况。
  • 访问效率:衡量 cache 在提高 CPU 访问速度方面的效果。一般情况下,命中率越高,平均访问时间越低,访问效率越高。

假设如下参数:

  • cache 访问时间:1 纳秒
  • 主存访问时间:50 纳秒(仅指主存的时间,不包括 cache miss 后从 cache 返回的时间)

2. 举例说明

假设有一组数据访问情况,其中 100 次访问80 次命中20 次未命中,即命中率为 80%。下面计算平均访问时间和访问效率。

2.1 计算命中率

\(\text{命中率} = \frac{\text{命中次数}}{\text{总访问次数}} = \frac{80}{100} = 0.8 \, \text{或} \, 80\%\)

2.2 计算平均访问时间

对于平均访问时间,要考虑到命中和未命中的不同情况:

  1. 命中时:访问时间 = 1 纳秒
  2. 未命中时:需要访问主存,访问时间 = cache 访问时间 + 主存访问时间 = ( 1 + 50 = 51 ) 纳秒

\(\text{平均访问时间} = (\text{命中率} \times \text{cache 访问时间}) + (\text{未命中率} \times \text{未命中访问时间})\\\) 将数值代入:

\[\text{平均访问时间} = (0.8 \times 1) + (0.2 \times 51) = 0.8 + 10.2 = 11 \, \text{纳秒}\]

or: $$ \begin{align} \text{平均访问时间} &= (\text{命中率} \times \text{cache 访问时间}) + (\text{未命中率} \times \text{未命中访问时间})
&= (0.8 \times 1) + (0.2 \times 51)
&= 0.8 + 10.2 = 11 \, \text{纳秒} \end{align}

$$

2.3 访问效率的理解

在没有 cache 的情况下,每次访问主存都需要 50 纳秒。如果我们有 cache,平均访问时间降低到 11 纳秒,这体现了访问效率的提升。

  • 访问效率提升可以表示为节省的时间:
\[\text{提升的效率} = \frac{\text{无 cache 的主存访问时间} - \text{平均访问时间}}{\text{无 cache 的主存访问时间}} \times 100\% = \frac{50 - 11}{50} \times 100\% = 78\%\]

因此,在该例子中,cache 系统将访问效率提升了 78%

访问效率的确可以通过比较 cache 访问时间和平均访问时间来衡量。这个衡量方法主要用于表示 cache 在提高访问速度方面的效果。我们可以用公式如下:

\[\text{访问效率} = \frac{\text{cache 访问时间}}{\text{平均访问时间}}\]

回到之前的例子中,已知:

  • cache 访问时间:1 纳秒
  • 平均访问时间:11 纳秒

代入公式得到访问效率:

\[\text{访问效率} = \frac{1 \text{ 纳秒}}{11 \text{ 纳秒}} = 0.0909 \approx 9.09\%\]

理解访问效率

这里的 9.09%表示的是,平均访问时间是 cache 访问时间的约 11 倍。因此,访问效率数值越低(越接近 1),则表示 cache 在提高整体访问速度方面越有效。

3. 总结

  • 命中率 = 80%
  • 平均访问时间 = 11 纳秒
  • 访问效率提升 = 78%

这样,cache 的引入有效降低了平均访问时间,提升了系统整体访问速度。


存储映射 (Cache & 主存)

问题描述 1

若某机字长为 16 位, cpu 地址总线 18 位, 数据总线 16 位, 存储按字编址.

问: 若为该机配备 2 K x 16 位的 cache, 每块 8 B, 采用 2 路组相联映射,试写出对主存地址各字段的划分 (标出各个字段的位数). 若主存地址为 462 EH, 该地址可映射到 cache 的哪一组?

[!TIP] 在此题目中,“一个字等于16位”是符合题意的。 在计算机系统中,“字” (word) 的长度并没有统一标准,通常取决于计算机的体系结构。常见的字长有 16 位、32 位和 64 位等。题目中明确指出“一个字长为 16 位”,这意味着在该系统中,一个字的长度定义为 16 位(即 2 字节)。

并且这里字长 16 位与数据总线 16 位刚好对应

解答

这道题主要考查缓存的地址映射。题目给出了一个计算机的基本参数,需要根据这些参数进行缓存地址字段的划分,并且在给定的主存地址下确定映射的缓存组。让我们逐步分析每一步所需的计算:

1. 已知条件分析

  • 字长(Word Length):16 位(表示一个字 16 位,既为 2 字节)。
  • 地址总线:18 位(说明主存地址空间可以表示(2^{18} = 262144) 个字)。
  • 数据总线:16 位(说明一次可以传输 16 位数据)。
  • 存储按字编址:主存地址以字为单位,每个字长 16 位,即 2 字节。
  • 缓存容量:2 K×16 位(即缓存总共有 2 K 个字,共 2048 字)。
  • 每块大小:8 字节(8 B,即 4 个字,因为每个字长 16 位 = 2 字节)。
  • 映射方式:2 路组相联。

[!NOTE] 主存地址的位数是由 CPU的地址总线 决定的

由于题目中说明“存储按字编址”,每个地址单位表示一个16位的“字”,因此整个主存的容量是:

\[2^{18}个字 \times 16\text{位}\text{/}\text{字} = 4MB\]

2. 地址划分需求

在 2 路组相联中,地址一般会划分为 标记(Tag)组号(Set Index)块内地址(Block Offset) 三部分。

3. 逐步分析并划分各字段的位数

3.1 块内地址(Block Offset)

块内地址的位数由每块包含的字数决定。题目指出每块大小为 8 字节(即 4 个字),因此需要两位来表示块内地址。

  • 块内地址 = $\log_{2}{4}=2$ 位。
3.2 缓存组号(Set Index)

缓存容量为 2048 字,且每块 4 字(即一个块占用 4 个字),因此缓存共有: \(\frac{2048 \text{ 字}}{4 \text{ 字/块}} = 512 \text{ 块}\)

缓存是 2 路组相联,即每组有 2 块,因此缓存的组数为: \(\frac{512 \text{ 块}}{2 \text{ 块/组}} = 256 \text{ 组}\) 因此,组号需要的位数为:

  • 组号位数 = $\log_{2}{256}$ = 8位。
3.3 标记位(Tag)

主存地址总共 18 位,去掉组号和块内地址之后剩下的就是标记位。 \(18 \text{ 位} - 8 \text{ 位(组号)} - 2 \text{ 位(块内地址)} = 8 \text{ 位}\) 所以,标记字段为 8 位。

4. 总结地址字段划分
  • 标记(Tag):8 位
  • 组号(Set Index):8 位
  • 块内地址(Block Offset):2 位

5. 映射实例分析

主存地址为 462 EH,将其转换为二进制表示: $462EH = 0100011000101110B$ 主存地址二进制为 0100 0110 0010 1110。(从右往左写)

根据前面的划分:

  • 标记:前 8 位,即 00010001。(补充够位数)
  • 组号:中间 8 位,即 10001011
  • 块内地址:最后 2 位,即 10

6. 确定映射的缓存组

由上面的分解,得到组号字段为 0010 1110,即 46(十进制表示)。

因此,主存地址 462 EH 会映射到缓存的第 139 组。


问题描述 2

若某处理器包含一片 cache, 容量为 8 KB, 采用 4 路组相联结构, 块的大小位 4 个 32 位字(这个字可以说是单位). 当 cache 确实时, 以分组方式从主存读取 4 个字到 cache, 假定主存容量为 16 MB. cache 共分多少组? 还有主存也分多少组? 因为 cache 的数据块的大小称为行, 主存的称为块, 块和行是等长的. 并写出主存的字节地址格式? 详细解答说明

解答

这道题目涉及 cache 的 4 路组相联映射,需要我们确定 cache 和主存的组数,并将主存的字节地址分成不同的字段。接下来将逐步分析解决方案。

1. 题目中的已知条件

  • cache 容量:8 KB
  • 缓存结构:4 路组相联
  • 每行大小:4 个 32 位字,即每行为 $4\times 4=16$ 字节
  • 主存容量:16 MB
  • 数据块的传输方式:当缓存未命中时,从主存读取 4 个字到 cache。

2. 计算 cache 的组数

cache 采用 4 路组相联结构,即每组包含 4 个行(行在 cache 中是同义于块的)。先计算 cache 中共有多少行(数据块): \(\text{总行数} = \frac{\text{cache 容量}}{\text{每行大小}} = \frac{8 \text{ KB}}{16 \text{ B}} = \frac{8192 \text{ B}}{16 \text{ B}} = 512 \text{ 行}\) 然后,由于 cache 是 4 路组相联,每组 4 行,因此 cache 中共有: \(\text{组数} = \frac{512 \text{ 行}}{4 \text{ 行/组}} = 128 \text{ 组}\) 因此,cache 中共有 128 组

3. 计算主存的块数

由于 cache 的行大小(16 字节)和主存的块大小相同(均为 4 个 32 位字),cache 的每行可以映射到主存的一个块上。所以主存的块大小也是 16 字节,这样在 cache 中和主存中块是一一对应的。

计算主存的总块数: \(\text{主存块数} = \frac{\text{主存容量}}{\text{每块大小}} = \frac{16 \text{ MB}}{16 \text{ B}} = \frac{16 \times 1024 \times 1024 \text{ B}}{16 \text{ B}} = 1048576 \text{ 块}\) 因此,主存共有 1048576 块

4. 主存地址划分

主存容量为 16 MB,相当于 $2^{24}$ 字节的地址空间,因此主存地址需要 24 位。按照题目要求,主存地址需要划分为 标记(Tag)组号(Set Index)块内偏移(Block Offset) 三部分。

4.1 块内偏移(Block Offset)

主存的每块大小为 16 字节,即包含 $4 \times 4 =16$ 字节的数据,因此块内偏移需要表示 16 字节的偏移范围: \(\text{块内偏移位数} = \log_2 16 = 4 \text{ 位}\) 因此,块内偏移字段需要 4 位

4.2 组号(Set Index)

在 4 路组相联的 cache 中,共有 128 组,因此组号的位数为: \(\text{组号位数} = \log_2 128 = 7 \text{ 位}\) 因此,组号字段需要 7 位

4.3 标记(Tag)

主存地址总共是 24 位,去掉组号和块内偏移后,剩下的位数为标记位: \(\text{标记位数} = 24 - 7 - 4 = 13 \text{ 位}\) 因此,标记字段需要 13 位

5. 总结主存地址的格式

综上所述,主存地址的 24 位划分为:

  • 标记(Tag):13 位
  • 组号(Set Index):7 位
  • 块内偏移(Block Offset):4 位

这就是主存的字节地址格式。