多核CPU上的x86 LOCK问题

38

据说x86 ASM的"LOCK"指令前缀会导致所有核心在执行后续指令时被冻结?

我在一篇博客文章中读到了这个说法,但是我无法找到任何证明这是否属实的信息。


相关:对于'int num','num ++'可以是原子的吗?,我的答案更详细地解释了lock指令的内部执行。 - Peter Cordes
2个回答

56
这是关于锁定该地址的内存总线。Intel 64和IA-32体系结构软件开发人员手册-卷3A:系统编程指南,第1部分告诉我们:
“7.1.4 LOCK操作对内部处理器缓存的影响。
对于Intel486和Pentium处理器,在LOCK操作期间,即使被锁定的内存区域在处理器中被缓存,LOCK#信号也始终在总线上断言。
对于P6及更高版本的处理器系列,如果在LOCK操作期间被锁定的内存区域在执行LOCK操作的处理器中作为写回内存被缓存在一个缓存行中,并且完全包含在其中,则处理器可能不会在总线上断言LOCK#信号。相反,它将在内部修改内存位置,并允许[其]缓存一致性机制确保以原子方式执行操作。此操作称为“缓存锁定”。缓存一致性机制自动防止具有相同内存区域的两个或多个处理器同时修改该区域中的数据。(重点添加)”
在这里,我们了解到P6和更新的芯片足够聪明,可以确定它们是否真的必须阻止总线,还是可以依靠智能缓存。我认为这是一个很好的优化。
我在我的博客文章中更详细地讨论了这个问题 "锁是如何锁住的?"。

Jeff,感谢您填写空白并提供参考资料。很高兴看到更近期的处理器在锁定方面有了一些智能化的改进。 - Steven Sudit
谢谢,这正是我在谷歌搜索锁定前缀时期望找到的信息 :) - cib

6
不会,但它可能会导致其他处理器在此处理器访问内存时等待。这些等待状态是否有影响取决于处理器运行缓存的程度。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接