在x86汇编中,有一个锁前缀,它可以应用于指令,使其成为原子指令。这是跨所有内核的原子性吗?通常涉及的延迟是多少?对于常规互斥锁,锁定的是哪条指令?
谢谢。PS:我被教导说,在缺乏这样的指令的系统上,互斥锁仍然可以完成,但它更费力。我想知道还有没有人这样做。
发布于 2011-07-29 10:24:37
在x86上,lock前缀锁定所有核心并允许原子性。为了在没有LOCK的其他系统上实现这一点,可以使用CMPXCHG循环,或者使用带有重试逻辑的紧密循环,尝试将某些内容的值设置为预期值。正如你所看到的,第二种方法在大多数情况下更有害,因为它只是不断地循环,试图设置值(并一直这样做,直到它完成)。对于x86,延迟是最小的,可能范围是停止指令流水线或刷新它,然后自动执行该指令(通常是几个周期),第二种方法不能真正估计,因为它取决于需要自动修改的值的争用程度。对于互斥锁,我认为它是一个必须获取的标志值(检查互斥锁是否未被获取,并持续等待,直到互斥锁被抓取,然后尝试自动更改标志以获取它)。
AFAIK IBM处理器使用第二种方法,因为在linux内核上工作时,我发现原子增量函数使用它(可能它只适用于较老的处理器)。x86平台仍然使用
lock addl ...;我承认,我在内核的这一部分工作已经有一年了,所以在某些方面我可能是错的。
https://stackoverflow.com/questions/6868007
复制相似问题