多核CPU线程同步在硬件层面如何工作?

多核CPU线程同步在硬件层面如何工作?

我试图了解多核 CPU 如何在硬件级别实现线程同步。

从我迄今为止的研究来看,我发现该过程涉及使用内存中的位置作为锁,并且对于线程来说,要运行其同步代码段,它需要使用特殊指令同时读取 0 的值并将 1 的值写入此内存位置来获取锁。

这应该可以完美运行,但是现代 CPU 包含多个级别的每个核心和共享缓存。如果 CPU 实现缓存写回,则保存锁定值的内存位置将与跨核心的 L1 缓存不同步。如果 CPU 实现缓存直写协议,则每次写入内存都会对性能产生重大影响。

CPU 如何维护用作缓存锁的内存位置的同步?

答案1

找到答案:缓存一致性(MESI 协议)

https://docs.roguewave.com/threadspotter/2011.2/manual_html_linux/manual_html/ch_intro_coherence.html

以下是上述链接中文章的重点内容(以防链接失效):

MESI 协议中的缓存行状态

M - 已修改 缓存行中的数据已修改,并保证仅驻留在此缓存中。主内存中的副本不是最新的,因此当缓存行离开已修改状态时,必须将数据写回主内存。

E - 独占 缓存行中的数据未经修改,但保证仅驻留在此缓存中。

S - 共享 缓存行中的数据未经修改,并且其他缓存中也可能有它的副本。

I — 无效缓存行不包含有效数据。”

“如果线程读取任何缓存中都不存在的数据,它将以独占状态 (E) 将该行提取到其缓存中”

“如果一个线程从另一个线程的缓存中处于共享状态 (S) 的缓存行读取数据,它会将该缓存行提取到处于共享状态 (S) 的缓存中”

“如果一个线程从另一个线程的缓存中处于独占状态 (E) 的缓存行读取数据,它会将该缓存行提取到其处于共享状态 (S) 的缓存中,并将另一个缓存中的缓存行降级为共享状态 (S)”

“如果一个线程从另一个线程的缓存中处于修改状态 (M) 的缓存行读取数据,则另一个缓存必须首先写回其修改后的缓存行版本并将其降级为共享状态 (S)。然后,执行读取的线程可以将缓存行添加到其处于共享状态 (S) 的缓存中”

相关内容