C# 缓存实际上是如何将数据存储在;抵销;?

C# 缓存实际上是如何将数据存储在;抵销;?,c#,caching,computer-architecture,C#,Caching,Computer Architecture,因此,对于我的计算机体系结构类,我必须模拟C#上的缓存/内存关系,我只是不确定缓存实际上是如何存储数据的。我得到了缓存标记的概念,但我真的没有得到偏移量 假设我有一个RAM,它可以保存256个32位整数。我想有一个缓存系统,其中我有一个缓存,持有8个32位整数。但是,在缓存中的32位整数中,我需要添加标记和有效位,这使得它的大小大致降低到26位左右。那么,我如何在剩下的26位中存储32位数据呢 这是我现在拥有的代码,它仍在进行中 class Memory { public List<

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

假设我有一个RAM,它可以保存256个32位整数。我想有一个缓存系统,其中我有一个缓存,持有8个32位整数。但是,在缓存中的32位整数中,我需要添加标记和有效位,这使得它的大小大致降低到26位左右。那么,我如何在剩下的26位中存储32位数据呢

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

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;
        }
    }
}
类内存
{
公共列表指令=新列表();
const int directCacheSize=8;
ulong[]directCache=新ulong[directCacheSize];
私有int[]堆栈=新int[256];
公共int本[int i]
{
得到
{
int directMapIndex=i%directCacheSize;
if(directCache[directMapIndex]==Convert.ToUInt64(堆栈[i]))
{
返回Convert.ToInt32(directCache[directMapIndex]-18446744069414584320);
}
其他的
{

directCache[directMapIndex]=(Convert.ToUInt64(i)我一直在试图理解这个几乎不连贯的问题,我想我已经明白了

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

但后来我意识到,不,你的基本错误是把位和字节混淆了。你是从32个字节中减去6个字节,得到26个,但你应该把6个字节加到32 x 8位中

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

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

因此,我的直接映射缓存中的单个块将如下所示:[tag 5bit][data 32bit]

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

  • 八个32位字是32字节
  • 5位可以代表32个可能的标记
  • 如果您有32个标记和1024个字节,那么每个标记标识32个字节
那是一大堆32,你把他们弄糊涂了

重新开始

假设您想要一个包含8个32位字的单行,总共32个字节。在这个缓存行中必须包含什么

  • 32字节——不是位
  • 标识32字节来自何处的标记
  • 一个有效位
  • 一点脏东西
如果我们假设32字节只能位于32字节边界上,并且有1024/32=32个这样的边界,那么对于标记,我们需要log2(32)=5位,因此总缓存线大小为:

  • 32字节不是数据的位
  • 5位标签
  • 一个有效位
  • 一点脏东西

有意义吗?

我一直在试图理解这个几乎语无伦次的问题,我想我明白了

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

但后来我意识到,不,你的基本错误是把位和字节混淆了。你是从32个字节中减去6个字节,得到26个,但你应该把6个字节加到32 x 8位中

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

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

因此,我的直接映射缓存中的单个块将如下所示:[tag 5bit][data 32bit]

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

  • 八个32位字是32字节
  • 5位可以代表32个可能的标记
  • 如果您有32个标记和1024个字节,那么每个标记标识32个字节
那是一大堆32,你把他们弄糊涂了

重新开始

假设您想要一个包含8个32位字的单行,总共32个字节。在这个缓存行中必须包含什么

  • 32字节——不是位
  • 标识32字节来自何处的标记
  • 一个有效位
  • 一点脏东西
如果我们假设32字节只能位于32字节边界上,并且有1024/32=32个这样的边界,那么对于标记,我们需要log2(32)=5位,因此总缓存线大小为:

  • 32字节不是数据的位
  • 5位标签
  • 一个有效位
  • 一点脏东西

有意义吗?

我一直在试图理解这个几乎语无伦次的问题,我想我明白了

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

但后来我意识到,不,你的基本错误是你把位和字节混淆了。你是从32位减去6位