我给了一个任务,我需要用 Java 模拟一个关联缓存。我们得到一组字节地址,我们需要找出每个地址是命中还是未命中。缓存由 32 个块组成,每个块为 8 个字节
所以方案如下:
- 从地址计算组地址(组地址是地址除以缓存中每个块的大小。例如地址 950 的组地址将是 950/8)
- 使用整个组地址作为标签
- 扫描整个缓存,看看标签是否已经在缓存中
- 如果找到标签,记录一次命中
- 如果未找到标签,则记录一次未命中,并将标签存储在第一个可用块中
- 如果没有可用空间,则从缓存中删除最近最少使用 (LRU) 块
- 更新缓存以存储新标签(如果有未命中)并记住此块是最近使用的最多的块。
- 将有效位设置为真,将标签存储在块中,记住最初使用的地址。
我遇到的问题是最近最少使用的位。我们被要求实现 LRU 的方式是保持块从最近使用到最近最少使用的顺序,当我们需要替换一个块时,我们从末尾删除旧块并将新块添加到开头。然后,当我们获得命中时,我们将命中移动到缓存的开头。