Multithreading 当我使用x86_64 CAS指令时,是否只锁定一条缓存线或完全锁定三级缓存?

Multithreading 当我使用x86_64 CAS指令时,是否只锁定一条缓存线或完全锁定三级缓存?,multithreading,concurrency,x86-64,cpu-cache,compare-and-swap,Multithreading,Concurrency,X86 64,Cpu Cache,Compare And Swap,当我使用x86_64 CAS指令时,即在原子状态下(读取值、比较并写回结果),此时锁定的是什么: 三级缓存中只有一条缓存线?(此时,没有一个核心无法从三级缓存线读/写缓存线) 还是整个L3缓存? (此时,没有一个内核无法从三级缓存读/写) x86_64英特尔CPU使用的是真的吗 缓存线独占状态的第一个aproach(MOESI/MESIF) 第二条适用于除独家外的任何州 两者都不准确。第二种情况类似于总线锁的实际情况,在现代x86 CPU中,当常规锁无法工作时,总线锁是一种(希望是)罕见且病态

当我使用x86_64 CAS指令时,即在原子状态下(读取值、比较并写回结果),此时锁定的是什么:

  • 三级缓存中只有一条缓存线?(此时,没有一个核心无法从三级缓存线读/写缓存线)
  • 还是整个L3缓存? (此时,没有一个内核无法从三级缓存读/写)
  • x86_64英特尔CPU使用的是真的吗

    • 缓存线独占状态的第一个aproach(MOESI/MESIF)
    • 第二条适用于除独家外的任何州

      • 两者都不准确。第二种情况类似于总线锁的实际情况,在现代x86 CPU中,当常规锁无法工作时,总线锁是一种(希望是)罕见且病态的情况。这在旧的486/早期奔腾上很常见,但在较新的产品上,常见的情况要简单得多——您将缓存线锁定,但由于您希望尽可能快地执行读-修改-写操作——在L3中这样做也没有意义。相反,您将选择距离操作核心最近的缓存—可能是L1或一些等效的内部结构

        即使使用简单的MESI,您也可以保证原子RMW在缓存中安全地完成-您首先获得该行的所有权(就像任何正常写入需要的那样),然后您可以在确定没有其他内核具有该行时执行原子流。唯一的问题是窥探可能在理论上是在中间,所以解决方案通常是简单地阻止窥探这条线直到RMW完成。但是,在此期间允许任何其他活动(例如来自同一个内核的其他请求,或来自同一个内核的嗅探)都没有问题。唯一的其他限制是关于内存顺序的,但这通常在内存单元中处理(这里仍然有顺序的概念),而不是在缓存中处理


        另请参阅本答案中的手册部分-

        谢谢!也就是说,在大多数情况下,前缀
        LOCK
        在最初创建的意义上被忽略-LOCK bus(早期的FSB,现在的QPI)。在大多数情况下,CPU核心不使用LOCK bus,只向缓存线添加一个特定的标志来禁用snoop应答?“忽略的锁”-我的意思是,“如果在锁定操作期间被锁定的内存区域缓存在作为写回内存执行锁定操作的处理器中,并且完全包含在缓存线中,那么处理器可能不会在总线上断言锁定信号。”没错。我在较新的手册中找不到这一部分(他们可能改变了措辞),但这一假设应该保留。