1. 缓存一致性问题
大家都知道,计算机在执行程序时,每条指令都是在CPU中执行的,而执行指令过程中,势必涉及到数据的读取和写入。由于程序运行过程中的临时数据是存放在主存(物理内存)当中的,这时就存在一个问题,由于CPU执行速度很快,而从内存读取数据和向内存写入数据的过程跟CPU执行指令的速度比起来要慢的多,因此如果任何时候对数据的操作都要通过和内存的交互来进行,会大大降低指令执行的速度。因此在CPU里面就有了高速缓存。
也就是,当程序在运行过程中,会将运算需要的数据从主存复制一份到CPU的高速缓存当中,那么CPU进行计算时就可以直接从它的高速缓存读取数据和向其中写入数据,当运算结束之后,再将高速缓存中的数据刷新到主存当中。
这样就会带来一个问题,假设cpu0和cpu1同时想要对主存中的某个变量进行+1操作。然后他们都将该变量复制了一份在自己的cache中。这时,cpu0对变量的修改无法同步到cpu1的cache中,cpu1对变量的修改也无法同步到cpu0的cache中。最终会导致写入主存的数据只进行了一次的+1操作,这就是缓存一致性问题。
2. 缓存一致性协议
为了保证各个cpu之间的缓存的一致性,有两种机制:锁和缓存一致性协议
- 锁总线
总线锁会阻止其它主控者使用总线。也就是在总线锁有效期间,只有持有总线锁的cpu有权访问主存,其他cpu要访问主存时则进入阻塞状态。在多处理器环境中,这样做的成本较高。在早期的cpu使用的是总线锁的机制。
- 锁缓存
在Pentium4、Inter Xeon和P6系列以及之后的处理器中,LOCK#信号一般不锁总线,而