设为首页 加入收藏

TOP

Cache的相关知识(二)(三)
2023-07-23 13:30:27 】 浏览:186
Tags:Cache 相关知
使主存储器有效,保证已经修改数据的cacheline写回主存储器,避免修改的数据丢失。(2)使高速缓存无效。保证切换后的进程不会错误的命中上一个进程的缓存数据。

因此,切换后的进程刚开始执行的时候,将会由于大量的cache miss导致性能损失。所以,VIVT高速缓存明显的缺点之一就是经常需要flush cache以保证歧义不会发生,最终导致性能的损失。

5.1.2 别名(alias)

当不同的虚拟地址映射相同的物理地址,而这些虚拟地址的index不同,此时就发生了别名现象(多个虚拟地址被称为别名)。通俗点来说就是指同一个物理地址的数据被加载到不同的cacheline中就会出现别名现象。 考虑这样的一个例子。虚拟地址0x1000和0x4000都映射到相同的物理地址0xa000。这意味着进程既可以从0x1000读取数据,也能从地址0x4000读取数据。假设系统使用的是直接映射VIVT高速缓存,cache更新策略采用写回机制,并且使用虚拟地址的位<15...4>作为index。那么虚拟地址0x1000和虚拟地址0x4000的index分别是0x100和0x400。这意味同一个物理地址的数据会加载到不同的cacheline。假设物理地址0xa000存储的数据是0x55aa。程序先访问0x1000把数据0x55aa加载到第0x100(index)行cacheline中。接着访问0x4000,会将0x55aa再一次的加载到第0x400(index)行cacheline中。现在程序将0x1000地址数据修改成0xaaff,由于采用的是写回策略,因此修改的数据依然保留在cacheline中,并未刷回主存。当程序试图访问0x4000的时候由于cache hit导致读取到旧的数据0x55aa。这就造成了数据不一致现象,这不是我们想要的结果。可以选择下面的方法避免这个问题。

别名的规避方法
??针对共享数据所在页的映射方式采用nocache映射。例如上面的例子中,0x1234和0x5678映射物理地址0xa000的时候都采用nocache的方式,这样不通过cache的访问,肯定可以避免这种问题。但是这样就损失了cache带来的性能好处。这种方法既适用于不同进程共享数据,也适用于同一个进程共享数据
??如果是不同进程之间共享数据,还可以在进程切换时主动flush cache(使主存储器有效和使高速缓存无效)的方式避免别名现象。但是,如果是同一个进程共享数据该怎么办?除了nocache映射之外,还可以有另一种解决方案。这种方法只针对直接映射高速缓存,并且使用了写分配机制有效。在建立共享数据映射时,保证每次分配的虚拟地址都索引到相同的cacheline。这种方式,后面还会重点说。


5.2 物理高速缓存(PIPT)

??通过对VIVT高速缓存的了解,可以知道VIVT高速缓存存在歧义和名别两大问题。主要问题原因是:tag取自虚拟地址导致歧义,index取自虚拟地址导致别名。所以,如果想让操作系统少操心,最简单的方法是tag和index都取自物理地址。物理的地址tag部分是独一无二的,因此肯定不会导致歧义。而针对同一个物理地址,index也是唯一的,因此加载到cache中也是唯一的cacheline,所以也不会存在别名。我们称这种cache为物理高速缓存,简称PIPT(Physically Indexed Physically Tagged)。PIPT工作原理如下图所示:

??CPU发出的虚拟地址经过MMU转换成物理地址,物理地址发往cache控制器查找确认是否命中cache。虽然PIPT方式在软件层面基本不需要维护,但是硬件设计上比VIVT复杂很多。因此硬件成本也更高。同时,由于虚拟地址每次都要翻译成物理地址,因此在查找性能上没有VIVT方式简洁高效,毕竟PIPT方式需要等待虚拟地址转换物理地址完成后才能去查找cache。而且,为了加快MMU翻译虚拟地址的速度,硬件上也会加入一块cache,作用是缓存虚拟地址和物理地址的映射关系,这块cache称之为TLB(Translation Lookaside Buffer)。当MMU需要转换虚拟地址时,首先从TLB中查找,如果cache hit,则直接返回物理地址。如果cache miss则需要MMU查找页表。这样就加快了虚拟地址转换物理地址的速度。如果系统采用的PIPT的cache,那么软件层面基本不需要任何的维护就可以避免歧义和别名问题。这是PIPT最大的优点。现在的CPU很多都是采用PIPT高速缓存设计。在Linux内核中,可以看到针对PIPT高速缓存的管理函数都是空函数,无需任何的管理。


5.3 物理标记的虚拟高速缓存(VIPT)

??为了提升cache查找性能,通常不想等到虚拟地址转换物理地址完成后才去查找cache。因此,可以使用虚拟地址对应的index位查找cache,与此同时(硬件上同时进行)将虚拟地址发到MMU转换成物理地址。当MMU转换完成,同时cache控制器也查找完成,此时比较cacheline对应的tag和物理地址tag域,以此判断是否命中cache。我们称这种高速缓存为物理标记的虚拟高速缓存VIPT(Virtually Indexed Physically Tagged)

??VIPT以物理地址部分位域作为tag,因此不会存在歧义问题。但是,采用了虚拟地址作为index,所以可能依然存在别名问题。是否存在别名问题,需要考虑cache的结构,我们需要分情况考虑。

5.3.1 VIPT Cache什么情况不存在别名

我们知道VIPT的优点是查找cache和MMU转换虚拟地址同时进行,所以性能上有所提升。歧义问题虽然不存在了,但是别名问题依旧可能存在,那么什么情况下别名问题不会存在呢?Linux系统中映射最小的单位是页,页大小通常有4KB、16KB、64KB。本小节以4KB页大小为例,此时虚拟地址和其映射的物理地址的位<11...0>是一样的。

  • 针对直接映射高速缓存,如果 cache的size小于等于4KB,这就意味着无论使用虚拟地址还是物理地址的低位查找cache结果都是一样的,因为虚拟地址和物理地址对应的index是一样的。这种情况,VIPT实际上相当于PIPT,软件维护上和PIPT一样。
  • 如果是一个四路组相连高速缓存,只要满足 一路的cache的大小小于等于4KB,那么VIPT方式的cache也不会出现别名问题。

5.3.2 VIPT Cache的别名问题

??假设系统使用的是直接映射高速缓存,cache大小是8KB,cacheline大小是256字节。这种情况下的VIPT就存在别名问题。因为index来自虚拟地址位<12...8>,虚拟地址和物理地址的位<11...8>是一样的,但是bit12却不一定相等。 假设虚拟地址0x0000和虚拟地址0x1000都映射相同的物理地址0x4000。那么程序读取0x0000时,系统将会从物理地址0x4000的数据加载到第0x00行cacheline。然后程序读取0x1000数据,再次把物理地址0x4000的数据加载到第0x10行cacheline,别名问题就出现了。相同物理地址的数据被加载到不同cachel

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

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目