Cache的不一致:内存数据拿到CPU Cache 之后,在后面的操作过程中,CPU Cache 里的值和内存中可能是不一样的。
两种方法解决不一致问题:write-through和write-back (write-back的特点是不立即写内存,而是等到替换cache line的时候将含dirty数据的line写进内存)。
note:这两种解决方案都是针对一个核上的cache 。
-----------------------------------------------------------------------------------------------------------------------------------------------------
note:如今CPU不再按字节访问内存,而是按缓存行(64字节为单位)
-----------------------------------------------------------------------------------------------------------------------------------------------------
Cache 一致性问题:在多核系统中,各个核的cache存储相同变量的副本,当一个处理器更新cache中该变量的副本时,其他处理器应该知道该变量已更新,即其他处理器中cache的副本也应该更新。
一致性问题是针对多个处理器的。每个处理器上的Cache之间可能会发生不一致。(核之间)
有两种主要的方法来保证cache的一致性:监听cache一致性( Snooping Cache Coherence )和基于目录的擦车一致性(Directory Based Cache Coherence).
监听cache一致性:当一个核更新它cache中某个变量,如x,其他核会知道自己cache里的x已经是invalid了。(invalidation标识的是各个core自己cache中的line)note:广播会通知其他核包含该变量的整个cache行的更新,而不是只有x更新。
每更新一个变量就需要一次广播。
基于目录的cache一致性:通过使用一个叫做目录(Directory)的数据结构来解决广播应用于大型系统时导致的性能的下降。目录存储每个内存行的状态。(invalidation标识的是内存中的line)一般地,这个数据结构是分布式的。比如,每个核/内存对负责存储一部分的目录。这部分目录标识局部内存对应高速缓存行的状态。因此,当一个高速缓存行被读入时,如核0的Cache,与这个高速缓存行相对应的目录项就会更新,表示核0有这个行的副本。当一个变量需要更新时,就会查询目录,并将所有包含该变量高速缓存行置为非法。
显然目录需要大量额外的存储空间,但是,当一个Cache变量更新时,只需要与存储这个变量的核交涉(对应的部分目录在这个核上)。