http://blog.csdn.net/llhhyy1989/article/details/6783440
以前计算机是两层存储结构:主存和辅存。
现在大多出计算机中的三层存储结构是:高速缓存Cache、主 存储器和辅助存储器。
那为什么要提出高速缓存呢?
主要的原因是为了提高存储器的平均访问速度。使存储器的速度与CPU的速度想匹配。
那高速缓存是如何提高存储器的速度?
首先介绍一下高速缓存,名叫Cache,Cache有两部分组成:控制部分和Cache部分。Cache部分用来存放主存的部分复制信息。(后面会介绍)控制部分的功能是:判断CPU要访问的信息是否在Cache中。
CPU与Cache之间的数据交换是以字交换的,而Cache与主存储器之间的数据交换是以块交换的。一个数据块是由若干个字组成的。
所以当CPU访问主存的一个信息时,于是把信息的内存地址通知给Cache和主存。此时Cache中的Cache部分(上面提到的)会根据内存地址判断此信息是否在Cache中,若在,则命中,即直接把信息从Cache传给CPU,若不在,则未命中。那如何办呢?首先主存会把此信息的传递给CPU,然后再把此信息的数据块存放到Cache,防止CPU下次读取。
其实CPU访问的过程中,若是Cache未命中,主存把信息数据块存放到Cache中,涉及到局部性原理。
那既然提到了局部性,那么我们介绍一下局部性原理,记得这在操作系统中虚拟存储器页面置换中提到过。
局部性可以分为时间局部性和空间局部性。
时间局部性是指:当一个数据访问完之后,在最近一段时间内再次访问。
这种情况我们可以想想循环,循环就是此种情况。
空间局部性是指:当一个数据访问完之后,在最近一段时间内会访问它周围的数据。
这种情况我们可以想想数组,是不是这种情况哈。
刚才提到命中,理论是有了,那如何计算命中率呢?
命中率=Cache完成存取的次数/Cache完成存取的次数+主存完成的次数
h=N/N+M
那系统的访问时间:
= 命中率*Cache的周期+(1-命中率)*主存的周期
主存与Cache的地址映射:若是Cache中未命中,为了防止下次访问,则需要把主存中的字存放到Cache中,那如何定位主存的地址呢?
Cache的地址映射可以分为三种:直接映射、全相联映射、组相联映射
介绍一下这三种的原理。
首先Cache中的数据块称为行,而主存中的数据块称为块。
直接映射:主存中的地址只能映射到Cache中的确定的某一行。
主存的地址分为:块号地址S位和块内容(字)w位。
在直接映射中,Cache把主存块地址S分为两部分:r和s-r,其中r位作为cache的行地址, s-r位作为标记(tag)与块数据(字)保存在此行。若CPU访问主存中的数据,则cache用r位找到此行,然后用地址中的s-r 的标记部分与cache中r行的标记部分做对比,若相等则命中,否则失中。
在全相联映射中,Cache把主存地址s直接作为标记部分。若访问,直接把地址中的标记部分和cache中的标记部分进行比较。
在组相联映射中,主存地址首先确定分到cache的那个组(采用直接映射),然后分到确定组的任意行(采用全相联映射)。
直接相联优点:地址变换简单。
缺点:若是主存地址映射到Cache同一行中,则会出现冲突,灵活性较差。
全相联优点:主存地址可以存放cache中的任意一行,灵活。
缺点:地址变换复杂。
组相联:集上述两种优点一身。