缓存一致性有两种方法,如下所示 -
缓存-内存一致性
在单个缓存系统中,内存和缓存之间的一致性使用以下两种策略之一来维护 - (1) 直写和 (2) 回写。例如,当一个在处理器 P 上运行的任务请求内存位置 X 中的数据时,X 的内容被复制到缓存中,在那里它被传递给 P。
当 P 更新缓存中 X 的值时,内存中的另一个副本也需要更新以保持一致性。在直写中,每次缓存更新时都会更新内存,而在回写中,只有在缓存中的块被替换时才会更新内存。该表显示了直写与回写策略。
直写与回写
直写 | 回写 | ||||
---|---|---|---|---|---|
Serial | 事件 | Memory | 缓存 | Memory | 缓存 |
1 | X | X | |||
2 | P 读取 X | X | X | X | X |
3 | P 更新 X | X | X | X | X |
缓存-缓存一致性
例如,在多处理系统中,当运行在处理器 P 上的任务请求全局内存位置 X 中的数据时,X 的内容被复制到处理器 P 的本地缓存中,然后传递给 P。
有两个基本的缓存一致性策略 - (1) 写无效,和 (2) 写更新。Write-invalidate 通过从本地缓存读取直到发生写入来保持一致性。
当任何处理器通过写入更新 X 的值时,为 X 发布一个脏位会使所有其他副本无效。例如,当处理器 Q 将新值写入其缓存时,它会使 X 的所有其他副本无效。这为 X 设置了脏位。 Q 可以继续更改 X,而无需进一步通知其他缓存,因为 Q 拥有 X 的唯一有效副本。
但是,当处理器 P 要读取 X 时,它必须等到 X 更新并清除脏位。写更新通过立即更新所有缓存中的所有副本来保持一致性。在每次写入操作期间设置所有脏位。毕竟,副本已经更新,所有脏位都被清除了。该表显示了写入更新与写入无效策略。
写更新与写无效
写更新 | 写无效 | ||||
---|---|---|---|---|---|
Serial | 事件 | P’s Cache | Q的缓存 | P’s Cache | Q的缓存 |
1 | P 读取 X | X | X | ||
2 | Q 读取 X | X | X | X | X |
3 | Q 更新 X | X’ | X' | INV | X' |
4 | Q 更新 X' | X’’ | X'' | INV | X'' |