如果我发这篇文章时出错了,我很抱歉。如果我需要改变什么,请告诉我。
我已经收到了我的电脑架构作业,我错过了这个问题。我的教授的解释对我没有意义,我不同意他对我说的话,所以我在这里问你们的想法。
以下是一个问题:
计算机使用16位内存地址.主存是512KB
,缓存是1KB
,每个块都有32B
。给定以下每个映射函数,计算内存地址的每个字段中的位数。
下面是我如何处理问题的直接映射部分:
缓存内存:1KB (2^10)
,16位内存地址(1 word = 2B) -> 1024B/2B = 512 words
,每块16字(32B)
-> 512/16 = 32 cache memory blocks
.
主存:512 KB (2^19)
,16位内存地址(1 word = 2B) -> 524288B/2B = 256K words
,每块16字(32B) -> 256K/16 = 16384 or 16K
内存块.
我理解单词标签是这样的:每个块的32B
允许每个块的16 16-bit
内存地址。这个(我相信)支持这一点:每个块中的1 word = 16 bits = 2 B -> 32B/2B = 16 words
。这等同于2^4 = 4 bits
,用于确定块中的哪个单词,将12 bits
留给标记和内存地址中的块位。
现在,为了将16K
主内存块直接映射到32
缓存内存块,必须有映射到每个缓存内存块的512
主内存块。因此,每个512/16K
块都是1/32
块。
这就是我困惑的地方。这不需要9
标记位,比如2^9 = 512
(主内存块可能映射到一个缓存内存块)吗?
对于指向缓存中特定块的块位,这需要5 bits
。2^5 = 32
,缓存内存中的块。
这需要内存地址中的18 bits
。
这是我教授对这个问题的回答:
2^5 = 32 -> 5
字位
(1KB)/(32B)
= 32块-> 5块位
16 – 5 – 5 = 6
标签位
我没有意识到我可以简单地减去所需的块和字位来获得标记位。但对我来说还是没有意义。每个缓存块的2^6 = 64 blocks
。64*32
给了2048
。我不能把我的头绕在这上面。有人能帮忙吗?
发布于 2019-04-19 17:59:59
好的,我学到的术语略有不同,但是这个解释的原理应该是一样的。
因此,缓存将有多个集(有点像单元格)。每个集合将有一个缓存线(包含一个数据块)或多个缓存线(每个包含一个数据块)(直接映射或n-结合映射)。
在将主存储器块映射到高速缓存时,将主存储器地址(16位)划分为3个字段:标记、索引位和偏移位。一个内存单元是一个字节,一个块由几个单元组成。
偏移位用于访问内存块的各个字节。把它看作是块基地址顶部的偏移量,以获得您想要的字节(我假设您的内存应该是byte-addressable,而不是可寻址的字,因为访问2B单词没有意义,因为这是不灵活的),在这里,您的prof/教科书将它称为字位。因此,如果一个块有32个字节,则需要log2(块大小)= 5位来访问映射块中的单个单元。
索引位(在直接映射的缓存中也称为块位,因为集合的数量与缓存中的块数相同)用于识别主内存块映射到缓存的/cache行/缓存块。缓存中有1KB/32B =32个缓存块。使用作为直接映射,每个集合只包含一个缓存块,因此这个缓存中将有32个缓存块。因此,要访问缓存中的正确集,需要5位,因此索引位=5位
标记是一个用于确定缓存中的数据块是否正确的名称,我们从主内存中查找数据块。由于主存储器的地址是16位,而且我们已经知道索引和偏移字段,因此很容易推断标签将需要16-5-5-6位。我们如何确定标记并不是真正关心的块大小和缓存大小(因此没有。在这里给出了缓存中的集合)。
https://stackoverflow.com/questions/55715460
复制相似问题