代码之家  ›  专栏  ›  技术社区  ›  dsimcha

缓存一致性有什么意义?

  •  11
  • dsimcha  · 技术社区  · 14 年前

    在x86这样提供缓存一致性的cpu上,从实用的角度来看,这有什么用?我知道这样做的目的是让一个内核上的内存更新在所有其他内核上立即可见。这是一个有用的属性。但是,如果不是用汇编语言编写,就不能过分依赖它,因为编译器可以将变量赋值存储在寄存器中,而从不将它们写入内存。这意味着仍然必须采取显式步骤,以确保在其他线程中完成的工作在当前线程中可见。因此,从实际的角度来看,缓存一致性实现了什么?

    6 回复  |  直到 14 年前
        1
  •  7
  •   Anonym    14 年前

    lock(); //some synchronization primitive e.g. a semaphore/mutex
    globalint = somevalue;
    unlock();
    

    如果没有缓存一致性 unlock() 必须保证 globalint

        2
  •  10
  •   nos    14 年前

    简而言之,非缓存一致性系统非常难以编程,特别是如果您想保持效率的话——这也是当今大多数NUMA系统都是缓存一致性的主要原因。

    如果缓存不连贯,则“显式步骤”必须强制执行一致性-显式步骤通常是关键部分/互斥(例如C/C++中的易失性)。这是相当困难的,如果不是不可能的服务,如互斥,保持跟踪只有内存有变化,需要在所有的缓存更新-它可能必须更新所有的内存,也就是说,如果它甚至可以跟踪哪些核心有哪些块的内存在他们的缓存。

    可以推测,硬件在跟踪已更改的内存地址/范围并保持同步方面可以做得更好、更有效。

    如果缓存不是可选择的,这将是非常致命的,否则在core1的缓存中可能会有进程数据的残余,而core2的缓存中不存在。不过,对于以这种方式工作的系统,操作系统必须在调度线程时强制执行缓存一致性—这可能是一个“更新所有内核之间缓存中的所有内存”操作,或者它可以借助MMU跟踪脏页,并且只同步已更改的内存页—再次,硬件可能以更精细和有效的方式保持缓存的一致性。

        3
  •  8
  •   thb    12 年前

    要记住的另一件事是连贯性和一致性之间的区别。因为即使x86派生的CPU使用存储缓冲区,也不能保证已经完成的指令修改了内存,使得其他CPU可以看到这些修改,即使编译器决定将值写回内存(可能是因为 volatile ?). 取而代之的是,mods可能会在存储缓冲区中无所事事。通常使用的几乎所有cpu都是缓存一致的,但是很少有cpu具有像x86那样宽容的一致性模型。比如说,退房, http://www.cs.nmsu.edu/~pfeiffer/classes/573/notes/consistency.html 有关此主题的详细信息。

        4
  •  1
  •   Timo Geusch    14 年前

    当您处理多个线程并从多个线程访问同一变量时,缓存一致性变得非常重要。在那种情况下,你 要确保所有处理器/核心在同时访问变量时看到相同的值,否则您将有非常不确定的行为。

        5
  •  1
  •   jseigh    14 年前

        6
  •  0
  •   appusajeev    10 年前

    缓存一致性是在硬件中实现的,因为在多核/多处理器环境中运行时,程序员不必担心确保所有线程都能看到内存位置的最新值。Cache coherence提供了一种抽象,即所有核心/处理器都在一个统一的Cache上运行,尽管每个核心/处理器都有自己的单独Cache。

    它还可以确保遗留的多线程代码在新处理器模型/多处理器系统上正常工作,而无需进行任何代码更改以确保数据一致性。