lock cmpxchg

发布时间 2023-12-08 14:51:45作者: xiezhengcai

cmpxchg 和 xchg 指令都会锁总线,

那么,为什么要加lock 前缀呢?

LOCK#前缀不会占用额外的字节,而是作为指令的一部分。它会被编码为一个特定的操作码前缀,告知处理器在执行指令期间锁定总线或等效连接

因为:

  1. 对于cmpxchg 和 xchg总线锁而言

当处理器执行cmpxchg和 xchg指令并锁定总线时,它会保持对总线的锁定,直到指令执行完成并释放总线锁。从这个意义上说,锁定总线的时间应该是指令执行的时间
因为这个时间非常短,而在其它处理器上已经正在执行的指令可能更复杂的计算和内存访问操作,所以该指令的执行可能会掩盖锁定总线的时间,而此时该指令可能会操作cmpxchg或xchg指令操作的内存区域。
使用lock前缀可以解决该问题,

inter手册描述

Intel 64和IA-32处理器提供了一个在某些内关键内存操作期间可自动断定lock#信号,用于去锁定系统总线或等效构件。当这个lock#信号被声明/断言时,来自其他处理器或总线代理的总线控制请求会被阻塞。

个人感觉,它好像也会block指定的内存地址总线

2.即使每个处理器在执行cmpxchg指令时都锁定了总线,但是在多处理器环境中,处理器的缓存可能会导致数据不一致性的问题。

当使用lock前缀,如果操作的内存已经在某个内核的缓存中,那么cpu会lock cache,同时以该内核执行指令