CPU 读取存储器数据过程
CPU 要取寄存器XX的值,只需要一步:直接读取
CPU 要取 L1 cache的某个值,需要1-3步(或者更多):把 cache 行锁住,把某个数据拿来,解锁,如果没锁住就慢了
CPU 要取 L2 cache 的某个值,先要到 L1 cache 里取,L1 当中不存在,在 L2 里,L2 开始加锁,加锁以后,把L2里的数据复制到L1,再执行读L1的过程,上面的3步,再解锁
CPU 取 L3 cache的也是一样,只不过先由 L3 复制到 L2,从 L2 复制到 L1,从 L1 到 CPU
CPU 取内存则最复杂:通知内存控制器占用总线带宽,通知内存加锁,发起内存读请求,等待回应,回应数据保存到 L3(如果没有就到 L2),再从 L3/2到L1,再从 L1 到 CPU,之后解除总线锁定
1. 当 CPU1 从主内存中取共享变量 X=2 时,通过上述 CPU读取数据的过程将数据读取到 CPU 缓存 L1 中,此时只有 CPU1 缓存行得到共享变量X,X 的状态则为 E,CPU1 的缓存行会时刻的监听嗅探 bus总线
2. 当 CPU2 也从主内存中取共享变量 X=2 时,CPU1 的缓存行会嗅探到CP2 对共享变量X 的操作,此时 CPU1 和 CPU2 的缓存行中 X 的状态会变成 S
3. 当 CPU1 对 X 进行+1 操作时,寄存器将 L1 cache 的数据读取,并对 X+1 ,将 X=3 赋值给缓存行 L1 cache,L1 cache 的 X =3 通知 L2 cache,L2 cache 再通知 L3 cache ,最终 CPU 缓存上的 X 都是 3,然后 X=3 将会写到 主内存中,这个回写的过程,CPU1 的 X 状态 会变成 M ,而 CPU2 的缓存行通过 bus 总线嗅探到 主内存X 变量的值改变了,此时 CPU2 的 X 状态就会变成 I ,即该缓存行无效。
4. CPU1 缓存行 X 的值回写到主内存后,CPU1 缓存行的 X 状态又会变成 E
以上为个人理解