[!TIP] 存储器层次结构

为了更清晰地理解 命中率、平均访问时间 和 访问效率,我们可以通过一个具体的例子来说明这些概念。
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 纳秒
- 未命中时:需要访问主存,访问时间 = 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 纳秒,这体现了访问效率的提升。
- 访问效率提升可以表示为节省的时间:
因此,在该例子中,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 位
这就是主存的字节地址格式。