自旋锁实现中的 mov vs xchg
mov vs xchg in spin lock implementatoin
我正在通读这篇文章 online book on x86,我对他们实现自旋锁的示例代码中的实现细节感到好奇。在示例中,他们使用 xchg
将内存位置设置为 0 而不是 mov
,我试图理解为什么做出这样的选择。
在自旋锁的例子中有一个函数,spinUnlock
,它将0
放入内存位置[sLock]
。如果锁是空闲的,[sLock]
设置为 0
,当锁被获取时,设置为 1
。 spinUnlock
函数将 [sLock]
设置为 0
以释放锁。代码如下:
spinUnlock:
push ebp
mov ebp, esp
mov eax, 0
xchg eax, [sLock]
pop ebp
ret
为什么使用mov eax, 0; xchg eax, [sLock]
将[sLock]
设置为0
而不是mov [sLock], 0
?在调用 spinUnlock
之后,eax
寄存器不再用于任何用途。我知道 xchg
会锁定内存位置,但如果 mov
已经是原子的,则不需要锁定。
只有作者才能说出为什么做出这样的选择。
一个mov dword [sLock],0
就可以了; xchg eax, [sLock]
(隐含的 lock
)可能更昂贵(对于性能和代码大小)。
该示例的所有代码都很糟糕(例如,在 spinLock
例程中没有 pause
应该使用它,尽管在不应该使用它的地方有 pause
全部);他们选的例子也不好
注意:在 user-space 中使用自旋锁“几乎从不”明智,因为 OS 可能会在您获取锁之后但在释放锁之前进行任务切换,从而导致所有其他任务浪费大量 CPU 时间旋转而没有希望获得锁。
我正在通读这篇文章 online book on x86,我对他们实现自旋锁的示例代码中的实现细节感到好奇。在示例中,他们使用 xchg
将内存位置设置为 0 而不是 mov
,我试图理解为什么做出这样的选择。
在自旋锁的例子中有一个函数,spinUnlock
,它将0
放入内存位置[sLock]
。如果锁是空闲的,[sLock]
设置为 0
,当锁被获取时,设置为 1
。 spinUnlock
函数将 [sLock]
设置为 0
以释放锁。代码如下:
spinUnlock:
push ebp
mov ebp, esp
mov eax, 0
xchg eax, [sLock]
pop ebp
ret
为什么使用mov eax, 0; xchg eax, [sLock]
将[sLock]
设置为0
而不是mov [sLock], 0
?在调用 spinUnlock
之后,eax
寄存器不再用于任何用途。我知道 xchg
会锁定内存位置,但如果 mov
已经是原子的,则不需要锁定。
只有作者才能说出为什么做出这样的选择。
一个mov dword [sLock],0
就可以了; xchg eax, [sLock]
(隐含的 lock
)可能更昂贵(对于性能和代码大小)。
该示例的所有代码都很糟糕(例如,在 spinLock
例程中没有 pause
应该使用它,尽管在不应该使用它的地方有 pause
全部);他们选的例子也不好
注意:在 user-space 中使用自旋锁“几乎从不”明智,因为 OS 可能会在您获取锁之后但在释放锁之前进行任务切换,从而导致所有其他任务浪费大量 CPU 时间旋转而没有希望获得锁。