缓存如何在“偏移量”中实际存储数据
本文关键字:偏移量 存储 数据 缓存 | 更新日期: 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 字节边界上,并且有 1024/32 = 32 个这样的边界,那么对于标签,我们需要 log2(32) = 5 位,因此总缓存行大小将为:
- 32字节而不是数据位
- 5 位标签
- 一个有效位
- 一个脏位
有意义?