LOCK指令作用
锁总线,其它CPU对内存的读写请求都会被阻塞,直到锁释放,因为锁总线的开销比较大,后来的处理器都采用锁缓存替代锁总线,在无法使用缓存锁的时候会降级使用总线锁
lock期间的写操作会回写已修改的数据到主内存,同时通过缓存一致性协议让其它CPU相关缓存行失效
https://albk.tech/聊聊CPU的LOCK指令.html
==========
lock才会触发到mesi
lock前缀的汇编指令会强制写入主存,也可避免前后指令的CPU重排序,并及时让其他核中的相应
缓存行失效,从而利用MESI达到符合预期的效果。
https://www.felixcloutier.com/x86/lock
https://kc.kexinshe.com/r/277831
8.2.2 Memory Ordering in P6 and More Recent Processor Families
• Reads or writes cannot be reordered with I/O instructions, locked instructions, or serializing instructions.
8.2.5 Strengthening or Weakening the Memory-Ordering Model
Program synchronization can also be carried out with serializing instructions (see Section 8.3). These instructions
are typically used at critical procedure or task boundaries to force completion of all previous instructions before a
jump to a new section of code or a context switch occurs. Like the I/O and locking instructions, the processor waits
until all previous instructions have been completed and all buffered writes have been drained to memory before
executing the serializing instruction.
Lock前缀,Lock不是一种内存屏障,但是它能完成类似内存屏障的功能。Lock会,可以理解为CPU指令级的一种锁。它后面可以跟ADD, ADC, AND, BTC, BTR, BTS, CMPXCHG, CMPXCH8B, DEC, INC, NEG, NOT, OR, SBB, SUB, XOR, XADD, and XCHG等指令。
在x86架构上,CAS被翻译为”lock cmpxchg...“。cmpxchg是CAS的汇编指令。在CPU架构中依靠lock信号保证可见性并禁止重排序。
lock前缀是一个特殊的信号,执行过程如下:
对总线和缓存上锁。
强制所有lock信号之前的指令,都在此之前被执行,并同步相关缓存。
执行lock后的指令(如cmpxchg)。
释放对总线和缓存上的锁。
强制所有lock信号之后的指令,都在此之后被执行,并同步相关缓存。
因此,lock信号虽然不是内存屏障,但具有mfence的语义(当然,还有排他性的语义)。
与内存屏障相比,lock信号要额外对总线和缓存上锁,成本更高
https://monkeysayhi.github.io/2017/12/28/一文解决内存屏障/
=====