`
ihuashao
  • 浏览: 4532615 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

【我所認知的BIOS】-->Cache(1)

阅读更多

【我所認知的BIOS-->Cache(1)

LightSeed

2009-11-12

在文章前面我想说一下,CPU的cache是一个很有趣的部件,对它研究我目前也还仅仅处于486架构上的研究。因为我手上也就只找到了《80486 System Architecture》这本书(这本书里面讲的非常非常详细,我个人很喜欢这样的书籍)。据说P4 CPU也有这样一本书,不过在国内好像找不到,如果您是有这本的书的话,能否给我让我瞧瞧?这样的话,我会很感谢您的!

另外,由于关于cache的东西比较多(当然其实有两个大的方向,就是数据一致性和运行机制,掌握了这两个大的目标我想cache对于您来说就不算什么难事了。),所以我准备把整理好的小结分成三篇文章放到blog里。这样可以降低每一篇文章的篇幅。否则篇幅太长,我担心大家会睡着了。呵呵。。。(开玩笑啦。)

1、什么cache

引用自互动百科里面关于cache的定义:

Cache存储器:电脑中为高速缓冲存储器,是位于CPU主存储器DRAM(Dynamic Random Access Memory)之间,规模较小,但速度很高的存储器,通常由SRAM(Static Random Access Memory静态存储器)组成。CPU的速度远高于内存,当CPU直接从内存中存取数据时要等待一定时间周期(在后续的时序图中我们可以很清楚地看到这个等待周期。),而Cache则可以保存CPU刚用过或循环使用的一部分数据,如果CPU需要再次使用该部分数据时可从Cache中直接调用,这样就避免了重复存取数据,减少了CPU等待时间,因而提高了系统的效率。Cache又分为L1 Cache一级缓存)和L2 Cache二级缓存),L1 Cache主要是集成在CPU内部,而L2 Cache集成在主板上或是CPU上。

2cache的工作原理

同样引用自互动百科:

cache工作原理是基于程序访问的局部性。对大量典型程序运行情况的分析结果表明,在一个较短的时间间隔内,由程序产生的地址往往集中在存储器逻辑地址空间的很小范围内。指令地址的分布本来就是连续的,再加上循环程序段和子程序段要重复执行多次。因此,对这些地址的访问就自然地具有时间上集中分布的倾向。数据分布的这种集中倾向不如指令明显,但对数组的存储和访问以及工作单元的选择都可以使存储器地址相对集中。这种对局部范围的存储器地址频繁访问,而对此范围以外的地址则访问甚少的现象,就称为程序访问的局部性

根据程序的局部性原理,可以在主存和CPU通用寄存器之间设置一个高速的容量相对较小的存储器,把正在执行的指令地址附近的一部分指令或数据从主存调入这个存储器,供CPU在一段时间内使用。这时提高程序的运行速度有很大的作用。这个介于主存和CPU之间的高速小容量存储器称作高速缓冲存储器(cache)。系统正是依据此原理,不断地将与当前指令集相关联的一个不太大块后继指令集从内存读到cache,然后再与CPU高速传送,从而达到速度匹配。

CPU对存储器进行数据请求时,通常先访问cache。由于局部性原理不能保证所访问数据百分之百地在Cache中,这里便存在一个命中率的说法。即CPU在任一时刻从Cache中可靠获取数据的几率。命中率越高,快速正确获取数据的可靠性就越大。Cache的存储容量比主存的容量小得多,但不能太小,太小会使命中率太低;也没有必要过大,过大不仅会增加成本,而且当容量超过一定值后,命中率随容量的增加将不会有明显地增长。只要Cache的空间与主存空间在一定范围内保持适当比例的映射关系Cache的命中率还是相当高的。一般规定Cache与内存的空间比为41000,即128kB Cache可映射32MB内存;256kB Cache可映射64MB内存。在这种情况下,命中率都在90%以上。至于没有命中的数据,CPU只好直接从内存获取。获取的同时,也把它拷进Cache。以备下次访问。


3cache的基本结构

cache通常由相联存储器实现。相联存储器的每一个存储块都具有额外的存储信息,称为标签(Tag)(后续会详细讲解)。当访问相联存储器时,将地址和每一个标签同时进行比较,从而对标签相同的存储块进行访问。

Cache的基本结构中分成三类:

①全相联cache

②直接映像cache

③组相联cache

不过手上目前只有486的资料,那么我就和大家探讨一下关于直接映像的这种结构工作过程。(笔者:486上的架构运行就是第二种。这里我理解不正确的话还望大家指点哦。)其做法是,为Cache中的每个块位置分配一个索引字段,用Tag字段区分存放在Cache位置上的不同的块。单路直接映像把主存储器分成若干页,主存储器的每一页与cache存储器的大小相同,匹配的主存储器的偏移量可以直接映像为cache偏移量。CacheTag存储器保存着主存储器的页地址(页号)(笔者:通过这个页号就可以算出main memory中的实际偏移)。从以上可以看出,直接映像cache优于全相联Cache,能进行快速查找,其缺点是当空存储器的组之间做频繁调用时,cache控制器必须做多次转换。关于这个机构在实际的486上是怎么运行的,让我们拭目以待。


4cache的技术概要

4.1 读取顺序

CPU要读取一个数据时,首先从Cache中查找,如果找到就立即读取并送给CPU处理;如果没有找到,就用相对慢的速度从内存中读取并送给CPU处理,同时把这个数据所在的数据块调入Cache中,可以使得以后对整块数据的读取都从Cache中进行,不必再调用内存。

正是这样的读取机制使CPU读取Cache命中率非常高(大多数CPU可达90%左右),也就是说CPU下一次要读取的数据90%都在Cache中,只有大约10%需要从内存读取。这大大节省了CPU直接读取内存的时间,也使CPU读取数据时基本无需等待。总的来说,CPU读取数据的顺序是先Cache后内存。

4.2 读取命中率

CPUCache中找到有用的数据被称为命中,当Cache中没有CPU所需的数据时(这时称为未命中hit miss)CPU才访问内存。从理论上讲,在一颗拥有2CacheCPU中,读取L1 Cache的命中率为80%CPUL1Cache中找到的有用数据占数据总量80%,剩下的20%L2 Cache读取。由于不能准确预测将要执行的数据,读取L2的命中率也在80%左右(L2读到有用的数据占总数据的16%)

为了保证CPU访问时有较高的命中率,Cache中的内容应该按一定的算法替换。算法是“最近最少使用算法”(latest recently use LRU算法,后面会详细探讨一下关于LRU算法在486上的运用。),它是将最近一段时间内最少被访问过的行(line)淘汰出局。这是一种高效、科学的算法,其计数器的判断过程可以把一些频繁调用后再不需要的数据淘汰出Cache,提高Cache利用率

4.3WB&WT

WBWT分别是write backwrite through的缩写。为了保证cachemain memory的数据一致性而设计的数据更新方法。(笔者:在IA32 programming guide里有比较详细的介绍其他的属性,不过WBWT是两种非常典型的方法,今天在这里拿他们来做详细的分析。)

write through

在这种机制下,每当CPU把数据写到cache中的时候,cache controller就会立即把数据写入对应的main memory。(这种理解更新的机制叫做snarf,这个单词网上还查不到翻译的,所以也就没有翻译。)因此,main memory随时跟踪cache到最新的数据版本,从而也就不会有main memory将新的数据丢失的问题。不过这样的话,也有一个显而易见的缺点,每次更新数据的时候,都会有总线的操作,总线操作就过于频繁,系统的性能会降低。

write back

在这种机制下,cache每个区块的标记中都要设置一个更新为,CPUcache中的一个区块快写入数据后,更新位置要好标记。(比如说为1.)由于cache的速度比DRAM的速度可快了很多很多了,如果先checkcache中有需要更新的数据,那么就会先更新cache中的数据,并且阻止总线把数据写入到main memory中去。如果再次更新的话,cache会把原来存在cache中的数据先写回(write back)到main memory,再做cache内部的数据更新。(笔者:后面会详细讲操作过程。)

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics