2

一个直接映射缓存由 16 个块组成。主存储器包含 16K 块,每个块 8 字节。主存地址格式是什么(意思是每个字段的大小)。

我知道这些字段是 Tag|Block|Offset 。我只是不知道如何获得每个的大小。

4

1 回答 1

10

这是作业吗?

为了解决这个问题,您需要知道相关架构的地址大小。一般解决方案:

令 C 为高速缓存的大小(以位为单位)。
令 A 为地址的大小(以位为单位)。
令 B 为高速缓存块的大小(以位为单位)。
令 S 为缓存的关联性(在方式上,直接映射为 S=1,完全关联为 S=C/B)

L,缓存中的行数,等于 C/B。这是缓存位数除以每行的位数。Q,缓存中的集合数,等于 L/S。那是行数除以关联性。这条线和上面的原因应该是显而易见的;如果不是,请在阅读以下内容之前再次阅读教科书。

现在,让我们解决三件事:位移位、块位和标记位。

位移位用于在高速缓存行中查找特定项目。假设字节可寻址内存,位移位数 D 为 ceil(log2(ceil(B/8)))。这是缓存行中字节数的日志基数 2,在每一步向上取整。如果内存是两字节可寻址的,那么内部将是 B/16 等。

块位用于在缓存中找到我们想要的缓存集。因此,O,即块位数,是 ceil(log2(Q))。这是缓存中集合数量的日志基数二。

标签位是剩下的。因此,标签位数 T 为 ADO。在英语中,地址中的位数减去用于其他两个部分的位数。我们不必在这里考虑关联性,因为我们已经在上面使用 Q 而不是 L 处理了它。

总之:

  • 位移位与您在一行中指定特定字节所需的数量一样多
  • 块位的数量与您在缓存中指定特定集的需要一样多
  • 标签位是剩下的任何位

最后计算标签长度。这肯定更容易。

PS - 请注意,实际上,缓存还将在每一行中存储一个脏位和一些其他元数据。但是,这些问题通常会忽略这样的事情,所以我也这样做了。

于 2010-08-30T23:41:42.737 回答