第 6 章 独占访问
本章描述了架构为支持独占访问而包含的机制。它包含以下部分:
• 概述 在 6-240 页。
• 独占监视器 在 6-241 页。
• 独占事务 在 6-244 页。
6.1 概述
独占访问的原则是,执行独占序列的逻辑处理器 (LP) 需完成以下操作:
• 从一个位置执行独占加载。
• 计算一个要存储到该位置的值。
• 对该位置执行独占存储。
支持两种不同形式的独占访问:
• 对可侦测内存位置的独占访问。
• 对不可侦测内存位置的独占访问。
如果自独占加载后,该位置被另一个 LP 更新,那么独占存储必须失败。在这种情况下,存储不会发生,并且 LP 不会更新该位置持有的值。
注意
-
术语"独占加载"用于描述 LP 执行适当程序指令(如 LDREX)的动作。此动作需要:
--- 从其想要执行独占序列的位置获取数据。
--- 指示它正在开始一个独占序列。
-
术语"独占加载事务"用于描述在接口上发起的事务,用于为独占加载获取数据(如果该数据在 LP 的缓存中不可用)。并非每个独占加载都需要一个独占加载事务。
-
术语"独占存储"用于描述 LP 执行适当程序指令(如 STREX)的动作。此动作需要:
--- 确定独占序列是通过还是失败。
--- 如果适当,更新该位置的数据。
独占存储可以通过或失败,并且执行处理器会知道此结果。当独占存储通过时,地址位置的数据值被更新。当独占存储失败时,这表示地址位置的数据值未被更新,并且必须重新启动独占序列。
-
术语"独占存储事务"用于描述在接口上发起的事务,该事务可能是完成独占存储所必需的。并非每个独占存储都需要一个独占存储事务。独占存储事务可以通过或失败,并且此结果通过事务响应告知 LP。
6.2 独占监视器
独占监视器跟踪独占序列的进程。监视器的位置以及为支持独占访问而生成的请求类型,取决于地址的内存属性。
6.2.1 可侦测内存位置
对于可侦测内存位置,定义了两个监视器:
-
LP 监视器 :每个在 RN-F 内的 LP 必须实现一个独占监视器,该监视器观察独占序列使用的位置。当 LP 执行独占加载时,LP 监视器被设置。在以下任一情况下,LP 监视器被重置:
• 该位置被另一个 LP 更新,这由对相同地址的无效侦测请求指示。
• 同一 LP 对该位置进行了存储。如果来自同一 LP 的存储是非独占的,是否重置监视器是由实现定义的。
-
PoC 监视器 :HN-F 必须实现一个 PoC 监视器,它可以传递或失败一个独占存储事务。通过表示该事务已传播到其他一致的 RN-F。失败表示该事务尚未传播到其他一致的 RN-F,因此独占存储无法通过。
该监视器用于确保来自 LP 的独占存储事务仅在以下情况下成功:在它发起自己的独占存储事务之后,该 LP 不可能已经接收到与来自另一个 LP 的相同地址的独占存储相关的侦测事务。
PoC 监视器的最低要求是记录任何 LP 何时执行与独占序列相关的可侦测事务。
如果一个 LP 已执行了与独占序列相关的事务,然后在另一个 LP 的成功独占存储事务被调度之前,它执行了一个独占存储事务,那么该独占存储事务必须成功。
监视器必须支持并行监视系统中所有具备独占能力的 LP。
当 HN-F 接收到与独占加载或独占存储相关联的事务时,监视器会记录该 LP 正在尝试一个独占序列。
当 HN-F 接收到一个独占存储事务时:
• 如果 PoC 监视器已记录该 LP 正在执行一个独占序列(即,它未被另一个 LP 的独占存储事务重置),那么该独占存储事务成功并被允许继续进行。在这种情况下,必须重置所有其他 LP 的已记录尝试。本规范建议(但不要求)将成功的 LP 的 PoC 监视器保持为已记录状态。
• 如果 PoC 监视器未记录该 LP 正在执行一个独占序列(即,它已被另一个 LP 的独占存储重置),那么该独占存储事务失败且不被允许继续进行。监视器必须记录该 LP 正在尝试一个独占序列。
注意
-
来自 LP 的成功独占存储事务不必重置该 LP 正在执行独占序列的记录。该 LP 可以继续执行一系列独占存储事务,这些事务都将成功,直到另一个 LP 执行成功的独占存储事务。对于 LP 不可识别的存储事务,该存储必须被当作来自与设置监视器的 LP 不同的 LP 来处理。
-
从系统初始复位开始,第一个执行独占存储事务的 LP 可能成功,但本规范并不要求如此。此时,所有其他 LP 必须随后记录其独占序列的开始,以便其独占存储事务能够成功。
-
当一个 LP 的独占存储事务通过,并且所有其他 LP 的已记录尝试被重置时,其他 LP 只能在观察到通过的独占存储事务的 CompAck 响应后,才能记录一个新的独占序列。
注意
LP 和 PoC 监视器对是支持对可侦测内存位置进行独占访问所必需的。
6.2.2 附加地址比较
PoC 监视器可以增强以包含一些地址比较。不要求完全的地址比较,允许仅记录地址位的子集。这种方法减少了由于另一个 LP 对不同地址位置的独占存储事务而导致独占存储事务失败的机会。所使用的地址比较位数是由实现定义的。
在使用附加地址比较监视器的情况下,被监视的地址位在独占序列开始时(在加载独占或存储独占事务时)被记录。它通过另一个 LP 对匹配地址的成功独占存储事务来重置。
包含附加地址比较的监视器仍然必须为每个具备独占能力的 LP 至少包含一个单一位的最小监视器,以确保前向进度。
如果满足以下条件之一,则允许独占存储事务继续进行:
-
地址监视器已为来自同一 LP 的匹配地址记录了独占序列,并且未被来自不同 LP 的具有匹配地址的独占存储事务重置。
-
最小单位监视器已被来自同一 LP 的独占序列设置,并且未被来自不同 LP 的对任何地址的独占存储事务重置。
注意
-
术语"匹配地址"用于描述监视器仅记录地址位子集的情况。被记录的地址位是相同的,但未被记录的地址位可能不同。
-
实现不需要为每个具备独占能力的 LP 配备一个地址监视器。由于地址监视器提供了性能增强,因此拥有较少的地址监视器并且这些监视器的使用是由实现定义的是可以接受的。例如,额外的地址监视器可以按先到先得的方式使用,或分配给特定的 LP。或者,可能实现更复杂的算法。
-
可以提供额外的 PoC 独占监视器功能,以防止由系统中一个代理发出大量独占访问事务而引起的干扰或拒绝服务。本规范建议允许安全独占访问独立于非安全访问的进度而取得前向进度。
6.2.3 不可侦测内存位置
对于不可侦测内存位置,使用单个监视器:
-
系统监视器 :系统监视器跟踪对不可侦测区域的独占访问。此监视器类型由 ReadNoSnp(Excl) 事务设置,并由另一个 LP 对该位置的更新重置。
系统监视器可以放置在 PoS 或端点设备处。系统中设备的数量可能远大于 PoS 的数量,将系统监视器放置在 PoS 可以:
• 减少系统监视器的重复。
• 减少系统检测独占访问失败所需的时间。
系统监视器的位置必须能够观察到所有对受监视位置的事务。
6.3 独占事务
以下事务类型通过 Excl 位支持独占访问:
-
对可侦测位置的独占加载事务:
--- ReadClean。
--- ReadNotSharedDirty。
--- ReadShared。
-
对可侦测位置的独占存储事务:
--- CleanUnique。
-
对不可侦测位置的独占加载事务:
--- ReadNoSnp。
-
对不可侦测位置的独占存储事务:
--- WriteNoSnp。
通信节点对为:
-
对于对可侦测位置的独占访问:
--- RN-F 到 ICN(HN-F)。
-
对于对不可侦测位置的独占访问:
--- RN-F, RN-D, RN-I 到 ICN(HN-F, HN-I)。
--- ICN(HN-F) 到 SN-F。
--- ICN(HN-I) 到 SN-I。
独占事务必须使用正确的 LPID 值,参见第 2-98 页的逻辑处理器标识符。
独占读取不得使用直接数据传输流。
6.3.1 对独占请求的响应
对独占请求的事务响应类似于对读取和写入的正常响应,除了:
-
独占读取不得使用分离的 Comp 和 Data 响应。
-
未失败的独占读取不得使用 DMT 或 DCT。
然而,响应还必须指示独占请求是通过还是失败。响应中的 RespErr 字段用于此目的。参见第 12-349 页的 RespErr。RespErr 字段值 0b01(独占成功)表示通过,RespErr 字段值 0b00(正常成功)表示独占访问失败。
独占成功响应只能给予设置了 Excl 属性的事务。
并非所有内存位置都要求支持独占访问。对于不支持独占访问的位置的独占加载事务,绝不能给予独占成功响应。
对于不支持独占访问的位置,独占存储事务是否会更新该位置是由实现定义的。
本规范建议不要对不支持独占访问的位置执行独占存储事务。
表 6-1 显示了请求的可侦测属性、相关监视器类型以及失败条件的可能原因和响应要求。
表 6-1 对独占访问请求的响应
| 请求类型 | 可侦测 | 监视器类型 | 失败条件 | 响应 |
|---|---|---|---|---|
| ReadNoSnp(Excl) | 否 | 系统 | 目标不支持独占访问 | 目标必须返回数据响应 |
| WriteNoSnp(Excl) | 否 | 系统 | 地址内容被修改 因监视器溢出导致地址不存在 目标不支持独占访问 | 请求者仍必须通过发送数据消息来完成写入流程 |
| ReadClean(Excl) ReadNotSharedDirty(Excl) ReadShared(Excl) | 是 | LP, PoC | 目标不支持独占访问 | 目标必须返回数据响应 |
| CleanUnique(Excl) | 是 | LP, PoC | 地址内容被修改 因监视器溢出导致地址不存在 目标不支持独占访问 | 目标必须返回 Comp 响应 |
6.3.2 系统责任
实现 CHI 协议的系统有以下责任:
-
应为每个 LP 包含一个监视器,以便有效处理独占访问。
-
必须具有针对所有独占请求的饥饿预防机制,无论是使用监视器机制还是其他方式。
-
本规范建议安全独占请求的进度独立于非安全独占请求的进度。
6.3.3 对可侦测位置的独占访问
本节描述 LP 在对可侦测地址位置执行独占访问时的行为。
可侦测独占加载
LP 通过独占加载启动一个独占序列。独占序列的开始必须设置 LP 独占监视器。
想要对可侦测位置执行独占访问的 LP 可能已经在其本地缓存中持有该缓存行:
-
如果 LP 以唯一状态持有该缓存行,则允许(但本规范不推荐)它执行独占加载事务。
-
如果 LP 以共享状态持有该缓存行,则允许(但本规范不要求)它执行独占加载事务。
-
如果 LP 未持有该缓存行的副本,本规范建议 LP 使用独占加载事务来获取该缓存行,但允许使用未断言 Excl 属性的 ReadClean、ReadShared 或 ReadNotSharedDirty。
从可侦测独占加载到可侦测独占存储
在执行独占加载之后,LP 通常会计算一个新值以存储到该位置,然后才尝试独占存储。
不要求 LP 总是完成一个独占序列。例如,独占加载获取的值可能表明信号量被另一个 LP 持有,并且在那个 LP 释放信号量之前无法更改该值。因此,可以启动一个新的独占序列,而不尝试完成当前的独占序列。
在独占加载和独占存储之间的时间内,LP 独占监视器必须监视该位置,以确定另一个 LP 是否可能更新了该位置。
可侦测独占存储
LP 不得允许独占存储事务与任何记录其正在执行独占序列的事务同时进行。LP 必须等待所有此类事务的消息交换完成,或收到 RetryAck 响应后,才能发起独占存储事务。记录 LP 正在执行独占序列的事务包括:
-
对任何位置的独占加载事务。
-
对任何位置的独占存储事务。
当 LP 执行独占存储时,需要以下行为:
-
如果 LP 独占监视器已被重置,独占存储必须失败,并且 LP 不得发起独占存储事务。LP 必须重新启动独占序列。
注意当 LP 监视器被重置时,不为最终必须失败的独占存储发起事务可以避免不必要的对其他缓存行副本的无效操作。
-
如果缓存行以唯一状态被持有,并且 LP 独占监视器已设置,那么独占存储通过,并且它可以在不发起事务的情况下更新该位置。
-
如果缓存行以共享状态被持有,并且 LP 独占监视器已设置,那么 LP 必须发起一个独占存储事务。必须使用断言了 Excl 属性的 CleanUnique 事务。LP 独占监视器必须继续运行,并在 CleanUnique 事务进行期间检查缓存行是否未被更新。
该事务将收到 Normal Okay 或 Exclusive Okay 响应。
如果事务收到 Exclusive Okay 响应,则表示该事务已通过,并已完成对所有其他缓存行副本的无效操作。在独占事务以 Exclusive Okay 响应完成后,LP 必须再次检查 LP 独占监视器:
--- 如果 LP 独占监视器仍被设置,则独占存储已通过,并执行更新。
--- 如果 LP 独占监视器未被设置,则表示在独占存储事务发起和完成之间的某个时刻,缓存行发生了更新。独占存储必须失败,并且必须重新启动独占序列。
--- 如果 LP 无法跟踪缓存行的独占性质(例如,因为缓存行已被逐出),则独占存储必须失败,并且必须重新启动独占序列。
如果独占存储事务收到 Normal Okay 响应,则表示另一个 LP 已被允许推进与独占存储相关的事务。来自此 LP 的与独占存储相关的事务已失败,并且尚未传播到系统中的其他 LP。当独占存储事务以 Normal Okay 响应完成时,可选方案有:
--- LP 可以使独占存储失败,并在访问完成时检查或不检查缓存行状态的情况下重新启动独占序列。
--- LP 可以检查 LP 独占监视器,如果 LP 独占监视器已被重置,则 LP 必须使独占存储失败并重新启动独占序列。
--- LP 可以检查 LP 独占监视器,如果 LP 独占监视器仍被设置,则 LP 可以重复该独占存储事务。
对不可侦测位置的独占访问
以下限制适用于对不可侦测位置的独占访问:
-
独占访问的地址必须与事务的总字节数对齐。
-
在独占访问中传输的字节数必须是合法的数据传输大小,即 1、2、4、8、16、32 或 64 字节。
未能遵守这些限制将导致不可预测的行为。
对于被视为一对的独占读取和独占写入事务,必须满足以下标准:
-
独占读取和独占写入的地址必须完全相同。
-
控制信号的值,即独占读取和独占写入事务的 MemAttr 和 SnpAttr,必须完全相同。
-
独占读取和独占写入中的数据大小必须完全相同。
-
独占读取的 LPID 值必须与独占写入事务的 LPID 值匹配。
独占操作期间要监视的最小字节数由事务大小定义。系统监视器可以监视更多的字节,最多 64 字节,这是独占访问的最大大小。但是,这可能导致成功的独占访问被指示为失败,因为在独占访问进行期间,一个相邻字节被更新了。
来自同一 LP 的、对不可侦测内存位置的多个独占事务(无论是读取还是写入),无论是针对相同地址还是不同地址,都不得同时处于未完成状态。
如果 SN 不支持独占访问(如独占读取 NoSnp 上的 Exclusive Fail 所示),那么如果写入被给予 Exclusive Fail 响应,该写入将更新该位置。
如果 SN 支持独占访问(如独占读取 NoSnp 上的 Exclusive Pass 所示),那么如果写入被给予 Exclusive Fail 响应,该写入将不会更新该位置。