高速缓冲存储器
问题的提出
CPU空等问题
在多体并行存储系统中,由于I/0设备向主存请求的级别高于CPU访存,这就出现了CPU等待I/0设备访存的现象,致使CPU空等一段时间,甚至可能等待几个主存周期,从而降低了CPU的工作效率。也因为CPU的速度提升比较快,存储器的速度提升慢,并且CPU运行速度是大于存储器的,速度差就会导致CPU空等。
因此出现了Cache高速缓冲存储器。CPU可以不直接访问主存,而与高速的Cache交换信息。
程序的局部性原理
时间局部性:当前正在使用的指令和数据在不久的将来还会被使用到。这些指令和数据就应该放到cache中。
空间的局部性:当前正在使用一个指令和数据,不久的将来,相邻的指令和数据也可能用到。
根据这一原理,只要将CPU近期要用到的程序和数据提前存入主存中,同时也要存相邻的指令和数据。
Cache工作原理
根据程序的局部性原理,可以将主存和缓存分成若干个块,每个块内包含若干个字,并且使它们大小相同。这样可以将主存的地址分为两段,高m为表示主存的块地址,低b位表示块内地址。同样,缓存也分成了两段,高c位表示缓存的块号,低b位表示块内地址。
如下图所示,将主存分为M个块,2m=M, Cache分成C个块,2c=C,C必定远小于M。
主存和缓存中对应块的大小是相同的,块内地址也是相同。在主存和Cache之间进行调送的时候是对整个块进行操作。即将主存中的某个块直接送到Cache中。字节顺序不会发生任何变化。
Cache中的标记标记了主存块和Cache块之间的对应关系。如果将一个主存块调用到Cache当中,则将主存中的块号写到标记中,当CPU要调用主存中的某个块时,只需看该块是否已在Cache中标记,若已有标记则直接访问Cache,否则将主存中的块调用到Cache中,并进行标记。
主存和Cache之间调用的是块,块内地址相同,大小相同。只调用不做修改。
命中和不命中
命中: CPU在访问主存时,如果要访问的块已经在缓存中,则称为命中。此时直接访问Cache即可。
未命中: CPU在访问主存时,要访问的块不在缓存中。需将要访问的块调入Cache,再进行访问。
命中率: 就是在Cache中访问到CPU要访问的字块的概率。设Nc表示访问Cache的总命中次数,Nm未访问主存的总次数,即未命中次数。命中率h=Nc/(Nc+Nm)
命中率与Cache的容量和块长有关。
Cache基本结构
架构图
基本结构原理图如下:
Cache主要有Cache存储体,地址映射变换机构、Cache替换机构几大模块组成。
Cache存储体
Cache存储体以块为单位与主存交换信息。为加速Cache与主存之间的调动,主存大多采用多体结构,且Cache访存的优先级最高。
地址映射变换机构
**地址映射变换机构是将CPU送来的主存地址转换为Cache地址。**由于主存和Cache的块大小相同,块内地址都是相对于块的起始地址的偏移量(即低位地址相同),因此地址变换主要是主存的块号(高位地址)与Cache块号间的转换。
如果转换后的Cache块已与j CPU欲访问的主存块建立了对应关系,即已命中,则CPU可直接访问Cache存储体。如果转换后的Cache块与CPU欲访问的主存块未建立对应关系,即不命中,此刻CPU在访问主存时,不仅将该字从主存取出,同时将它所在的主存块一并调人Cache,供CPU使用。
替换机构
当Cache内容已满,无法接受来自主存块的信息时,就由Cache内的替换机构按一定的替换算法来确定应从Cache内移出哪个块返回主存,而把新的主存块调人Cache。
Cache读写操作
读操作流程图
读操作流程如图所示:
(结合Cache架构图)当CPU发出主存地址后,主存Cache地址映射变换机构根据块号判断是否在Cache中,若命中则直接访问Cache中的块号和块内地址,并通过数据总线将Cache中的指令或数据传送给CPU。 若未命中,则需先判断,Cache是否已满,即是否可以直接将主存中对应的块装入Cache,若是,则访问主存,通过数据总线先将指令和数据传送给CPU,再通过直接通路,将指令和数据传送给Cache缓存。如果Cache已满,则需要通过Cache替换机构来访问主存并替换Cache中的某一个块。
Cache写操作
写操作主要是指CPU将数据写入主存的过程,这过程往往需要用到Cache。
在对Cache块进入写入信息时,必须保证与被映射的主存块内的信息完全一致。
为保证Cache与主存内容一致性问题,主要采用写直达法和写回法。
写直达法
在进行写操作时数据既写入Cache也写入主存。
这种方法的有点就是保证主存和Cache的数据的始终一致。更新策略容易实现。 缺点是容易反复对主存中的某一个块进行写操作,增加了访存次数。
写回法
写回法允许CPU和Cache中的数据的不一致,在进行写操作时只把数据写入Cache而不写入主存,但当Cache数据被替换出去时才写回主存。 比如在进行某一项计算的时候,计算过程中不写入主存,在计算结束后,才写入主存,并且可能是计算结果在短时间内不再用到时才写入。
这种方法的缺点就是Cache和主存中的数据可能不一致,特别是对并行程序多CPU而言,问题很严重。 为检测Cache中数据是否与主存一致,Cache中每一块还要增设一个标志位。
优点就是速度块,访存次数少。
Cache的改进
改进Cache可以对Cache进行分级或者将统一Cache变成分立Cache。