关系

现在的处理器能够自动保证每个处理器对同一个缓存行里进行16/32/64位的操作是原子的,但是复杂的内存操作处理器是不能自动保证其原子性的,比如跨总线宽度、跨多个缓存行和跨页表的访问。但是,处理器提供总线锁定和缓存锁定两个机制来保证复杂的内存操作的原子性。

总线锁

总线索就是使用处理器提供的一个LOCK#信号,当一个处理器在总线上输出此信号,其他处理器的请求将被阻塞,那么该处理器就可以独占共享锁。

缓存锁

由于,我们只需要保证对某个内存地址的操作是原子的即可,但是总线锁把CPU和内存之间的通信锁住了,这使得在锁定期间,其他处理器也不能操作其他内存地址的数据,所以总线锁的开销比较大。目前,处理器在某些场合下使用缓存锁来代替总线索进行优化。

缓存锁就是指内存区域如果被缓存在处理器的缓存行中,并且在LOCK#操作期间,那么当它执行操作回写到内存时,处理器不在总线上声言LOCK#信号,而是修改内部的内存地址,并允许它的缓存一致性机制来保证操作的原子性,因为缓存一致性机制会阻止同时修改由两个以上处理器缓存的内存区域数据,其他处理器回写已被锁定的缓存行的数据时,就会使缓存无效。

使用场景

如上面所说,在多数情况下,处理器还是使用缓存锁来代替总线锁,但是在下面两种情况下,我们还是使用总线锁来完成相应保证一致性。

  1. 情况1:当操作的数据不能被缓存在处理器内部,或者操作的数据跨多个缓存行时,则处理器会字调用总线锁锁定。
  2. 情况2:有些处理器不支持缓存行锁定。