X86 关键部分:多核CPU的性能问题是什么?

X86 关键部分:多核CPU的性能问题是什么?,x86,arm,critical-section,X86,Arm,Critical Section,我不关心多线程试图获取CS的情况。 一个线程锁定和解锁CS的情况如何?我特别感兴趣的是它如何在当前的多核CPU(x86和ARMs)中工作 根据我的简单猜测,我认为有一个锁计数,当一个线程试图获取一个CS时,它会进行联锁交换/添加。此交换/添加是否以任何方式影响其他内核/线程?例如,内核有自己的内存缓存(我说得对吗?),互锁的exchange/add需要与所有其他内核交互,以确保ram不会缓存到其他地方 我假设,添加一个不会有多个线程访问数据的CS-in-place比错过一个可能很少使用多个线程的

我不关心多线程试图获取CS的情况。 一个线程锁定和解锁CS的情况如何?我特别感兴趣的是它如何在当前的多核CPU(x86和ARMs)中工作

根据我的简单猜测,我认为有一个锁计数,当一个线程试图获取一个CS时,它会进行联锁交换/添加。此交换/添加是否以任何方式影响其他内核/线程?例如,内核有自己的内存缓存(我说得对吗?),互锁的exchange/add需要与所有其他内核交互,以确保ram不会缓存到其他地方

我假设,添加一个不会有多个线程访问数据的CS-in-place比错过一个可能很少使用多个线程的CS-in-place要好。但是我想验证一下,如果有一个线程进入/存在于循环中的CS中,那么其他内核/线程不会因为后台的cpu间同步而停止


多亏了SMP系统,核心不共享单个缓存,因此需要提供缓存一致性逻辑,以精确地防止一个内存位置同时存在于多个缓存中。如果您的关键部分是作为旋转锁实现的,那么这甚至不是理论上的,但很有可能

由于缓存的同步,联锁交换/添加可能非常昂贵。这在NUMA系统中尤其如此,在NUMA系统中,某些磁芯对之间的链路比其他磁芯对之间的链路慢得多

ARM已将
SWP
指令(联锁交换)替换为稍微便宜一点的指令

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

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


如果有任何潜在的比赛条件发生,你需要防止它。如果这种性能令人担忧,请考虑更改架构以使用队列来解耦线程。 核心不共享单个缓存的SMP系统需要提供缓存一致性逻辑,以精确地防止一个内存位置同时存在于多个缓存中。如果您的关键部分是作为旋转锁实现的,那么这甚至不是理论上的,但很有可能

由于缓存的同步,联锁交换/添加可能非常昂贵。这在NUMA系统中尤其如此,在NUMA系统中,某些磁芯对之间的链路比其他磁芯对之间的链路慢得多

ARM已将
SWP
指令(联锁交换)替换为稍微便宜一点的指令

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

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


如果有任何潜在的比赛条件发生,你需要防止它。如果这种性能令人担忧,请考虑更改架构以使用队列来解耦线程。 我认为你的问题范围太广了。把所有不同的问题分解开来,或者学习一点计算机组织和操作系统理论,可能会更容易。不需要总是很昂贵。如果缓存线在此处理器上已标记为独占,则无需执行任何操作。如果它在处理器上但不是独占的,它可能只需要向其他内核发送失效请求,。。。阅读MESI/MOESI协议,也许可以看看Ulrich Drepper的“每个程序员都应该知道关于内存的内容”,我认为你的问题范围太广了。把所有不同的问题分解开来,或者学习一点计算机组织和操作系统理论,可能会更容易。不需要总是很昂贵。如果缓存线在此处理器上已标记为独占,则无需执行任何操作。如果它在处理器上但不是独占的,它可能只需要向其他内核发送失效请求,。。。阅读MESI/MOESI协议,也许可以看看Ulrich Drepper的“每个程序员都应该知道的内存”