转自: http://ninghuiming977.blog.163.com/blog/static/41767482200914112822530/
原文:
1.基于监听协议:
通常使用两种策略来解决Cache一致性问题:写无效策略和写更新策略。
写无效策略(write invalidate)是指当某个处理器更新其私有Cache中的某个数据时,它通知所有其它Cache这一数据在它们中的副本从此均无效。这样就可以避免其它"过时"的副本被使用而造成错误。
写更新策略(write update)是指当某个处理器更新其私有Cache中的某个数据时,它把所更新的数据发送给所有的其它Cache,以更新这一数据在其它Cache中的所有副本。一般来说,使用写更新策略,需要传输更新后的数据,而写无效只需传输写无效信息,因此写更新传输的数据量比写无效要大。而且,被更新的数据的某些副本以后也不一定再被使用。例如上图中,P1更新X后,P2不一定再使用变量X的值。因此每次都对所有的副本都更新是没有必要的。
请注意,写无效和写更新是维护Cache一致性的策略,它与维护Cache与主存储器一致性的策略没有必然的关系。无论是使用写无效策略还是写更新策略,共享存储器中的数据副本都可以通过写直达或写回策略来维护与Cache的一致性。
写回法:当CPU写Cache命中时,只修改Cache的内容,而不立即写入主存;只有当此行被换出时才写回主存。
写直达:又称全写法,当写Cache命中时,Cache与主存同时发生写修改,因而较好的维护了与主存的内容一致性。
写一次法:是写回法与全写法的折中方法:写命中与写未命中的处理方法与写回法基本相同,只是第一次写命中时要同时写入主存。这是因为第一次写Cache时,CPU要在总线上启动一个存储写周期,其他Cache监听到此主存块地址及写信号后,即可拷贝该块或及时作废,以便维护系统全部Cache的一致性。
例如,如果采用写无效策略和写直达策略,当处理器P修改私有Cache中的某一数据时,不但要向其它处理器的Cache发送无效信息,而且要将共享存储器中该数据的副本更新。最终,处理器P的私有Cache和共享存储器中的数据是相同而且是正确的,而其它处理器Cache中该数据的副本被标记为无效。如果采用写无效策略和写回策略,当处理器P修改私有Cache中的某一数据时,不但要向其它处理器的Cache发送无效信息,而且要向共享存储器发送无效信息。最终,只有处理器P的私有Cache中的数据是正确的,而共享存储器和其它处理器Cache中该数据的副本均被标记为无效。
2.基于目录协议
使用Cache目录来存放有关数据块拷贝驻留在Cache中的信息,把使其他Cache数据块无效的一致性命令只发给存放有相应数据块的Cache,从而支持Cache的一致性。 根据目录的结构特点,基于目录的协议可分为3类:全映射(full-map)目录、有限(limited)目录、和链式(chained)目录。