chapter 1. 内存一致性和缓存一致性介绍
字数 1274 阅读次数

如今许多计算机和多核处理器都支持共享内存,处理器的每个核心都能够读写共享内存。共享内存有多种解决方案,不同的解决方案可能追求不同的特性,如高性能或者低功耗。对于一个共享内存的解决方案,如果没有提供正确性,即使再多优点也是没有价值的。尽管共享内存的正确性是符合直觉的,但是就像本书所讲的一样,定义共享系统正确性会有许多微妙的问题,同时在实现上也会有许多边界情况。共享内存是在硬件层面实现的,如果没有掌握这些细节,修复硬件层面的BUG往往非常困难的。

设计和评估共享内存系统要求工程师对内存一致性(memory consistency)和缓存一致性(cache coherence)有深刻的理解。Consistency定义了共享内存的读写规则。对于只有单线程核心,指令正确执行的标准是一个正确的结果和多个不正确的结果,对于一个输入,总会只有一个正确的输入,因此单线程核心,只有一个正确的结果,即使执行期间发生乱序,只要结果是正确的,那么Consistency就是正确的。相比较单线程核心,多核多线程的情况就复杂很多。由于有多个线程,多个核心,指令的执行是并行的,甚至在单个核心上,由于线程的切换,指令的执行也是交错的,在这种条件下,判断的标准就会有多个正确的结果和很多不正确的结果,因此最大的挑战是如何定义哪种执行顺序是正确的。

在一个带有缓存的共享内存中,如何保持缓存和共享内存数据的一致是由缓存一致性来完成的(Cache Coherence)。Consistency定义了共享内存行为正确性的规则,常常是共享内存读写顺序相关,而Coherence解决的是缓存和共享内存数据一致性的问题,两者解决的问题不同,但是Consistency依赖Coherence才能够实现正确性。

目前为止,Consistency和Coherence两者的不同点是有一些认知了,但是还没有特别清晰的区分。现在引入两个例子来对Consistency和Coherence有更直观的认识。假设现在课程安排在152教室,在开课之前班助需要将教室修改到252教室,班助首先通知网站管理员在网站修改地点,在收到管理员肯定答复后,班助群发邮件给所有学生,但此时网站管理员比较忙没有立刻修改地点,那么此时学生收到邮件并检查网站就会看到过时的信息(152教室)。Consistency需要做的事情就是定义该结果是否正确,也就是学生收到过时信息的行为是否是正确的。还是以这个例子举例,网站管理员在回复班助之前就已经修改地点了,但是由于学生的日程表记录的还是152教室,导致日程表和网站的数据不一致了。在这个例子中,日程表相当于缓存,网站相当于共享内存,网站和日程表数据不一致,这种问题就是Coherence需要解决的。

总结下来,Coherence是解决对于同一个内存位置如何保证缓存和共享内存数据是一致的问题,Consistency解决多个执行流和多个内存位置之间顺序的问题,Consistency规定内存读写的行为怎么样才是正确的,这不仅需要硬件层面来保证,有时候也需要程序员显示来调用特殊指令来保证。