app的后台和网站的后台差别学设计什么培训机构好
SC 只定义 semantic-level 的含义
如我在前一个回答中提到的,SC 是一个语义模型,由 Lamport 定义,主要描述程序执行的逻辑行为:
- 内存操作按程序顺序执行。
- 所有处理器对内存操作的顺序有一致的全局视图。
SC 不直接规定硬件如何实现这些语义(例如,是否使用缓存、写缓冲区或指令重排序)。实现层面由硬件设计者决定,只要最终的程序行为符合 SC 的语义即可。因此,SC 的定义是抽象的,关注结果等价性,而不是具体的实现机制。
PC一致性模型的案例
Recall that in SC, each load/store is ordered with regard to the following load/store. In other words,
the ordering of the following pairs is enforced: load → load, load → store, store → load, and
store → store. In the processor consistency (PC) model, the ordering between an older store and a
younger load (store → load) is relaxed. When a store has not performed, a younger load is allowed
to issue to the cache and even complete.
1. When a store has not performed, a younger load is allowed to issue to the cache.没有破坏 atomicity of memory accesses(这里指的是store的两个不可分割操作被分别看到,比store atomicity 概念更大) , 因为 load 还没拿到值,只是发出了请求(可取消、可延迟),对可见性没有实质影响load 没有在store前完成,在全局内存顺序中,load 出现在 store 之后2. When a store has not performed, a younger load is allowed to complete.可能破坏 store的原子性 , 如果 load 提前完成(即读到值),而 store 还没 perform,就可能读到了错误的旧值,破坏了 atomicity of memory accessesload 已经完成, load → store 出现在全局顺序.情况1 没破坏 SC 中的第一个约束, 情况2 破坏了 SC 中的第一个约束
尽管这样,但是这都是 relax.但是如果实现中只存在 情况1 这一种relax , 那么 实现还是符合 SC
那么他是基于什么的relax 呢 ?
需要肯定的是, 他是实现层面的 relax
因此此时我们就需要 一个 符合 SC 的 implementation-level 定义 // 书中没有这个概念,这里提出这个概念是为了好理解他们不完全相等
违背了 SC 的 implementation-level , 并不一定违背 SC 的 Semantic-level // 参考情况1
SC 的 implementation-level 定义
由于 SC 本身是一个语义模型,不直接指定实现细节,但其严格的语义要求对硬件实现施加了隐式的约束。为了满足 SC 的语义,硬件在实现层面必须做到以下几点(这是 SC 的 implementation-level 定义):
- 严格的程序顺序执行:
- 硬件必须确保每个处理器的内存操作(读/写)按照程序顺序发出和完成。
- 禁止指令重排序,包括:
- read-read 重排序
- read-write 重排序
- write-read 重排序
- write-write 重排序
- 立即的写操作可见性:
- 写操作必须立即对所有处理器可见(即写操作的结果立即传播到全局内存)。
- 禁止使用写缓冲区(write buffer)延迟写操作的传播,除非通过同步机制(如总线锁)确保立即可见。
- 全局一致的内存视图:
- 所有处理器必须对内存操作的顺序有一致的观察,相当于硬件维护一个全局的内存操作序列。
- 缓存一致性协议(如 MESI)必须保证写操作的传播是全序的(total order),例如通过总线序列化或全局广播。
- 同步机制:
- 硬件可能需要使用内存屏障(fence 指令)或总线锁来强制顺序。
- 推测执行(如分支预测或乱序执行)必须在提交时确保符合 SC 语义。
实现层面的例子:
- 在一个多核系统中,SC 的实现可能需要:
- 禁用写缓冲区,或者每次写操作后立即刷新(flush)写缓冲区。
- 使用全序广播协议(如 snoopy 协议),确保所有处理器看到相同的写操作顺序。
- 禁止乱序执行引擎(如现代 CPU 的乱序执行单元)对内存操作进行重排序。
- 例如,x86 架构的严格实现可能通过锁定总线或插入内存屏障(如
LOCK
前缀或MFENCE
指令)来实现 SC。 - 通常不会使用 store buffer(写缓冲区),或者如果存在 store buffer,其行为必须受到严格限制,以确保符合 SC 的语义要求。
- **SC 实现中是否会存在 store buffer?**- 在**严格的 SC 实现**中,通常**不存在 store buffer**,或者 store buffer 的行为被严格限制(如立即刷新),以确保写操作立即对所有处理器可见。- 在**优化的 SC 实现**中,可能有限制地使用 store buffer,但必须通过内存屏障或全序广播等机制确保写操作的立即可见性,符合 SC 语义。
- **原因**:Store buffer 的延迟传播可能导致写操作的可见顺序与程序顺序不一致,违反 SC 的全局顺序要求。
- **实际影响**:禁用或限制 store buffer 会增加写操作的延迟,降低性能,但这是 SC 严格语义的必要代价。
性能代价:
- SC 的实现通常效率较低,因为禁用重排序、写缓冲区和推测执行会增加延迟和降低吞吐量。
- 例如,写操作需要等待全局广播完成,可能会导致处理器停顿。