对称式共享存储器系统支持共享和私有化数据的缓存
私有数据被单个处理器使用,共享数据则被多个处理器所使用 ,基本上是通过读写共享数据实现处理器之间的通信
共享数据的好处:
减少访问的时延和降低对存储器带宽的要求
减少访问的时延和降低对存储器带宽的要求
减少多个处理器同时读取共享数据时的竞争现象
共享数据放入cache会导致cache一致性的问题
存储器行为的两个方面:
一致性(coherence) 定义了读操作返回什么样的值,连贯性(consistency)写入的数值什么时候才能被读操作返回
- 处理器对地址写操作后紧跟处理器的读操作
- 在处理写操作后,再进行读操作,两个操作之间有足够的间歇时间
- 对于同一个地址的写操作是串行执行的,任何两个处理器对同一个地址的两个写操作在所有处理器看来都是相同顺序的
如果某个处理器对X的写操作只领先其他处理器对X的读操作很短一段时间,则无法保证该读操作的能返回写入的数值,这一刻写入的数据甚至还没有被处理器发送出去
如何实施一致性
在多处理器系统上运行的程序会要求在多个cache中有同一个数据副本,cache提供共享数据的迁移和复制
迁移:数据项迁移到本地cache并以透明的方式使用
复制:cache在本地为那些被同时读取的共享数据提供副本
监听协议:
写无效协议:在处理器写数据项之前保证该处理器能独占地访问数据项
在执行写操作时使得其他的副本无效。
写操作要求处理器独占,执行读操作的处理器所保留的任何副本都被置为无效,执行读操作时,可能出现cache缺失,需要取回新的数据副本.
对于写操作,要求执行写操作的处理器独占访问,防止任何其他处理器同时执行写操作
写更新(写广播协议):
写入数据项时更新该数据项所有的副本
该方法需要将所有的写操作广播给共享cache,需要更大的带宽.
基本实现技术:
实现写无效的采用总线或者其他广播媒介来完成
实现无效操作,处理器只需取得总线控制权然后在总线上广播无效数据的地址
处理器检测各自的cache中是否由总线上广播的地址,要是有则置为无效即可
若两个处理器向一块中写,需要总线仲裁,达到串行的目的
第一个获得总线控制权的,将另一个处理器置为无效
cache缺失时对数据项进行定位:
写回的cache能够使用同样的监听方案来处理cache缺失和写操作:
所以处理器都监听总线上的地址,若一个处理器发现其留有被请求的cache块的一个脏副本,马上做出响应,提供该cache,并中断对存储器的访问.
利用cache中的标识位进行无效操作,对于写操作,需要知道其他cache中还有没有副本,若是没有副本,则无需在总线上进行写操作
判断一个cache数据块是否被共享:
增加一个状态位,根据该状态位判断是否要进行无效操作,对于共享数据进行写操作时,cache会发一个无效操作并将该块标记为私有
增加一个状态位,根据该状态位判断是否要进行无效操作,对于共享数据进行写操作时,cache会发一个无效操作并将该块标记为私有
发送无效操作时,将cache状态变成非共享状态,稍后有其他处理器请求该cache块,再次变为共享状态.
协议范例:
![](https://img-my.csdn.net/uploads/201205/04/1336122950_6192.jpg)