缓存如何在“偏移量”中实际存储数据

本文关键字:偏移量 存储 数据 缓存 | 更新日期: 2023-09-27 17:57:03

所以对于我的计算机体系结构类,我必须在 C# 上模拟缓存/内存关系,我只是不确定缓存如何实际存储数据。我得到了缓存标签的概念,但我真的没有得到偏移量。

假设我有一个可容纳 256 个 32 位整数的 RAM。我想要一个缓存系统,其中我有一个保存 8 个 32 位整数的缓存。但是在缓存中的那些 32 位整数中,我需要添加标签和有效位,这使得它大致缩小到 26 位左右。那么如何将剩余的 32 位数据存储在剩余的 26 位中呢?

这是我现在的代码,它仍在进行中

class Memory
{
    public List<UInt32> instructions = new List<UInt32>();
    const int directCacheSize = 8;
    ulong[] directCache = new ulong[directCacheSize];
    private int[] stack = new int[256];
    public int this[int i]
    {
        get
        {
            int directMapIndex = i % directCacheSize;
            if (directCache[directMapIndex] == Convert.ToUInt64(stack[i]))
            {
                return Convert.ToInt32(directCache[directMapIndex] - 18446744069414584320);
            }
            else
            {
                directCache[directMapIndex] = (Convert.ToUInt64(i) << 32) + Convert.ToUInt64(stack[i]);
                return stack[i];
            }
        }
        set
        {
            stack[i] = value;
        }
    }
}

缓存如何在“偏移量”中实际存储数据

我一直

在试图理解这个几乎不连贯的问题,我想我已经明白了。

我最初的想法是,您的根本错误是从数据大小中减去用于维护缓存数据结构位的位; 这没有任何意义。它们将添加到数据大小中。

但后来我意识到不,你的根本错误是你混淆了位和字节。你从 32 字节减去 6 位以荒谬地得到 26,但你应该将 6 到 32 x 8

令人

困惑的错误是,您似乎还将数据块的偏移量与数据块本身混淆了。数据块存储数据。偏移量标识数据块中相关数据的位置。偏移量是有效地址的一部分,而不是缓存行

你似乎也忘记了自始至终的肮脏部分。

因此,我的直接映射缓存中的单个块将如下所示:[标记 5 位][数据 32 位]

不。32 在这个问题中出现的次数让你深感困惑:

  • 8 个 32 位字为 32 字节
  • 5 位可以代表 32 个可能的标签
  • 如果您有 32 个标签
  • 和 1024 个字节,则每个标签标识 32 个字节

那是很多32,你已经把他们弄糊涂了。

重新开始。

假设您想要一行包含 8 个 32 位字,总共 32 个字节。单个缓存行中必须包含哪些内容?

  • 32 字节 -- 不是位
  • 标识 32 字节来源的标记
  • 一个有效位
  • 一个脏位
如果我们假设 32 字节

只能在 32 字节边界上,并且有 1024/32 = 32 个这样的边界,那么对于标签,我们需要 log2(32) = 5 位,因此总缓存行大小将为:

  • 32字节而不是数据位
  • 5 位标签
  • 一个有效位
  • 一个脏位

有意义?