进程与内存9-高速缓存4(硬件高速缓存)

时间:2022-02-10 07:38:24

这篇主要是讲cache的基础知识,从网上也可以搜到相关的。

这篇主要是讲cache的基础知识,从网上也可以搜到相关的。

Cache的作用:

为了缩小cpu和ram之间的速度不匹配,引入了硬件高速缓存内存。它基于著名的局部性原理。

Cache的分类:

a. 统一的。指令和数据用同一个Cache。

b. 指令和数据分开的。有时这种组织方式也被称为改进的哈佛结构。

 

L1\L2\L3 cache的解释:

http://www.360doc.com/content/11/1013/01/1317564_155627198.shtml

自己看吧

Cache与主存的关系:

a.充分映射方式(fully associative)

主存中的任意一个行可以存放高速缓存中的任意位置。

 

b.直接映射方式(direct-mapped)

主存中的每个地址都对应Cache存储器中惟一的一行。由于主存的容量远远大于Cache存储器,所以在主存中很多地址被映射到同一个Cache行。

 

c.N-路组相关联映射方式(N-way set associative)

充分映射方式要进行搜索,所以比较慢。

直接映射方式虽然快,但是它是主存多行映射到一个行。假设是x\y\z三行映射到cache的第n行。我们程序是从访问从x->y->z顺序,那么假设读y,此时cache中是x。那么只能读内存,再把y复制到cache中。访问x\z时同样。这样cache就不起作用了,这个问题称为Cache抖动(Cache Thrash)

根据上面的原因,大部分选用了一个折中的方法:相关联映射方式

主存中的任意一个行可以存放在高速缓存N行中的任意一行中。

 

Cache的结构:

Cache的基本存储单元为Cache行(Cache line)。存储系统把Cache和主存储器都划分为相同大小的行。Cache与主存储器交换数据是以行为基本单位进行的。

高速缓存单元插在分页单元和主内存之间。有一个高速缓存内存和一个高速缓存控制器。高速缓存内存中存放真正的行。高速缓存控制器存放一个表项数组,每个表现对应高速缓存内存的一个行。每个表项有一个标签(tag)和描述高速缓存行状态的几个标签(flag)。

 

flag标签:Dirty位和Invalidate位

 

Cache行的大小通常是2L字节。通常情况下是16字节(4个字)和32字节(8个字)。如果Cache行的大小为2L字节,那么对主存的访问通常是 2L字节对齐的。

如果为充分映射方式和直接映射方式,对于一个虚拟地址来说,它的bit[31∶L]位,是Cache行的一个标识。当CPU发出的虚拟地址的bit[31∶L]和 Cache中的某行bit[31∶L]相同,那么Cache中包含CPU要访问的数据,即成为一次Cache命中。bit[31:L]中有标签(Tag和flag)。bit[L-1:0]是Offset

 

如果为N-路组相关联映射方式,一个cache组中包涵2S个行。那么bit[31:L+S]为标签,bit[L+S-1:L]为组标识(set), bit[L-1:0]是Offset

 

Cache的写策略:

通写(write-through):

控制器总是即写ram也写高速缓存行,为了提高写操作的效率关闭高速缓存。

 

回写(write-back)

只更新高速缓存行,不改变Ram的内容,提供了更快的功效。当cpu执行一条要求刷新高速缓存表项指令时,或者当一个FLUSH硬件信号产生时(通常在高速缓存不命中之后),高速缓存控制器才把高速缓存行写回RAM中。

 

比较了直写法和回写法的优缺点:

·  可靠性。直写法要优于回写法。这是因为直写法始终保证Cache是主存的正确副本。当Cache发生错误时,可以从主存中纠正。

·  与主存的通信量。一般情况下,回写法少于直写法。这是因为,一方面,Cache的命中率很高,对于回写法来说,CPU绝大多数操作只需要写 Cache,不必写主存。另一方面,当Cache失效时,要将Cache中的行替换到主存,而直写法每次只写一个字到主存。总的来说,由于直写法在每次写Cache时,同时写主存,从而增加了写操作的开销。而回写法是把与主存的数据交换集中到一次主存操作,可能要一次性的进行多个字的操作。

·  控制的复杂性。直写法必回写法简单。直写法在Cache的行状态表中不需要修改位。同时,直写法的纠错技术相对简单。

·  硬件代价。回写法比直写法好。因为直写法中,每次写操作都要写主存,因此为了节省写主存所花费的时间,通常要采用一个高速小容量的缓存存储器,把要写的数据和地址写到这个缓存中。在每次读主存时,也要首先判断所读的数据是否在这个缓存中。而回写法不需要上述操作,相对硬件代价要小。

 

写缓冲器:

看到上面用黑体字写的那句话了吧!这个就是写缓冲器

写缓存器是一个非常小的先进先出(FIFO)存储器,位于处理器核与主存之间。使用写缓 存的目的是,将处理器核和Cache从较慢的主存写操作中解脱出来。当CPU向主存储器做写入操作时,它先将数据写入到写缓存区中,由于写缓存器的速度很高,这种写入操作的速度也将很高。写缓存区在CPU空闲时,以较低的速度将数据写入到主存储器中相应的位置。

 

smp上的cache:

多cpu时每个cpu都有自己的本地cache,那么一个cache更新,所有的都有更新。这是由硬件上一个叫“高速缓存侦听”(cachesnooping)的单元来处理的。

 

Cache的替换策略:

在Cache访问过程中,发现查找的Cache行已经失效,则需要从主存中调入新的行到Cache中。当所有的对应行都已经装满时,就要使用Cache替换算法,从这些组中找出一个Cache,把它调回到主存中原来存放它的地方,腾出新行来存放新调入的行。如何选择一个行就是Cache的替换策略。在ARM常用的替换算法有两种:

 

轮转算法:

轮转算法又叫循环法,这种算法维护一个逻辑计数器,每进行一次替换,计算器加1,当计算器达到最大值时,就被复位成预先定义好的一个基值。这种算法容易预测最坏情况下的Cache性能。但它一个明显缺点就是,在程序发生很小变化时,可能造成Cache性能急剧下降。实时系统中会十分注重这个算法的可预测性。

 

随机替换算法:

随机算法从特定的位置上随机地选出一行替换出去。它通过一个随机发生器来完成上述操作。当每次需要替换Cache行时,随机发生器将产生一个随机数,用新 行将编号为该随机数的行替换出去。这种算法与轮转算法最大的区别在于它在每次产生替换行时,增加的是一个非连续值,这个值是由控制器随机产生的。同样,当丢弃计算器达到最大值时,会被复位成预先定义好的一个基值。

 

转换后援缓冲器(TLB):

TLB主要是为了加快线性地址的转换。它也是一种高速缓存。

当一个线性地址被第一次使用时,通过慢速访问RAM中的页表计算出相应的物理地址。同时,物理地址被存放在衣蛾TLB表项中,以便以后对同一个线性地址的引用可以快速地得到转换。

对应smp,不需要向cache一样同步。因为运行在现有cpu上的进程可以使同一线性地址与不同的物理地址发生关系。

 

总结:

主要的高速缓存都说完了,用一个表来总结一下。

进程与内存9-高速缓存4(硬件高速缓存)


在网络上,还有一个ARP Cache表概念,在此就不再讨论了。