比较交换指令cmpxchg

Intel x86比较交换指令cmpxchg的作用与原理 - 掘金 https://juejin.cn/post/6905287769006800903

lock.ppt https://heather.cs.ucdavis.edu/~matloff/50/PLN/lock.pdf

https://github.com/torvalds/linux/blob/master/arch/x86/include/asm/cmpxchg.h


cmpxchg dest,src

将AL、AX、EAX或RAX寄存器中的值与第一个操作数dest(目标操作数)进行比较。

如果两个值相等,则将第二个操作数src(源操作数)加载到目标操作数中。

如果不相等,则目标操作数被加载到AL、AX、EAX或RAX寄存器中。 RAX寄存器仅在64位模式下可用。

 

 

 

 

Instruction format
• Intel’s assembly language syntax differs
from the GNU/Linux syntax (known as
‘AT&T syntax’ with roots in UNIX history)
• When AT&T syntax is used, the ‘cmpxchg’
instruction has this layout:
[lock] cmpxchg reg, reg/mem
optional ‘prefix’
 (used for SMP)
mnemonic
 opcode
 source
 operand
destination
 operand


 An instruction-instance
• In our recent disassembly of Linux’s kernel
function ‘rtc_cmos_read()’
, this ‘cmpxchg’
instruction-instance was used:
lock cmpxchg %edx, cmos_lock
 prefix opcode source-operand destination-operand
Note: Keep in mind that the accumulator %eax will affect what happens!
 So we need to consider this instruction within it’s surrounding context

 https://mp.weixin.qq.com/s?__biz=MjM5NjQ5MTI5OA==&mid=2651749434&idx=3&sn=5ffa63ad47fe166f2f1a9f604ed10091&chksm=bd12a5778a652c61509d9e718ab086ff27ad8768586ea9b38c3dcf9e017a8e49bcae3df9bcc8&scene=21#wechat_redirect

CAS算法涉及到三个操作数:

  • 需要读写的内存值 V。

  • 进行比较的值 A。

  • 要写入的新值 B。

当且仅当 V 的值等于 A 时,CAS通过原子方式用新值B来更新V的值(“比较+更新”整体是一个原子操作),否则不会执行任何操作。一般情况下,“更新”是一个不断重试的操作。

 

后续JDK通过CPU的cmpxchg指令,去比较寄存器中的 A 和 内存中的值 V。如果相等,就把要写入的新值 B 存入内存中。如果不相等,就将内存值 V 赋值给寄存器中的值 A。然后通过Java代码中的while循环再次调用cmpxchg指令进行重试,直到设置成功为止。

 

posted @ 2023-03-15 14:27  papering  阅读(620)  评论(0编辑  收藏  举报