(5) 写cache的策略和对系统性能的影响

  通常情况下,一个计算机系统内可能有多个CPU,它们可能有各自的cache和公用的主存,可能还有多个可以独立申请主存读写的设备(此时称它们为总线主设备Bus Masters)。当任何一个CPU要完成写cache(主存),或任何一个设备要执行读主存或写主存操作时,必须保证共享这些有关主存单元的CPU和总线主设备所用到的数据都是合法的(数据一致性原则)。例如,一个外设向主存写入了一个数据,而该主存单元的内容在此之前已有一个副本在CPU的cache中,此时,该主存单元内容与它在cache中的副本就出现了不一致,怎么办呢?不理睬、不解决显然是不行的,此时最简便的办法,可能就是把相应cache单元中的有效位清掉,当CPU再次需读这一主存单元时,它只能从主存中重新取得被外设修改过的新值,而不会使用原cache中过时的旧值。又如,当CPU向自己的一个cache单元中写入一个新值,但尚未修改与之相应的主存单元的内容时,也出现了二者间数据不一致性的问题,该怎样处理呢?常用的策略有两种:一种策略是写了cache之后,立即修改主存,称为写直达(Write_ through),其优点是处理简单,数据一致性容易保证,其缺点是,配置cache未给写操作带来好处,会拖慢CPU的运行速度,更糟的情况也许会发生,一些写主存的操作是徒劳无功的,因为没有其它CPU、外设去读这些被重写过的主存单元。另一种策略是,写完cache之后,不直接去改写相应的主存单元的内容,但把这些主存单元的地址登记到cache控制器中的一张列表中,若有另外的CPU或外设发出读主存的请求,并将主存地址送到地址总线之上时,首先用这一地址与原来保存在cache的那张列表中的全部地址内容(可能多条)相比较,这一操作称为总线监听。若比较的结果都不同,表明本次的读请求使用的不是那些尚待修改内容的主存单元,让本次读操作继续执行完即可;若与列表中的某一个地址相同,则表明本次读的主存单元目前保存的是一个无效(等待修改)的数据,不能充许读操作进行,需要首先发出命令停止该读操作,再把保存在cache单元中的正确数据,通过一个写主存周期将其写入相应的主存单元,接下来再启动刚停下来的读操作,则CPU或外设读得的一定是正确的数据。这一策略的优点是明显的,它确保每一次写主存都是必需完成的那一部分,而不全出现徒劳的写操作,系统性能高。这种策略称为拖后写(write_back)。其缺点是实现上比较复杂,成本较高。