1

我不关心多个线程尝试获取 CS 的情况。一个线程锁定和解锁 CS 的情况怎么样?我对它在当前多核 CPU(在 x86 和 ARM 中)中的工作方式特别感兴趣。

根据我的简单猜测,我认为有一个锁计数,当一个线程尝试获取一个 CS 时,它会互锁交换/添加。这种交换/添加是否会以任何方式影响其他核心/线程?例如,核心有自己的内存缓存(我正确吗?)并且互锁的交换/添加需要与所有其他核心交互,以确保内存没有缓存在其他地方。

我认为,最好添加一个不会有多个线程来访问数据的 CS,而不是错过一个可能很少使用多个线程的 CS。但是我想验证如果有一个线程进入/存在一个循环中的 CS,那么其他内核/线程不会因为幕后的 CPU 间同步而停止。

谢谢

4

1 回答 1

1

内核不共享单个缓存的 SMP 系统需要为内存位置同时存在于多个缓存中的可能性提供缓存一致性逻辑。如果您的关键部分实现为自旋锁,这甚至不是理论上的,但很有可能。

由于缓存的同步,互锁交换/添加可能非常昂贵。在 NUMA 系统中尤其如此,其中一些核心对之间的链接比其他核心要慢得多。

ARM 已经SWP用一种稍微不同的策略取代了指令(互锁交换),这种策略应该会便宜很多。

要回答您关于关键部分的相对性能的问题,它的重量取决于它的实现方式。现代 Linux 系统检查用户空间中的锁,并且只在竞争情况下调用内核(例如等待或解除阻塞等待者)。这意味着您可以随意使用临界区,而不必太担心成本(尤其是在 ARMv7 系统上)。

其他操作系统在内核空间中实现了全部功能,这使得对关键部分的任何操作都变得昂贵。

如果有任何潜在的竞争条件发生,您需要防范它。如果您对此的性能感到担忧,请考虑更改您的体系结构以使用队列来解耦线程。

于 2012-09-23T18:41:22.077 回答