CHI协议中的read transaction flow
cacheline的各个状态介绍在之前的文章都已经描述过,在这不再赘述,直接开始看CHI协议中规定的几种read transaction。
1. readnosnp
顾名思义,它是向non-snoopable(主存)区域发起的一个读请求,这个读请求不需要snp其它RN,不涉及一致性的东西。说白了就是RN直接去到主存读回数据。
2. readonce
只读一次,用一下就完事儿。 只能去snoopable地址区域读,那就是去cache中读咯,对都回来的cacheline状态并无要求。
3. readclean
想要获取一个cacheline的clean状态,SC态或者UC态都可以。
HN-F收到RN0发来的readclean,会发送snpclean给到RN1 RN2,同时去主存中readclean。由于RN2中该cacheline的状态也是I态(说明这个cacheline并不存在于RN2中),所以返回snpresp_I; 而RN1该cacheline的状态是UDP(该cacheline部分是unique dirty态),会将主存读到的数据和RN1的部分dirty的cacheline merge 给到RN0,同时再次发起writenosnp将merge data再重新写回主存。
4.readunique
想要获取一个cacheline的unique状态,UC态或者UD态都可以。
HN-F收到RN0发来的readunique,会发送snpunique给到RN1 RN2,同时去主存中readnosnp(因为HN-F记录了这个cacheline在RN-F1中的状态是UDP,所以还需要去主存中读回另一部分)。由于RN2中该cacheline的状态也是I态(说明这个cacheline并不存在于RN2中),所以返回snpresp_I; 而RN1该cacheline的状态是UDP(该cacheline部分是unique dirty态),会将主存读到的数据和RN1的部分dirty的cacheline merge 给到RN0,RN0最终得到该cacheline的UD态。