0

在每个处理器都有自己的缓存副本的多处理器系统中,处理器如何知道从哪里获取数据副本。因为它将存在于自己的缓存中,也存在于其他相应处理器或主内存的缓存中,即它将如何知道哪个副本是最新的

4

2 回答 2

2

大多数处理器(尤其是我们的笔记本电脑、台式机、服务器中的 x86)都有一些硬件提供 缓存一致性

通常,存在一些同步内存屏障指令

有传言说某些同步机指令可能会很慢。

实际上,最近的C++2011C2011标准有特定的措辞和原子数据类型来处理这些,比如 C++11 std::atomic

在实践中,您应该使用一些完善的标准库,如pthreads(或 C++11std::thread等......)

于 2013-09-07T07:33:16.613 回答
1

在典型的现代缓存一致性系统中,如果一个内存地址的内容存在于多个缓存中,它们的内容将是相同的。使用典型的基于失效的一致性机制,为了让处理器更改内容,它必须获得该内存块的独占所有权。这是通过使任何副本无效来完成的。来自先前已缓存块的处理器的任何后续请求都将导致未命中(块已失效),并且一致性操作将在写入处理器的缓存中找到更新的内容。

(在使用直写缓存的缓存一致性的早期实现中,可以窥探到内存的公共总线以获取任何内容更改。类似地,更改内容的处理器可以将更改广播或多播到任何共享者。这些方法将保持缓存的内容相同的。)

这个过程的一个更微妙的方面是内存一致性——不同的处理器如何看待对不同地址的内存访问顺序。通过顺序一致性,所有处理器都可以看到系统中每次读取和写入的单一顺序。这是最容易理解的一致性模型,但为了支持更大的并行操作硬件复杂性增加(例如,不是等待确认不存在排序冲突,处理器可以推测性地继续执行并回滚到先前已知正确的状态,如果发生了排序冲突)。

宽松的一致性模型允许读取和写入在不同处理器之间具有不一致的顺序。为了提供更强的排序保证,提供了内存屏障操作。这些操作保证在执行屏障操作的处理器的程序顺序后面的某些类型的内存访问将被所有其他处理器观察为在屏障之后发生,并且某些类型的内存访问(对于该处理器较早)将被所有处理器观察到屏障前。

使用宽松一致性模型的系统可以通过在每次内存访问后使用内存屏障来提供与顺序一致性模型系统相同的行为。然而,使用宽松模型的系统通常不能很好地处理这种过度使用障碍,因为它们旨在利用对内存排序的宽松需求。

于 2013-09-08T00:01:35.537 回答