出现不一致的原因有3个:共享可写的数据,进程迁移,I/O传输
1.共享可写数据引起的不一致性(sharing of writable data)
如图所示
描述
我们把核(core)简称P,把核的私有缓存简称C;
图一,表示更新前的状态,P1,P2的私有cache C1 和 C2 中都有共享数据x,与shared memory 一致。
图二,执行write through 的写回策略,当P1将C1中的数据x—>x',同时将shared memory中的数据修改为x';此时C2中的数据与shared memory 和C1 中的数据不一致。
图三,执行 write back 的写策略,只有当C1中 x' 块被替换的时候才写回到下一级存储中,导致C1 与 (C2 和 shared memory)中数据不一致。
2.进程迁移引起的不一致
如下图所示
同(1)解释;
图一,数据x 只存在于 C1 和 shared memory中,C2中没有x;当进程从 P1迁移到P2时,P2可能会修改数据
x-->x';
如图二,执行write through 策略时,P2 会将数据写到 C2 和 shared memory 中,而 C1 中数据尚未更新,造成不一致问题;
如图三,执行 write back 策略时,P1 若 再进程执行时,更改了数据x-->x';当进程从 P1迁移到P2时,P2只能从 shared memory 中读取数据,而此时shared memory的数据并不是最新的,因为有可能C1还尚未写回。
3. I/O操作(绕过cache的I/O操作)
如图
所示
图一所示,依然是原始状态;
图二中,当 执行 write through 策略时, 从 IO中 输入到内存中,内存中的数据得到了更新,然而,
cache中的数据还是旧的数据;当 处理器 访问这些数据时,直接从C1,C2中得到,导致了 数据的不一致。
图三中,当 执行 write back 策略时,当 P1 修改了 x 的值,而尚未写回到下一级存储时,有IO输出的操作,IO直接从内存中读取到数据,这样也是错误的