为什么这是一个旋锁

时间:2017-02-14 01:15:00

标签: assembly x86 att

试图了解屏障的以下实现。目标是_entry只能输入一次。我唯一没有得到的部分是使用%rip。显然它会在mutex(%rip)=0时旋转,但为什么会这样?

.section data
mutex:
    .long 0

.section text
...
_entry:
    xor %rax, %rax
    xchgl mutex(%rip), %rax
    cmp %rax, 0
    jnz _entry

1 个答案:

答案 0 :(得分:0)

这是一个自旋锁,因为它基本上是:

  1. 保持循环而不调用" yield"系统调用(换句话说,它不要求上下文切换)
  2. 使用" atomic"操作以确保"锁定变量"具有所需的值以便打破循环。
  3. mutex(%rip)是RIP相对(相对指令指针)寻址。它只是一个变量。可以是任何其他变量。

    这个伪代码就是这样的:

    _entry:
        x = 0;
        swap(mutex, x);
        if (x != 0)
            goto _entry;
    

    但是突出显示swap(),即xchg(交换操作)。反过来,这是一个ATOMIC操作。这就是保证2个不同的线程不会修改这个"锁定变量" (mutex)同时。{/ p>

    作为EXTRA的有用信息:

    • 为什么它不是互斥锁?因为它没有为操作系统中的上下文切换调用系统调用。
    • 这是否意味着没有发生上下文切换?不,这不是真的。无论如何都会发生上下文切换,但是它会在操作系统自己决定的时候发生,而不是由这个例程调用的显式。操作系统为每个线程提供了最大限制。

    注意:"锁定变量"在此示例中称为mutex。但实际上它取决于你使用的词汇。大多数情况下,这不会被视为"互斥"。可以使用互斥锁或自旋锁或互斥锁+自旋锁的混合来完成锁定。但上面的例子不是混合的东西。变量名称应该是除mutex之外的其他内容。