ARM基础学习-Cache和写缓冲器

来源:互联网 发布:国外的即时通讯软件 编辑:程序博客网 时间:2024/04/26 03:54

Cache介绍

CPU的主频可以达到200MHZ,而一般性能的主存储器操用DRAM。其存储周期仅为100ns-200ns,主存储的性能将会影响整个系统的性能,Cache和写缓冲区位于主存储区和CPU之间,主要用来提高存储系统性能;

而cache经常与写缓冲器(write buffer)一起使用,使用writer buffer的目的是,将处理器和cache从较慢的对主存的写操作中脱离出来。
这里写图片描述

在处理器和MMU之间的cache称为逻辑cache,逻辑cache在虚拟地址空间存储数据,处理器可以直接通过cache访问数据,而无需通过MMU。逻辑cache又称为虚拟cache。

在MMU与物理存储器之间的cache称为物理cache,当处理器访问存储器时,MMU必须先把虚拟地址转换成物理地址,cache存储器才可以向处理器内核提供数据。

这里写图片描述

通过引入cache和写缓冲区,存储系统的性能得带很大提高,但是也带来了一些问题:
1. 由于数据存在于系统中不同的物理位置,可能造成数据的不一致性;
2. 由于写缓冲区的优化作用,可能有写操作的执行顺序不是用户期望的顺序,从而造成操作错误;

cache工作原理

在cache存储系统中,把cache和主存储器划分成相同大小的快,因此主存地址可以由块号B和块内地址W两部分组成,同样cache的地址也可以由块号b和块内地址w组成;

这里写图片描述

当CPU要访问cache时,CPU送来主存地址,放到主存地址寄存器中,通过地址变换部件把主存地址中的块号B变换成cache的块号b,并放到cache地址寄存器当中;同时将主存地址中的块内地址W直接作为cache的块内地址w装入到地址寄存器当中,如果变换成功(cache命中),就用cache的地址区访问cache,从cache中读取数据送到CPU中;如果不成功,则产生cache失效信息,并且用主存地址访问主存储器,从主存储器读出一个字送往CPU,同时把包含被访问字在内的一整块都从主存储器当中读取出来,放到cache中去;如果cache满了,通过替换策略来腾出空间;

cache结构

图12.4是一个4KB大小的cache存储器,这个cache存储器分为256行,每行由三部分组成:目录存储段,状态信息段和数据项段。

目录存储段:用来记录每个cache行所对应的主存中的地址,即告诉cache这个行里存放的数据时从主存的什么地方拷贝进来的。这个目录项里的数据被称为“cache标签”;

状态信息段:用来记录状态信息的状态位,两个常见的状态信息位是有效位(valid bit)和脏位(dirty bit)。有效位用来标记当前的cache行是活动的,即当前的cache行已经存放了从主存中取得的数据,并且可以被处理器所使用。脏位用来标记该cache行中所含的内容是与主存中的内容是否一致,即该cache行中的数据已经被改变,但还没有被写回到主存中,主存中的数据还是旧的数据。

数据项段:从主存中拷贝来的数据放在数据项段;

这个cache存储器拥有4KB的大小,被分成256行,而每行所占的大小为4个字(16字节)大小,所以为4KB。注意cache标签和状态信息位所占的空间并不计算在内。

这里写图片描述

cache的映射

cache的映射方式有三种:直接映射,组相联映射和全相联映射;

(1)直接映射

这里写图片描述

上图12.5便是一个直接映射的显示,在直接映射cache中,由于主存的容量要远远大于cache的容量,所以为了让大容量的主存能够全部映射到小容量的cache中,往往是主存中的多个地址对应cache中的一行。在上图12.5的例子中行,组索引的值为0x82,于是便找到了cache存储器中对应的一个cache行。

注意,因为这一个cache行对应了多个主存地址,在本例中一个cache行对应了1M的主存地址范围,而在任一时刻,该cache行只能对应着1M地址范围中的一个主存地址,所以要用标签再确定该cache行中具体的一个主存地址。用cache行中的cache标签与标签域中的标签比较,如果相等,则cache命中,然后便对该cache行进行读写操作。如果不相等,则cache失效,那么这个cache行的整个数据会被删除,并替换为CPU要访问的主存地址的内容,同时也将数据送到处理器中,这个过程称为替换。

