snoop操作怎么维护一致性?
假设cpu0要读地址addr=0x08的数据,这个数据L01有一份,DDRC里肯定也有一份,但是CPU0不知道这个事情,然后CPU0会发出一个读请求到HN,它会发一个snoop请求给到CPU1,然后CPU1把数据“可以”给HN,然后HN再把数据回给CPU0。
我理解:HN来自CPU0的请求,然后发snoop操作给CPU1的这整个过程叫做snoop。然后HN发给CPU1的请求叫snoop请求,CPU1在这个过程叫做snoopee。
对于SOC维持一致性的话,一般(我所知道的)就有两种:
一种是:HN只要收到一个请求,就snoop到所有的节点,假设CPU1有数据就回,如果snoop到CPU2,CPU2没有数据,那就不用回数据了,优点是HN不用搞个directory记录各个cacheline的状态,当然这不是CHI。缺点也很明显,所有的请求你都要完整地snoop到各个节点,带宽啥的,有点笨。这种呢,就适合少节点的,要是2,3个节点那你就随便snoop吧,其实现在一般的消费者级别的芯片都是这种,ACE(协议),啥的。
另一种:就是CHI这种,HN要搞个directory记录着各个cacheline,所以来了一个请求,我HN是知道哪个cpu有这个地址的数据的,所以每来一个请求,HN就查directory,查到哪个节点有数据,什么状态,就精准的往对应节点发snoop。
所以CHI协议,是基于directory和snoop机制来维持cache一致性的一个系统。