CACHE的引入.大容量主存一般采用DRAM,相对SRAM速度慢,而SRAM速度快,价格却很高. 程序和数据具有局限性,在一个较短的时间内,程序和数据往往集中在很小的存储器地址范围内. 因此在CPU和主存之间可设置一个速度很快而容量相对较小的存储器.在其中存放CPU当前正在使用以及一个较短时间内将使用的程序和数据,这样可以大大加快CPU访问存储器的速度,提高机器的运行效率.
CACHE的基本原理. cache和主存都分成块,每块由多个字节组成,大小相等. 在一个时间段内,cache的某块中存放着主存某块的全部信息,即cache的某一块是主存某块的副本(或叫映象). cache除数据部分外,还应记录放在某块中的信息是主存中的哪一块的副本. 因此还应该有第二个组成部分,即标记tag,记录主存块的块地址信息.采用cache后,进行访问存储器操作时,不是访问主存,而是先访问cache.所以存在访问cache时对主存地址(指物理地址)的理解问题.由于cache数据块和主存数据块大小相同,因此主存地址的低地址部分可作为cache数据块的块内地址. 对主存地址的高地址部分的理解与主存块和cache块之间的映象关系有关系.这里考虑一种最简单的情况-直接映象.例如将主存空间分成4096块,块编号应该是地址码的高12位,写成16进制为000H~FFFH. 按同样大小,将cache分成16块,块编号为0H~FH.这就是说块编号十六进制的第三位相同的主存块(共256块)只能和该位数码所指定的cache块建立映象关系.根据这种约定,某一主存块和cache建立起映象关系时,该cache块的标记部分只需记住主存块的高2位十六进制数. 例如第010号主存块当前和cache第0块建立其映象关系,则cache第0块的标记部分只需记住01H.由此可见,当用主存地址访问cache时,主存的块号可以分解成cache标记和cache块号部分.因此主存地址被理解成如下形式.
CPU进行读操作时,首先用主存地址的中间部分-cache块号找到cache中的一块(对此例为0块),找出此块的标记(对此块为01H),然后拿它与主存地址的高位部分-标记进行比较.对于第一个主存地址,比较的结果是相等的.这表明主存地址规定的块在cache中,这种情况称为命中,此时用主存地址的低位部分-块内地址从cache块号所选择的块中读取所需的数据,对于第二个主存地址,比较的结果不相等.这表明主存地址规定的块不在cache中,称为未命中,这时需要访问主存,并且将含有该地址单元的主存块的信息全部装入cache的第0块,并修改第0块的cache标记,使其值为02H.
通过上面的例子,我们可以这样来描述cache的工作原理: 在存储系统中设置了cache的情况下,CPU进行存储器访问时,首先访问cache标记,判断是否命中,如果命中就访问cache,否则访问主存.将访问的数据在cache中命中的次数与总的访问次数之比叫做命中率.影响命中率的因素主要有三个:cache的容量,cache块的划分以及cache与主存块的映象关系.一般来说,cache的容量大些,会提高命中率,但达到一定程度时,命中率的提高并不明显.目前一般为256KB或512KB,命中率可达98%左右.cache的功能全部由硬件实现,涉及cache的所有操作对程序员都是透明的.
Cache的读写操作.CPU进行存储器读操作时,根据主存地址可以分为命中和未命中两种情况.对于前者,从cache中可直接读到所需的数据,对于后者需要访问主存.并从访问单元所在的整个块从内存中全部调入cache,接着要修改cache标记.若cache已满,则需要按一定的替换算法,替换掉一个旧块. CPU进行存储器写操作时,也可分成两种情况.一是所要写入的存储单元不在cache中,这时写操作直接对主存进行操作,二是所要写入的存储单元在cache中时. 对于第二种情况需要做一些讨论.cache中的块是主存中相应块的副本,程序执行过程中如果遇到对某块单元进行写操作时,显然应保证相应的cache块与主存块的一致.这里有两种处理方式,一是暂时只写入cache,并用标志注明,至到这个块被从cache中替换出来,才一次写入主存,称之为回写式. 二是每次写入cache的同时也写入主存,称之为通写式.两种方式各有优缺点.回写式占用系统时间少,写速度快,但不能随时保证cache与主存一致.如果此期间发生DMA操作,则可能出错.通写式可使cache块与主存随时保持一致,但占用总线时间长,总线冲突较多.
文章评论(0条评论)
登录后参与讨论