我正在一个系统架构课程,我听不太懂直接映射缓存是如何工作的。
我已经看过好几个地方,他们以不同的方式这让我更糊涂了解释。
我不明白是什么是标签和索引,以及他们如何选择?
从我的演讲的解释是:“地址划分是分为两名部分的索引用于寻址(32K)的RAM地址直接的休息时,标签被存储,并与输入标签进行比较(例如,15个比特)。”
在这情况下标签是从哪里来的? 因为它呈现直接映射缓存无用的(当与全关联缓存相比),它不能在RAM内存位置的完整地址。
非常感谢你。
我正在一个系统架构课程,我听不太懂直接映射缓存是如何工作的。
我已经看过好几个地方,他们以不同的方式这让我更糊涂了解释。
我不明白是什么是标签和索引,以及他们如何选择?
从我的演讲的解释是:“地址划分是分为两名部分的索引用于寻址(32K)的RAM地址直接的休息时,标签被存储,并与输入标签进行比较(例如,15个比特)。”
在这情况下标签是从哪里来的? 因为它呈现直接映射缓存无用的(当与全关联缓存相比),它不能在RAM内存位置的完整地址。
非常感谢你。
好的。 因此,让我们先了解CPU和缓存交互。
有存储器三层(广义地说) - cache
(通常由SRAM
芯片), main memory
(通常由DRAM
芯片),并storage
(通常磁性,如硬盘)。 每当CPU从某个特定位置需要的任何数据,它首先搜索缓存,看看它的存在。 高速缓存位于最靠近CPU在内存中层次结构方面,因此,它的访问时间是最少的(和成本是最高的),所以如果数据CPU正在寻找能在那里找到,它构成了一个“重灾区”,而数据从那里通过CPU使用获得。 如果它不存在,则该数据必须从主存储器到高速缓冲移动之前它可以由CPU来访问(CPU一般仅与高速缓存进行交互),即招致时间损失。
因此,找出数据是否存在或不在缓存中,各种算法被应用。 一个是这个直接映射高速缓存方法。 为简单起见,我们假设一个存储器系统,其中有可用的可用的(编号为0〜9)10点的高速缓冲存储器的位置,和40个的主存储器位置(编号0到39)。 这幅画总结说:
有40个的主存储器位置,但是仅提供高达10可容纳在缓存中。 所以,现在,通过一些手段,需要被重定向到一个缓存位置从CPU传入的请求。 这有两个问题:
如何重定向? 具体而言,如何做到这一点的,不会随时间而改变可预测的方式?
如果缓存位置已经与一些数据填充,从CPU传入请求必须确定从它要求数据的地址是否相同,其数据存储在该位置的地址。
在我们的简单的例子,我们可以通过一个简单的逻辑重定向。 鉴于我们已映射从0顺序编号39〜10的高速缓存单元40个的主存储器位置编号为0到9,用于存储器位置的缓存位置n
可以是n%10
。 所以21个对应于如图1所示,37对应于图7,等。即成为索引 。
但37,17,7都对应于7所以他们之间的区别,自带的标签 。 所以就像指数为n%10
,标签是int(n/10)
所以,现在37,17,7将具有相同的索引7,但不同的标签,如3,1,0,等。即,该映射可以完全由两个数据所指定 - 标签和索引。
所以,现在如果一个请求进来的地址位置29 9.指数对应的缓存位置数将转化为2的标签和索引,因此缓存位置没有。 9将被查询,看它是否包含任何数据,如果是这样,如果相关标签2.如果有,它是一个CPU命中和数据将从该位置立即取出。 如果是空的,或者标签不为2,这意味着它包含对应于一些其它存储器地址,而不是29的数据(虽然会具有相同的索引,这意味着它包含来自地址等9,19数据, 39,等等)。 所以这是一个CPU小姐,从位置数据没有。 在主存储器29将必须被加载到位置29(和变更为2的标签,和删除这是有之前的任何数据),之后它将由CPU要获取的缓存。
允许用一个例子。 64千字节的高速缓存,具有16字节高速缓存行具有4096个不同的高速缓存行。
你需要打破地址分为三个不同的部分。
您使用的指数位的数量是log_base_2(number_of_cache_lines)它是真正的集数,但在直接映射高速缓存,也有相同的行数和集]
直接映射高速缓存就是这样具有的行也被称为高速缓存行和至少2个列一个用于数据和另一个用于标签的表。
下面是它如何工作的:对缓存的读取访问需要被称为指数,并用它作为行数的地址的中间部分。 该数据和标签在同一时间都抬起头来。 接着,标签需要与地址的上部进行比较,以决定是否该行是从相同的地址范围在存储器中并且是有效的。 与此同时,该地址的下部可以用来选择来自高速缓存行的请求的数据(我假设一个高速缓存行可以容纳几个话数据)。
我强调了数据访问和标签访问一点点+比较发生在同一时间,因为这是关键,以减少等待时间(缓存的目的)。 数据路径RAM存取不需要有两个步骤。
其优点在于读基本上是一个简单的表查找和比较。
但它是直接映射,这意味着,每读地址恰好有在这个数据可以被缓存缓存一个地方。 因此,缺点是很多其他地址将被映射到同一个地方,这个高速缓存行可以竞争。
我发现,在已经给我提供我所需要的明确的解释图书馆一本好书,我现在碰到这个线程在这里分享的情况下,其他一些学生跌倒,而搜索关于缓存。
本书是“计算机体系结构-一种定量方法”第三版由轩尼诗和帕特森,第390页。
首先,请记住,主存储器划分成块的高速缓存。 如果我们有一个64个字节的高速缓存和1 GB的RAM,该RAM将被分成128个块KB(1 GB RAM / 64B缓存= 128 KB块大小的)。
从书:
在哪里能块放置在缓存?
<RAM Block Address> MOD <Number of Blocks in the Cache>
所以,让我们假设有内存32块和高速缓存的8块。
如果我们想从RAM块12存储到缓存中,RAM块12将被存储到缓存块4,为什么? 因为8分之12= 1其余4.其余是目标块。
如果一个块可以在任何地方在缓存中放置,缓存被认为是完全相关的 。
如果一个块可以在任何地方在受限制的组的高速缓存中的地方放置,缓存关联设置 。
基本上,一个集是一组在高速缓存块。 一个块首先被映射到一组,然后将块可以被放置在任何地方所设置的内侧。
的公式为: <RAM Block Address> MOD <Number of Sets in the Cache>
这样,让我们假设我们有RAM 32个块,并分成4组的高速缓存(具有两个块的每组,共意8块)。 这样设置0将有块0和1,设置1将有块2和3,等等...
如果我们想RAM块12存储到缓存中,RAM块将被保存在高速缓存块0或1。为什么呢? 因为12/4 = 3余数为0。因此设定0被选择,并且块可以放在任何地方内设定为0(意味着块0和1)。
现在,我将回到我原来的问题与地址。
块是如何发现,如果它是在缓存中?
在高速缓存中的每个块帧都有一个地址。 只是要清楚,一个块具有地址和数据。
块地址被划分为多个部分:标签,索引及偏移。
该标记被用于找到所述高速缓存内的块,索引仅示出了其中块位于(使它相当冗余)和用于选择所述数据的偏移量的设定。
通过“选择数据”我的意思是,在一个高速缓存块有明显会超过一个存储单元,用于它们之间进行选择的偏移。
所以,如果你要想象一个表,这些将是列:
TAG | INDEX | OFFSET | DATA 1 | DATA 2 | ... | DATA N
标签将被用来寻找块,指数将显示在其中设置的块,偏移会选择字段在其右侧的一个。
我希望我的这种理解是正确的,如果不是请让我知道。