I(Invalid):缓存行无效,即缓存行不存在于缓存中。
UC(Unique Clean):缓存行的状态是唯一且“干净”,即缓存行只存在当前缓存中,且缓存行没有被修改过。拥有该缓存行的处理器可以在不通知其它缓存的情况下修改此缓存行。当前缓存接收到监听消息时,如果DataRet(Data Return to Source)字段被置为1,可以(但不要求)返回该条缓存行数据;如果DataRet字段被置为0,不可以返回该条缓存行数据。
UCE(Unique Clean Empty):缓存行只在当前缓存中存在,缓存行处于唯一状态,但所有数据字节均无效。拥有该缓存行的处理器可以在不通知其它缓存的情况下修改缓存行。当前缓存接收到请求数据的监听消息时,不可以返回该条缓存行(因为所有数据无效)。
UD(Unique Dirty):缓存行的状态是唯一但为“脏“,即缓存行只在当前缓存中存在,但是缓存行数据被修改过,且没有更新到内存。当该缓存行被逐出(eviction)时,必须写回下一级缓存或内存。拥有该缓存行的处理器以在不通知其它缓存的情况下修改缓存行数据。当前缓存接收到请求数据的监听消息时,必须返回该缓存行数据。
UDP(Unique Dirty Partial):缓存行的状态是唯一但是部分为“脏“,即缓存行只在当前缓存中存在,缓存行是唯一的,但是缓存行的仅有一部分数据有效且“脏”。当该缓存行被逐出(eviction)时,必须将其与下一级缓存或内存中的数据合并,以形成完整的有效缓存行。拥有该缓存行的处理器以在不通知其它缓存的情况下修改缓存行数据。当前缓存接收到请求数据的监听时,必须返回该缓存行数据。仅当接口支持部分缓存状态(Partial Cache States)时,才支持此缓存行状态。
SC(Shared Clean):缓存行的状态是不唯一且“干净”,即在其它缓存中可能有该缓存行的副本,且缓存行数据可能被修改过,但是在当前缓存中是“干净“的。当该缓存行在当前缓存中被逐出(eviction)时,当前缓存不需要将此缓存行数据写回内存。当前缓存只有在无效(invalidate)此缓存行其它缓存中的副本,并取得此缓存行的唯一所有权后,才能修改此缓存行数据。当前缓存接收到请求数据的监听时,不可以返回缓存行数据。
SD(Shared Dirty):缓存行的状态是不唯一且“脏”。其它缓存中可能有该缓存行的副本,缓存行数据被修改过。当该缓存行被逐出(eviction)时,必须写回下一级缓存或内存。当前缓存只有在无效(invalidate)此缓存行其它缓存中的副本,并取得此缓存行的唯一所有权后,才能修改此缓存行数据。当前缓存接收到请求数据的监听时,必须返回缓存行数据。
读请求:需要返回一个数据响应给请求者(requester)
写请求:请求者发出数据
无数据请求:不需要返回一个数据响应给请求者
原子请求:请求者发出数据,请求不可分割
ReadNoSnp:对不可监听的(non-snoopable)地址区域的读取请求。数据包含在完成响应中;数据大小取决于请求中的数据尺寸属性(size attribute)值,最大是一条缓存行大小;接收到的数据不会被请求者缓存。
ReadOnce:对可监听的(snoopable)地址区域的读取请求,以获取一致性数据快照。数据大小是一条缓存行;接收到的数据不会被请求者缓存。
ReadOnceCleanInvalid:对可监听的地址区域的读取请求,以获取一致性数据快照。数据大小是一条缓存行;建议但不强制,缓存副本被置无效(invalidate);如果被置无效的缓存备份是“脏”的,必须把此缓存行写回到内存;接收到的数据不会被请求者缓存。
ReadOnceMakeInvlid:对可监听的地址区域的读取请求,以获取一致性数据快照。数据大小是一条缓存行;建议但不强制,所有缓存副本被置无效(invalidate);如果被置无效的缓存备份是“脏”的,无需把此缓存行写回到内存;接收到的数据不会被请求者缓存。使用ReadOnceMakeInvalid事务可能会导致“脏”缓存行丢失,因此ReadOnceMakeInvalid的使用必须严格限制在已知允许丢失“脏”缓存行的情况下。
ReadUnique:对可监听的地址区域的读取请求,以对缓存行进行存储。数据大小是一条缓存行;请求者将接收UC或UD状态的数据。
ReadClean:对可监听的地址区域的读取请求。数据大小是一条缓存行;数据必须以“干净”的状态(UC或SC)提供给请求者。
ReadNotSharedDirty:对可监听的地址区域的读取请求。数据大小是一条缓存行;数据必须以UC或UD或SC状态(不能是SD)提供给请求者。
ReadShared:对可监听的地址区域的读取请求。数据大小是一条缓存行;请求者将接收UC或UD或SC或SD状态的数据。
CleanUnique:请求可监听的地址区域将状态更改为Unique,以对缓存行执行存储。典型用法是当请求者拥有缓存行的共享副本,并希望获得存储到缓存行的权限时可以用此事务。数据不包括在完成响应中;任何“脏”副本都必须写回下一级缓存或内存。
MakeUnique:请求可监听的地址区域以获得缓存行的所有权,不需要数据响应。只有当请求者保证将对缓存行的所有字节进行存储时,才会使用此请求。任何“脏”副本都必须失效,而无需写回下一级缓存或内存。
Evict:用于指示缓存代理不再缓存“干净”的缓存行。此事务不发送数据;缓存行不得保留在缓存中。
CleanShared:对CleanShared请求的完成响应可以确保所有缓存副本都更改为非“脏”状态,并且任何“脏”副本都会写回内存。完成响应中不用包含数据。
CleanSharedPersist:对CleanSharedPersist请求的完成响应可以确保所有缓存副本都更改为非“脏”状态,并且任何“脏”缓存副本都会写回PoP(Point of Persistence)。PoP是内存系统中的一个点,当系统电源断开时,会保持对内存的写入,当电源恢复时,会可靠的恢复对内存的写入。完成响应中不用包含数据。
CleanInvalid:对CleanInvalid的完成响应可以确保所有缓存的副本都无效,并且任何“脏”副本都会写入内存。完成响应中不用包含数据。
MakeInvalid:对MakeInvalid的完成响应可以确保所有缓存的副本都无效,并且必须丢弃任何“脏”副本。完成响应中不用包含数据。
SnpMe Variants:CleanShared、CleanSharedPersist、CleanInvalid和MakeInvalid事务都有一个SnpMe变体,后缀为[SnpMe]。SnpMe是请求者向主代理发出的指示,表明请求者尚未检查其缓存中是否存在该行的副本,请求者指示主代理在必要时向请求者发出监听。
WriteNoSnpPtl:写部分缓存行到不可监听(non-snoopable)的地址区域。数据最大是一条缓存行;必须明确写入的字节和不写入的字节。
WriteNoSnpFull:写完整缓存行到不可监听的地址区域。数据大小是一条缓存行;不需要指明写入的字节,因为默认写入全部字节。
WriteUniquePtl:写部分缓存行到可监听(snoopable)的地址区域。当缓存行在请求方无效(invalid)时,将数据的缓存行写入下一级缓存或内存。
WriteUniqueFull:写完整缓存行到可监听的地址区域。当缓存行在请求方无效(invalid)时,将数据的缓存行写入下一级缓存或内存。
CopyBack Transaction:回写事务是写事务的一个子类。回写事务将一致的数据从缓存移动到下一级缓存或内存。回写交易不需要snoop系统中的其它代理。
WriteBackPtl:将“脏”的部分缓存行写回下一级缓存或内存。仅当支持部分缓存状态时,才支持此事务。
WriteBackFull:将“脏”的完整缓存行写回下一级缓存或内存。WriteBackFull又可以分为两种,WriteBackFullUD和WriteBackFullSD。
WriteCleanFull:将“脏”的完整缓存行写回下一级缓存或内存,并在缓存中保留干净的副本。
WriteEvictFull:将唯一的“干净”数据写回下一级缓存。
AtomicStore:发送带有地址和要执行的原子操作的单个数据值。请求中包含数据;发出数据大小为1、2、4或8字节;目标对原子事务中提供的数据值指定的地址位置执行所需的操作;支持的操作数为8;目标返回一个没有数据的完成响应。
AtomicLoad:发送带有地址和要执行的原子操作的单个数据值。请求中包含数据;发出数据大小为1、2、4或8字节;目标对原子事务中提供的数据值指定的地址位置执行所需的操作;支持的操作数为8;完成响应中返回的数据大小要与请求中的数据大小一致。
AtomicSwap:发送数据值,交换值和执行地址。请求中包含数据;发出数据大小为1、2、4或8字节;目标对原子事务中提供的数据值指定的地址位置执行所需的操作;支持的操作数为1;完成响应中返回的数据大小要与请求中的数据大小一致。
AtomicCompare:发送两个数据值(比较值和交换值)执行地址。请求中包含数据;发出数据大小为2、4、8、16或32字节;目标将地址位置的值与比较值进行比较,如果值匹配,目标会将交换值写入寻址位置,如果值不匹配,则目标不会将交换值写入寻址位置。目标返回地址位置的原始值,完成响应的数据大小是请求中数据大小的一半。支持的操作数为1。
SnpMe Variants:上诉原子事务都有一个SnpMe变体,以后缀名[SnpMe]区分。
读完成:读完成响应包括数据响应;读完成响应还包括一个缓存状态,指示行缓存行的状态;读完成中不使用字节使能功能。
无数据完成:无数据完成响应不包括数据响应;无数据完成响应也不包括缓存状态,缓存行的状态由请求者决定。
写完成:写完成响应不包括数据响应;写完成响应也不包括缓存状态。
SnpToAny:用于获取缓存行副本,无需更改状态;在被监听端,不需要更改缓存行状态。
SnpToC:用于确保缓存行不处于“脏”状态,通常用于执行缓存清理操作;在被监听端,缓存行不可以是“脏”;缓存行(如果有效)预计将更改为“干净”状态,即UC或SC;缓存行可以(但不要求)转移为无效状态。
SnpToS:用于确保缓存行不处于唯一(unique)状态。可以确保在被监听端,在不通知系统中的其它代理的情况下,缓存行不会被更改。当主代理允许一个“脏”缓存行副本在被监听端是SD状态,通常使用SnpToS,而不是SnpToSC。在被监听端,缓存行不可以是唯一状态;缓存行(如果有效)预计将更改为共享状态,即SC或SD;缓存行可以(但不要求)转移为无效状态。
SnpToSC:用于确保缓存行不处于唯一或“脏”状态。当主代理不允许一个“脏”缓存行副本在被监听端,通常使用SnpToSC,而不是SnpToS。在被监听端,缓存行不可以是唯一或“脏”状态;缓存行(如果有效)预计将更改为SC状态;缓存行可以(但不要求)转移为无效状态。
SnpToI:用于将缓存行转移到无效状态。通常用于当另一个代理请求对缓存行执行存储时。
SnpMakeI:用于将缓存行转移到无效状态,而不会从被监听返回任何数据,即使缓存行处于“脏”状态。通常用于另一个代理请求对整个缓存行执行存储时。
SnpChain:将当前监听连接到同一数据包中较早的监听之后。