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

标签 assembly x86

在 x86 汇编中,有一个 LOCK 前缀,可以应用于指令以使其成为原子指令。这是所有核心的原子性吗?通常涉及的延迟是多少?对于常规互斥体,被锁定的指令是什么?

谢谢。 PS:我被告知,在缺乏此类指令的系统上,仍然可以完成互斥,但它更费力。我想知道是否还有人这样做。

最佳答案

在 x86 上,锁定前缀锁定所有核心并允许原子性。为了在没有 LOCK 的其他系统上实现此功能,请使用 CMPXCHG 循环或带有重试逻辑的紧密循环,尝试将某些值设置为预期值。正如您所看到的,在大多数情况下,第二种方法更为有害,因为它只是不断循环尝试设置值(并一直这样做直到完成)。对于 x86,延迟是最小的,可能范围从停止指令管道或刷新它,然后以原子方式执行该指令(通常是几个周期),第二种方法无法真正估计,因为它取决于有多少争用需要原子修改的值。对于互斥体,我相信它是必须获取的标志值(检查是否未获取互斥体,并不断等待直到互斥体可供获取,然后尝试以原子方式更改标志以获取它)。

据我所知,IBM 处理器使用第二种方法,因为在处理 Linux 内核时我发现原子增量函数使用它(也许它仅适用于较旧的处理器)。 x86平台依然使用

lock addl ...;

我承认,自从我在内核的这一部分工作以来已经大约一年了,所以我在某些方面可能是错误的。

关于assembly - 在多核 x86 系统上,互斥体是否使用 LOCK'd 指令实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6868007/

相关文章:

performance - 为什么数据转发和停顿周期在处理负载使用风险方面比 NOP 更有效?

assembly - 需要帮助理解 FF 间接调用指令 x86

visual-c++ - 为什么VC++编译器MOV + PUSH args不仅仅是PUSH它们? x86

assembly - 在 QEmu 中使用简单引导扇区从磁盘读取不正确的字节

assembly - MASM EQU 和 TEXTEQU 指令之间的区别

c++ - 用 64 位替换 32 位循环计数器会在 Intel CPU 上使用 _mm_popcnt_u64 引入疯狂的性能偏差

assembly - 如何以原子方式读取 x86 ASM 中的值?

assembly - 条件跳转指令如何与 SUB 操作数一起使用

x86 - 使用SSE计算绝对值的最快方法

c - 如何实现确定性 malloc