优点:地址映象方式简单,数据访问时,只需检查区号是否相等即可,因而可以得到比较快的访问速度,硬件设备简单。
缺点:替换操作频繁,命中率比较低。

(2)组相联映射

直接映射虽然简单方便,但是如果程序同时用到了对应于同一个cache行中的两个主存地址,那么就会发生冲突,结果就是导致这个cache行不停的进行替换操作。所以就有了组相联映射;

组相联映射将这cache存储器中的256个行分为了4路,每路有64个cache行。这时根据组索引找到的 cache行不再是一个,而是同时找到 4个 cache行,所以才被称为组索引。每路中包含一个cache行。

因为现在每路中有 64 个 cache 行,所以组索引的宽度变成了6位,而标签域的标签宽度变成了12位。

直接映射中组索引一次只能对应一个cache 行,而现在组相联映射中组索引一次能对应4个cache行,所以现在主存中的一个地址可以存放到4个cache行中的任意一行。 而在直接映射中,主存中的一个地址只能存放到对应的一个cache行中。所以一个cache行被替换的概率减少为原来的四分之一。

这里写图片描述

优点:块的冲突概率比较低,块的利用率大幅度提高,块失效率明显降低。
缺点:实现难度和造价要比直接映象方式高。

(3)全相联映射

随着cache的相联度提高,冲突的可能性小了。理想的目标是,尽量提高组相联程度,使主存中的一个地址能够映射到cache存储器中的任意的cache行,这样的映射关系被称为全相联映射。

简单来说直接映射可以看成是一个只有1路的组相联映射,每路有256个cache行。上面的组相联映射有4路,每路有64个cache行。而全相联映射有很多路,每路中只有一个cache行。

这里写图片描述

优点:命中率比较高,Cache存储空间利用率高。
缺点:访问相关存储器时,每次都要与全部内容比较,速度低,成本高,因而应用少。

写缓冲区

写缓冲器是一个非常小的告高速存储缓冲器,用来临时存放处理器将要写入到主存中的数据,在没有写缓冲器的系统中,处理器直接写数据到主存中。在带有写缓冲器的系统中,cache直接将数据先写到写缓冲器中,然后写缓冲器再以低速写入主存中。这就将高速的CPU和cache从对主存的低速读写中脱离了出来。

写缓冲器同时还改善了cache的性能,这体现在cache行被替换时。当cache控制器要替换出一个脏的cache行时,它只将该cache行中的数据放入写缓冲器中,而不写入主存。这样就可以快速填充新的cache行数据,处理器就可以继续从cache存储器中读/写数据。

写缓冲器中的数据在没有被写入主存之前,是不能被读取的。同样,被替换的cache行在写缓冲器中时也不能进行读操作。这也是为什么写缓冲器的深度通常比较小的原因之一,一般只有几个cache行的深度。

cache替换策略

替换策略用于选择要替换cache行中的数据,应该替换哪个cache行。总的来说,组索引在各个way(路)中选择可用的一组cache行,而替换策略决定在该组中哪一路中的cache行会被新的数据替换。

1.轮转法: 简单地将当前分配的cache行的下一行作为被替换的行。

2.伪随机替换法:从特定的位置上随机地选出一行替换出去。

大多数ARM核两种策略都支持,相比之下,轮转法有更好的可预测性。然而,轮转法在存储器访问发生很小的变化时,有可能照成cache性能有较大的变化。

清理和清除cache

ARM使用清理和清除表示对cache的两种基本操作。

清理就是把脏的(即被改写过的)cache行强制写到主存,并把cache行中的脏位清零。清理cache可以重建cache和主存之间的一致性,它只是用在回写策略的D-cache上。

清除就是指清除cache中存储的全部数据,其实就是将cache使无效,将cache行中的有效位清零,让所有访问这个cache行的操作都不命中。

对cache进项清理和清除的操作是通过协处理器CP15中的寄存器C7实现的,具体操作指令看CP15协处理器寄存器详解。

0 0
原创粉丝点击