在多核x86系统上,是否使用LOCK'd指令实现了互斥?

Rub*_*Pie 9 x86 assembly

在x86程序集中,有一个LOCK前缀可以应用于使其成为原子的指令.所有内核都具有原子性吗?通常的延误是什么?对于常规互斥锁,它被锁定的指令是什么?

谢谢.PS:我被教导说,在缺乏这种指令的系统上,仍然可以完成互斥,但它更加费力.我想知道是否有人这样做了.

Jes*_*mos 9

在x86锁定前缀锁定所有核心并允许原子性.为了在没有的情况下在其他系统上实现它LOCK,使用CMPXCHG循环或使用重试逻辑的紧密循环尝试将某事物的值设置为期望值.正如你所看到的,第二种方式在大多数情况下更有害,因为它只是不断地循环尝试设置值(并且一直这样做直到完成).对于x86,延迟是最小的,可能包括暂停指令流水线或刷新它然后原子地执行该指令(通常是几个周期),第二种方法无法真正估计,因为它取决于有多少争用.需要原子修改的值.对于互斥锁,我认为它是必须获取的标志值(检查互斥锁是否未被获取并持续等待互斥锁启动然后尝试以原子方式更改标志以获取它).

AFAIK IBM处理器使用第二种方法,因为在linux内核上工作时我发现原子增量函数使用它(可能它只适用于较旧的处理器).x86平台仍在使用

lock addl ...;
Run Code Online (Sandbox Code Playgroud)

我承认,虽然我在内核的这一部分工作已经有一年了,所以我在某些方面可能会出错.