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