设为首页 加入收藏

TOP

Cache的相关知识(二)(二)
2023-07-23 13:30:27 】 浏览:185
Tags:Cache 相关知
8 Bytes。以两路相连缓存为例(两路组相连缓存就是将cache平均分成2份,每份32 Bytes),如下图所示:

??cache被分成2路,每路包含4行cache line。所有索引一样的cache line组合在一起称之为 组(set)。上图中一个组有两个cache line,总共4个组。我们依然假设从地址0x1234地址读取一个字节数据:由于cache line size是8 Bytes,因此offset需要3 bits,这和之前直接映射缓存一样。不一样的地方是index,在两路组相连缓存中,index只需要2 bits,因为一路只有4行cache line。上图中根据index找到第3行cache line,第3行对应2个cache line,分别对应way 0和way 1。因此index也可以称作 set index(组索引)。先根据index找到set,然后将组内的所有cache line对应的tag取出来和地址中的tag部分对比,如果其中一个相等就意味着命中。

两路组相连缓存优缺点:
??两路组相连缓存较直接映射缓存最大的差异就是:一个地址对应的数据可以对应2个cache line,而直接映射缓存一个地址只对应一个cache line。
(1)缺点
??两路组相连缓存的硬件成本相对于直接映射缓存更高。因为其每次比较tag的时候需要比较多个cache line对应的tag(某些硬件可能还会做并行比较,增加比较速度,这就增加了硬件设计复杂度)。
(2)优点
??有助于降低cache颠簸可能性。

原因如下:
??根据两路组相连缓存的工作方式,可以画出主存地址0x00-0x60地址对应的cache分布图。

对于两路组相连映射方式,如果一个程序试图依次访问地址0x00、0x40、0x80时:
??0x00地址的数据可以被加载到way 0,0x40可以被加载到way 1(0x80地址数据占不考虑)。这样就在一定程度上避免了直接映射缓存的颠簸现象。在两路组相连缓存的情况下,0x00和0x40地址的数据都可以被同时缓存在cache中。假设,如果我们是N路(多路)组相连缓存,后面继续访问0x80,也可以同时缓存在cache中。

??因此,当cache size一定的情况下,组相连缓存对性能的提升最差情况下也和直接映射缓存一样,在大部分情况下组相连缓存效果比直接映射缓存好。同时,其降低了cache颠簸的频率。从某种程度上来说,直接映射缓存是组相连缓存的一种特殊情况,每个组只有一个cache line而已。因此, 直接映射缓存也可以称作单路组相连缓存


3.3 全相连映射方式

??上一节描述了组相连缓存的优缺点,可以发现优点远远大于缺点。那么如果所有的cache line都在一个组内。岂不是性能更好。是的,这种缓存就是全相连缓存(Full associative cache)。本小节我们依然假设cache size为64 Bytes ,cache line size是8 Bytes为例进行说明。

??由于所有的cache line都在一个组内,因此地址中不需要set index部分。因为,只有一个组可以被选择。根据地址中的tag部分和所有的cache line对应的tag进行比较(硬件上可能并行比较也可能串行比较)。哪个tag比较相等,就意味着命中某个cache line。因此,在全相连缓存中,任意地址的数据可以缓存在任意的cache line中。所以,这可以最大程度的降低cache颠簸的频率。但是硬件成本上也是更高

??因此,综合成本的问题,同时为了解决直接映射高速缓存中的高速缓存颠簸问题,组相联(set associative)的高速缓存结构在现代处理器中得到广泛应用。


4. cache line作为传输单位的原因?

为什么cache line大小是cache控制器和主存之间数据传输的最小单位呢?
因为每个cache line只有一个dirty bit。这一个dirty bit代表着整个cache line是否被修改的状态。


5. Cache组织方式

cache控制器根据地址查找判断是否命中,这里的地址究竟是虚拟地址(virtual address,VA)还是物理地址(physical address,PA)?
??我们应该清楚CPU发出对某个地址的数据访问,这个地址其实是虚拟地址,虚拟地址经过MMU转换成物理地址,最终从这个物理地址读取数据。因此cache的硬件设计既可以采用虚拟地址也可以采用物理地址甚至是取两者地址部分组合作为查找cache的依据。


5.1 虚拟高速缓存(VIVT)

虚拟高速缓存,这种cache硬件设计简单。在cache诞生之初,大部分的处理器都使用这种方式。虚拟高速缓存以虚拟地址作为查找对象。如下图所示。

??虚拟地址直接送到cache控制器,如果cache hit。直接从cache中返回数据给CPU。如果cache miss,则把虚拟地址发往MMU,经过MMU转换成物理地址,根据物理地址从主存(main memory)读取数据。由于根据虚拟地址查找高速缓存,所以是用虚拟地址中部分位域作为索引(index),找到对应的的cacheline。然后根据虚拟地址中部分位域作为标记(tag)来判断cache是否命中。因此,针对这种index和tag都取自虚拟地址的高速缓存称为虚拟高速缓存,简称VIVT(Virtually Indexed Virtually Tagged)

虚拟高速缓存(VIVT)优缺点:
(1)优点
??虚拟高速缓存的优点是不需要每次读取或者写入操作的时候把虚拟地址经过MMU转换为物理地址,这在一定的程度上提升了访问cache的速度,毕竟MMU转换虚拟地址需要时间。同时硬件设计也更加简单。
(2)缺点
??正是使用了虚拟地址作为tag,引入很多软件使用上的问题。 操作系统在管理高速缓存正确工作的过程中, 主要会面临两个问题。歧义(ambiguity)和别名(alias)。为了保证系统的正确工作,操作系统负责避免出现歧义和别名。

5.1.1 歧义(ambiguity)

歧义是指不同的数据在cache中具有相同的tag和index。cache控制器判断是否命中cache的依据就是tag和index。这种情况下,cache控制器根本没办法区分不同的数据。这就产生了歧义。

什么情况下发生歧义呢?
不同的物理地址存储不同的数据,只要相同的虚拟地址映射不同的物理地址就会出现歧义。

例如两个独立的进程,就可能出现相同的虚拟地址映射不同的物理地址的场景:
??假设A进程虚拟地址0x1234映射的物理地址为0x2000。B进程虚拟地址0x1234映射的物理地址为0x3000。当A进程运行时,访问0x1234地址会将物理地址0x2000的数据加载到cacheline中,当A进程切换到B进程的时候,B进程访问0x1234时,会直接出现cache hit,此时B进程就访问了错误的数据,B进程本来想得到物理地址0x3000对应的数据,但是却由于cache hit得到了物理地址0x2000的数据。
??操作系统如何避免歧义的发生呢?当我们切换进程的时候,可以选择flush所有的cache。flush cache操作有两种可选的操作方式:(1)使主存储器有效。针对write back高速缓存(先更新缓存,替换时将修改过的块写回内存),首先应该

首页 上一页 1 2 3 4 5 6 7 下一页 尾页 2/7/7
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇UBOOT编译--- UBOOT编译过程目标.. 下一篇UBOOT编译--- UBOOT的$(version_h..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目