3.6 高速缓冲存储器
由于程序的转移概率不会很低,数据分布的离散性较大,单纯依靠并行主存系统提高主存系统的频宽是有限的。所以就要从系统结构上进行改进,采用存储体系。通常有“Cache-主存”层次和“主存-辅存”层次。
程序访问的局部性原理包括时间局部性和空间局部性。前者是指在最近的未来要用到的信息,很可能是现在正在用到的信息,因为有程序循环的存在。后者是指在最近的未来要用到的信息,很可能与现在正在使用的信息在存储空间上式邻近的。
高数缓冲技术就是利用程序访问的局部性原理,把程序中正在使用的部分存放在一个高速的,容量较小的Cache中,使CPU的访存操作大多数针对Cache进行,从而大大提高程序的执行速度。
Cache通常有SRAM构成
Cache和主存都被分为若干大小相等的块,每块由若干字节组成,块的长度称为块长。由于Cache的容量远小于主存,它仅保存主存中最活跃的部分。
当CPU发出读请求时,若访存地址在Cache中命中,就将此地址转换成Cache地址,直接对Cache进行读操作,与主存无关;若Cache不命中,则仍需要访问主存,并把此字所在的块一次性地从主存调入Cache。若Cache已满,则需根据某种替换算法,用这个块替换Cache中原来的某块信息。
对于写,也有Cache与主存不一致问题,这时候就有全写法和写回法
Cache的总命中次数为Nc,访问主存的总次数为Nm,则命中率H就为:
Cache和主存的映射方式
1> 直接映射。若这个位置已有内容,则产生块冲突,原来的块将无条件地被替换出去。
,j是Cache的块号,i是主存的块号,
是Cache中的总快数。
2> 全相联映射
把主存数据块装入Cache中的任何位置
3> 组相联映射
将Cache空间分成大小相同的组,主存的一个数据块可以装入一组内的任何一个位置,即组间采取之间映射,组内采用全相联映射。当Q=1是变为全相联映射,当Q=Cache块数时变为直接映射。
j是缓冲的组号,i是主存的块号,Q是Cache的组数。
Cache中主存块的替换算法
采用全相联映射和组相联映射,需要替换算法。而直接映射不需要。
1> 随机算法(RAND):随机地确定替换的Cache块。但未依据程序访问的局部性原理
2> 先进先出算法(FIFO):选择最早调入的行进行替换。未依据程序访问的局部性原理。
3> 最近最少使用算法(LRU):依据程序访问的局部性原理选择近期内长久未访问过的存储行作为替换的行,是堆栈类算法。
4> 最不经常使用算法(LFU):将一段时间内被访问的次数最少的存储行换出。
Chache写策略
对于Cache写命中
1> 全写法。当CPU对Cache写命中时,必须把数据同时写入Cache和主存。
2> 写回法。当CPU对Cache写命中时,只修改Cache的内容,而不立即写入主存,只有当此块被换出时才写回主存。
对于Cache写不命中
1> 写分配法。加载主存中的块到Cache中,然后更新这个Cache块。
2> 非写分配法。只写入主存,不进行调块。
非写分配法通常与全写法合用,写分配法通常和写回法合用