关于多核 CPU 的 x86 LOCK 问题
Posted
技术标签:
【中文标题】关于多核 CPU 的 x86 LOCK 问题【英文标题】:x86 LOCK question on multi-core CPUs 【发布时间】:2011-03-21 07:53:47 【问题描述】:x86 ASM“LOCK”命令前缀是否会导致所有内核在执行“LOCK”之后的指令时冻结?
我在一篇博文中读到了这篇文章,但没有任何意义。我找不到任何东西表明这是否属实。
【问题讨论】:
相关:Can num++ be atomic for 'int num'? 我的回答详细说明了lock
ed 指令如何在内部执行。
【参考方案1】:
这是关于锁定该地址的内存总线。 The Intel 64 and IA-32 Architectures Software Developer's Manual - Volume 3A: System Programming Guide, Part 1 告诉我们:
7.1.4 LOCK 操作对内部处理器缓存的影响。
对于 Intel486 和 Pentium 处理器,LOCK# 信号总是 在 LOCK 期间在总线上断言 操作,即使内存区域 被锁定缓存在 处理器。
适用于 P6 和更新的处理器 家庭,如果内存区域是 在 LOCK 操作期间锁定是 缓存在处理器中 执行 LOCK 操作为 回写内存,完全 包含在缓存行中, 处理器可能不会断言 LOCK# 公交车上的信号。相反,它将 内部修改内存位置 并允许 [its] 缓存一致性 确保运行的机制 以原子方式进行。这 操作称为“缓存锁定”。 缓存一致性机制 自动阻止两个或多个 具有相同区域的处理器 内存从同时修改 该领域的数据。 (强调)
在这里,我们了解到 P6 和更新的芯片足够智能,可以确定它们是否真的必须阻塞总线,或者只能依靠智能缓存。我认为这是一个巧妙的优化。
我在博文“How Do Locks Lock?”中对此进行了更多讨论
【讨论】:
杰夫,感谢您填写空白并提供参考。很高兴看到最近的处理器在锁定方面更加智能。 谢谢,这只是我在谷歌搜索锁定前缀时希望找到的信息:)【参考方案2】:不,但它可能会迫使其他处理器在此处理器访问内存时等待。这些等待状态是否会产生影响取决于处理器运行缓存的程度。
【讨论】:
以上是关于关于多核 CPU 的 x86 LOCK 问题的主要内容,如果未能解决你的问题,请参考以下文章