谈起内存,经常谈到了三个词 contiguous / consistent / coherent ,这里想区别一下。
contiguous memory allocator 连续内存分配器 CMA
contiguous 更多的来指内存的连续性,而 consistent 和 coherent 更多指是操作内存时,发生的一些状况。
比如,在多核处理器上,一个进程的多个线程可能并发地运行在多个物理PE上,这个时候,对于共享的内存区域就必须考虑到Consistent的问题。
简单来说,就是多个需要保证读写在不同master之间的顺序性。如何保证呢,load-acquire/store-release,或者加锁,或者做memory barrier。
对于Consistent而言,硬件只提供解决Consistent的机制,而软件需要自行使用这些机制来保证Consistent。
Coherent。当一份数据可以有多份拷贝的时候,就会出现Coherent问题。Coherent出现的最典型情况就是Cache的引入。
要保证cache的一致性,
总结一下,Consistent是由于多个Master对同一块内存区域的读写顺序造成的问题,只能由硬件提供相关的机制,由软件来保证。而Coherent则是由于同一块内存区域可能有多份拷贝(主要是Cache)而造成的数据的不一致性,可以由硬件来保证。
Reference:
1、PE 指的是 Process Element, 就是逻辑核心(logic core),一个逻辑核心上可以跑一个线程。这个概念引出是由于现在有很多双线程的处理器(double-thread core),可以一个核心运行两个完全不同的任务/线程, 一个当两个用,所以不能单单当成一个核了,就说一个核有两个PE。1个PE可以跑1个线程(thread)。PE指的是硬件,线程是跑在PE上的软件。
比如说因特尔的i7-4790K,就是4核8线程处理器,每个核有两个线程,也就是有8个PE。
2、内存体系中的Consistent和Coherent