由于Cache中保存的只是主存的部分副本,那么,这些副本与主存中的内容是否能保持一致,这是Cache能否可靠工作的一个关键问题。
  由于以下两个原因,在一段时间内,主存某单元中的内容与Cache对应单元中的内容可能不相同。这样,就造成Cache与主存的不一致问题。
  (1) 如图5.36(a)所示。由于CPU写Cache,把Cache某单元中的内容从X修改成了X',而主存对应单元中的内容还仍然是X,没有改变。
  (2) 如图5.36(b)所示。由于输入输出处理机或输入输出设备修改了主存某单元中的内容,把X修改成了X',而Cache对应单元中的内容还仍然是X,没有改变。
  当第1种情况发生时,如果把包括X在内的主存中的数据输出到设备去,或者在第2种情况发生时,CPU读了Cache中的数据X,都可能造成错误。
  解决Cache与主存的不一致性问题,首先要选择合适的Cache更新算法。主要有两种Cache更新算法,写直达法和写回法WB(Write-Back)。写直达法又称为写通过法WT(Write-through),写回法又称为抵触修改法。
  写回法是指CPU在执行写操作时,被写数据只写入Cache,不写入主存。仅当需要替换时,才把已经修改过的Cache块写回到主存。在采用这种更新算法的Cache块表中,一般有一个"修改位"。当一块中的任何一个单元被修改时,这一块的修改位就被置"1",否则这一块的修改位仍保持"0"。在需要替换这一块时,如果对应的修该位为"1",则必须先把这一块写回到主存中去之后,才能再调入新的块。如果修改位为"0",则这一块不必写回主存,只要用新调入的块覆盖掉这一块即可。
图 5.36 Cache 与主存不一致的两种情况
  写直达法是指CPU在执行写操作时,必须把数据同时写入Cache和主存。这样,在Cache的块表中就不需要"修改位"。当某一块需要替换时,也不必把这一块写回到主存中去,新调入的块可以立即把这一块覆盖掉。
  比较写回法与写直达法的优缺点如下:

  (1) 可靠性:写直达法要优于写回法。这是因为写直达法能够始终保持Cache是主存的正确副本。如果Cache发生错误,可以从主存得到纠正。而写回法当发生图5.36所示的两种情况时,在一段时间内,Cache并不是主存的正确副本。

  (2) 与主存的通信量:一般情况下,写回法少于写直达法。原因可以从两方面来分析。一方面,由于Cache的命中率一般很高,对于写回法,CPU的绝大多数写操作只需写Cache,不必写主存。另一方面,当写Cache发生块失效时,可能要写一个块到主存,而写直达法每次只写一个字到主存。而且,即使是读操作,当Cache不命中时,写回法也可能因为发生块替换而要写一块到主存。

总的来看,写直达法是把写主存的开销化在每次写Cache时再增加一个比写Cache要长得多的写主存操作上。而写回法是把写主存的开销集中在当发生Cache块失效时,可能要一次性地写一个块到主存。到底哪一种方法与主存的通信量更少,可以看下面的一个简单例子。
  据统计,在访问存储器的操作中,写操作一般要占10%到34%,这里假设为20%。Cache的命中率为99%。每块为4个字,主存的字长为一个字。当Cache发生块替换时,有30%块需要写回到主存,其余的块因为没有被修改过而不必写回主存。则对于写直达法,写主存的信息量为20%;而对于写回法,写主存的信息量为:(1-99%)×30%×4=1.2%。因此,与主存的通信量,写回法要必写直达法少10多倍。
  另外,无论是写回法,还是写直达法,当出现写Cache不命中时,都有一个是否要把包括所写字在内的一个块从主存读入Cache的问题。一般有两种方法。一种是"不按写分配法",这种方法在发生写Cache不命中时,只把所要写的字写入主存,而包括所写字在内的一个块不从主存读入Cache。另一种是"按写分配法",这种方法在写Cache不命中时,除了完成把所写字写入主存之外,还要把包括所写字在内的一个块从主存读入Cache。这两种方法效果对于写回法和写直达法有所不同,但差别不大。目前,一般在写回法中采用按写分配法,而在写直达法中采用不按写分配法。

  (3) 控制的复杂性:写直达法比写回法简单。写回法要在块表中为每一块设置一个修改位,而且要对修改位进行管理和判断。而写直达法不需要设置修改位。另外,由于写直达法能够始终保持Cache是主存的正确副本。一旦Cache发生错误,可以从主存得到纠正。因此,Cache通常只需要采用简单的奇偶校验即可。而对于写回法,Cache中的块必须自己独立保证正确性,因此要采用相对比较复杂的纠错码。

  (4) 硬件实现的代价:写回法要比写直达法好。在写直达法中,因为每次写操作都要写主存,因此为了节省写主存所花费的时间,通常要采用一个高速小容量的缓冲存储器,把要写主存的数据和地址先写到这个缓冲存储器中。在每次读主存时,也要首先判断所读的数据是否在这个缓冲存储器中。而写回法的硬件实现代价相对比较低。

  目前,很多单处理机都采用写回法,主要目的是为了减少Cache与主存之间的通信量。也有不少的单处理机采用写直达法,目的是为了硬件的控制比较简单。而几乎所有的多处理机都采用写直达法。例如,IBM 3033、IBM 370/168、VAX-11/780、Honeywell 66/60、Honeywell 66/80 等机器采用写直达法。而Amdahl 的所有机器,IBM 3081等机器采用写回法。