simple write-through invalidation protocol 如何满足缓存一致性的形式化定义

文章目录

  • A 缓存一致性的形式化定义
  • B simple write-through invalidation protocol 保证了几点
  • simple write-through invalidation protocol 保证的三个基准点解读
    • B1 :所有上总线的 写 会在 总线上串行化
    • B2 读能读到最新写入的值
    • B3 partial order
  • 三个基准点做了什么
    • 结论1(测试的等价性)
    • 要做到的事情
  • 三个基准点能保证 通过缓存一致性测试吗?

A 缓存一致性的形式化定义

  • 这里 讲了形式化定义,简述如下
// 其实这样描述有问题, 更严谨的说是 (实际跑出来的结果)集合A 属于 (假想全局序列跑出来的结果)集合B
构造一个 假想全局序列(针对同一地址)
	A1. 在全局序列中,保持该处理器本身的发出顺序
	A2. 读 返回最近写

B simple write-through invalidation protocol 保证了几点

// 针对同一地址
B1. 所有上总线的 写 会在 总线上串行化
B2. 读能读到最新写入的值
B3. 读写之间定义 partial order(涵盖了 B2 中的情况)

simple write-through invalidation protocol 保证的三个基准点解读

B1 :所有上总线的 写 会在 总线上串行化

-写串行化
	串行化访问基础
		假设在当前讨论中,所有内存操作都是原子的,即同一时间总线上只能有一个事务在进行,并且处理器会等待其事务完成后,才发起下一个内存操作。
		也就是说,一旦某个请求被放到总线上,包括数据响应在内的所有事务阶段都必须完成,其他处理器才可以发起下一个请求。

	几条假设
		**在只有一级缓存的系统中,可以合理地假设:失效操作(invalidation)会在总线事务期间应用到所有缓存,写操作也在此期间完成。**
		**我们还假设内存根据总线提供的顺序处理读写操作。**


	基础与几条假设得出的结论
		**因为每个嗅探缓存控制器在总线事务中执行失效操作,所以所有的失效都是按照总线顺序进行的。**
		**在写通协议中,所有写操作都会经过总线,并且一次只能有一个总线事务在进行,因此对某个地址的所有写操作会被按它们在总线上的顺序串行化(也就是所谓的“总线顺序”)。**


		即 
			写在 总线上串行化
			即 以 总线上 写的顺序 推断出(=>) 全局序列 中的顺序

B2 读能读到最新写入的值

	**处理器通过读操作“观察”写操作的结果。**
	**但是,对某个地址的读操作并不总是被完全串行化,因为命中缓存的读操作可以独立地并发进行,并不会生成总线事务。**

	即读不总是上总线,更别说在总线上串行化

	**为了理解读操作如何插入写操作的串行顺序中,并保证所有处理器观察到相同的写顺序(即写序列化),我们看一个例子。**
	Sample1:未命中
	**一个发生在总线上的读(即读未命中)会和写操作一起被总线串行化,因此它会获取该地址上“最近一次写入”的值(按照总线顺序)。**
	Sample2:命中
	**唯一不会出现在总线上的内存操作是“读命中”。**
	这种情况下,读命中的值要么来自 同一个处理器最近一次对该地址的写 ,要么来自 距它(按程序顺序)最近一次的读未命中时获取的值 。
	**因为这两个值的来源都曾出现在总线上,所以即使是读命中,也能看到符合总线一致性顺序的值。**
	
	即 读能读到最新写入的值
		读如果上总线,  则 在总线上和写一起串行化, 则会读到最近一次写入的值
	    读如果不上总线, 则仍会读到最近一次写入的值
	即 读总是可以(真实地或者假想地)上总线
		读如果上总线  , 则 在总线上和写一起串行化 , 可以根据 partial order 中 point 2 来 插入
	    读如果不上总线, 则 可以假想在总线上插入一次读 , 可以根据 partial order 中 point 4 来 插入

B3 partial order

  • 程序顺序 推断 在 全局序列中的顺序
1. **若两个内存操作来自同一处理器,并在程序顺序上后发,则(在全局序列中)后者在前者之后。**
  • 总线事务顺序 推断 在 全局序列中的顺序
2. 若某次读操作生成的总线事务在某次写事务之后,则这个读操作在该写之后。
3. 若某次写生成的总线事务在某次读或写之后,则该写在该操作之后。
4. 如果某次读是命中(未上总线),且其后没有其他总线事务分隔它与后续某次写操作,则该写操作可以视为在该读之后。
5. A在B之后, C在B之后 ,那么C在A之后

三个基准点做了什么

结论1(测试的等价性)

凭借 B1 和 B3 和 B2(在全局顺序上插入假想的读) 可以 构造出一个假想全局序列, 且能 满足 A1
B2 满足了 A2

缓存一致性测试的本质是验证系统是否满足形式化定义(即您最初描述的 A ⊆ B 条件)。
三个基准点 B1+B2+B3 直接对应形式化要求:

  • B1 → 提供全局序列骨架(满足A1的程序顺序)
  • B2 → 确保读值正确(满足A2)
  • B3 → 允许将所有操作排列成全序(构造B的基础)

结论
任何满足 B1+B2+B3 的系统,其实际运行结果 A 必然属于形式化结果集 B,因此必定通过一致性测试

要做到的事情

在 B1、B2、B3 的限制 下 构造 假想全局序列(global order)

形式化定义的要素 Simple Write-Through Protocol 对应保证的点
1. 实际运行结果 A 由实际执行得到的每个 CPU 的操作、其 cache 命中/失效行为决定
2. 合法的串行序列 B 构造方式依赖于:写串行化(B1)、读的可排序(B2)、partial order 可拓展为全序(B3)
3. A ⊆ B 的判定 嗅探协议通过上述机制,确保所有实际执行结果 A 都可以映射到某个合法的串行顺序 B 中

三个基准点能保证 通过缓存一致性测试吗?

,就是靠三个基准点保证的.
	他虽然 保证的 比较 形式化,"保证了在假想全局序列中的顺序", 而没说如何实现
	但是 如果要实现 这种保证, 则必须要做些努力
	但是这种形式化的保证,足可以保证通过 缓存一致性测试,**理论层面**:B1+B2+B3 是缓存一致性的**充分条件**(Sufficient Conditions),无需额外约束。  

**只要协议严格满足 B1(写串行化)、B2(读最新值)、B3(部分有序可扩展为全序),它一定能通过任何缓存一致性测试。**  
形式化保证是测试的理论根基,而三个基准点正是这一根基的具体化。

你可能感兴趣的:(verilog,缓存一致性协议)