某高速缓存大小 256 字节,直接映射,块大小为 16 字节。定义 L 为数据装载命令,S 为存储,M 为数据修改。若每一数据装载(L)或存储(S)操作可引发最多 1次缓存缺失(miss);数据修改操作(M)可认为是同一地址上 1 次装载后跟 1 次存储,因此可引发 2 次缓存命中(hit)或 1 次缺失加 1 次命中外加可能的 1 次淘汰/驱逐(evict)。根据下列的访存命令序列,分析每一命令下的上述高速缓存(高速缓存最初是空的)的命中及淘汰情况。
L 10,1
M 20,1
L 22,1
S 18,1
L 110,1
L 210,1
M 12,1

说明:L 10,1 表示从地址 0x10 处加载 1 个字节数据,其它同理。


在直接映射方式下,高速缓存的每个块只能映射到唯一的一个位置。块地址的计算是为了确定一个块应该映射到高速缓存中的哪个位置。

计算块地址的公式是:块地址 = 访问地址 mod (高速缓存大小 / 块大小)

其中,访问地址是指要访问的内存地址,高速缓存大小是指高速缓存的总大小,块大小是指每个块的大小。

举个例子来说明:

假设访问地址是20,高速缓存大小为256字节,块大小为16字节。

计算块地址的过程如下:
块地址 = 20 mod (256 / 16) = 20 mod 16 = 4

所以,访问地址20对应的块地址是4。


首先,我们需要确定高速缓存的组数和每个组的块数。根据给定的高速缓存大小为256字节和块大小为16字节,可以计算出高速缓存共有256/16=16个块。

现在我们来分析每个访存命令的情况:

  1. L 10,1: 访问地址10,10是0x10,计算块地址为0x1 mod 0x10 = 1(组),将第1块映射到第1组。由于高速缓存是空的,发生缓存缺失(miss)。
  2. M 20,1: 访问地址20,计算块地址为0x2 mod 0x10 = 2(组),将第2块映射到第2组。由于高速缓存中没有该块,发生缓存缺失(miss),然后将该块加载到第2组。接下来进行数据修改,这里发生了一次缓存命中(hit)。
  3. L 22,1: 访问地址22,计算块地址为0x2 mod 0x10 = 2(组),将第2块映射到第2组。这里发生了一次缓存命中(hit)。
  4. S 18,1: 访问地址18,计算块地址为0x1 mod 0x10 = (组),将第块映射到第1组。这里发生了一次缓存命中(hit)。
  5. L 110,1: 访问地址110,计算块地址为0x11 mod 0x10 = 1(组),将第17块映射到第1组。由于高速缓存中没有该块,发生缓存缺失(miss),并且由于高速缓存已满,需要淘汰一个块。这里发生了缓存淘汰(eviction),然后将第16块加载到第0组。
  6. L 210,1: 访问地址210,计算块地址为0x21 mod 0x10 = 1(组),将第33块映射到第1组。由于高速缓存中没有该块,发生缓存缺失(miss),并且由于高速缓存已满,需要淘汰一个块。这里发生了缓存淘汰(eviction),然后将第32块加载到第1组。
  7. M 12,1: 访问地址12,计算块地址为0x1 mod 0x10 = 1(组),将第1块映射到第1组。由于高速缓存中没有该块,发生缓存缺失(miss),然后将该块加载到第1组。接下来进行数据修改,这里发生了一次缓存命中(hit)。

综上所述,每个访存命令下的高速缓存命中和淘汰情况如下:
L 10,1: 缓存缺失(miss)
M 20,1: 缓存缺失(miss)、一次缓存命中(hit)
L 22,1: 缓存缺失(miss)
S 18,1: 缓存缺失(miss)
L 110,1: 缓存缺失(miss)、缓存淘汰(eviction)
L 210,1: 缓存缺失(miss)、缓存淘汰(eviction)
M 12,1: 缓存缺失(miss)、缓存淘汰(eviction)