在 x86 汇编中,有一个 LOCK 前缀,可以应用于指令以使其成为原子指令。这是所有核心的原子性吗?通常涉及的延迟是多少?对于常规互斥体,被锁定的指令是什么?
谢谢。 PS:我被告知,在缺乏此类指令的系统上,仍然可以完成互斥,但它更费力。我想知道是否还有人这样做。
最佳答案
在 x86 上,锁定前缀锁定所有核心并允许原子性。为了在没有 LOCK
的其他系统上实现此功能,请使用 CMPXCHG
循环或带有重试逻辑的紧密循环,尝试将某些值设置为预期值。正如您所看到的,在大多数情况下,第二种方法更为有害,因为它只是不断循环尝试设置值(并一直这样做直到完成)。对于 x86,延迟是最小的,可能范围从停止指令管道或刷新它,然后以原子方式执行该指令(通常是几个周期),第二种方法无法真正估计,因为它取决于有多少争用需要原子修改的值。对于互斥体,我相信它是必须获取的标志值(检查是否未获取互斥体,并不断等待直到互斥体可供获取,然后尝试以原子方式更改标志以获取它)。
据我所知,IBM 处理器使用第二种方法,因为在处理 Linux 内核时我发现原子增量函数使用它(也许它仅适用于较旧的处理器)。 x86平台依然使用
lock addl ...;
我承认,自从我在内核的这一部分工作以来已经大约一年了,所以我在某些方面可能是错误的。
关于assembly - 在多核 x86 系统上,互斥体是否使用 LOCK'd 指令实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6868007/