关于多核 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'? 我的回答详细说明了locked 指令如何在内部执行。 【参考方案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 问题的主要内容,如果未能解决你的问题,请参考以下文章

多核编程杂谈

国产CPU性能测试:多核华为排第一,单核兆芯排第一

LINUX内核CPU负载均衡机制转

多核CPU的利用率怎么计算

C# 关于多线程和CPU的问题

linux单进程如何实现多核cpu多线程分配?