CriticalSection:多核CPU的性能问题是什么?

时间:2012-09-21 21:31:11

标签: x86 arm critical-section

当多个线程尝试获取CS时,我并不关心这种情况。 一个线程锁定和解锁CS的情况如何?我对它在当前多核CPU(x86和ARM)中的工作原理特别感兴趣。

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

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

感谢

1 个答案:

答案 0 :(得分:1)

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

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

ARM已经将SWP指令(互锁交换)替换为稍微different strategy,这应该相当便宜。

要回答关于关键部分的相对性能的问题,它的重要性取决于它的实现方式。现代Linux系统检查用户空间中的锁定,并仅在争用情况下调用内核(例如,等待或解除对服务员的阻塞)。这意味着您可以使用关键部分放弃同性恋,而不必过多担心成本(特别是在ARMv7系统上)。

其他操作系统在内核空间中实现了整个批次,这使得关键部分的任何操作都很昂贵。

如果发生任何竞争条件的可能性,您需要防范它。如果您的性能令您担心,请考虑更改您的体系结构以使用排队来分离您的线程。