Cache一致性
关于Cache,我感觉通过这门课程学习到的内容可能还不够。我现在思考Cache读Memory有点像思考Memory读SSD。
- Cache每次都需要从Memory读64B,而内存读SSD每次都会读4KB
- 内存有带宽bandwidth,而SSD也有限制不过叫IOPS。
而且现在主要还都是再讲shared Memory的Cache一致性,我其实更想关注uniform Memory的Cache一致性。
![image-20221126081436275](https://image-2021-wu.oss-cn-beijing.aliyuncs.com/image/image-20221126081436275.png)
单核cpu的读写Cache
![image-20221126081621618](https://image-2021-wu.oss-cn-beijing.aliyuncs.com/image/image-20221126081621618.png)
- Cache也有分为write though和write back,一般提到的都是write back
shared memory multo-processor
- 任何processor从address X处读取的value值应该是最近一次任意processor写的值
单核CPU系统的Cache一致性
![image-20221126082643684](https://image-2021-wu.oss-cn-beijing.aliyuncs.com/image/image-20221126082643684.png)
即使是single cpu system也有可能出现Cache的不一致性。有可能DMA和network card向内存中写了数据,而CPU没有及时flush Cache就会出现不一致性。
解决办法
- OS直接将这个shared buffers的page标记为不可Cache
- 显式地flush Cache,当IO完成时
一致性定义
这里的一致性和我当时学操作系统这门课程接触到的一致性很像啊。
所以这里重温一下当时学的线性一致性:
![image-20221126084442097](https://image-2021-wu.oss-cn-beijing.aliyuncs.com/image/image-20221126084442097.png)
client 发起请求也就是inv,client收到server的回复resp
背景知识介绍完了,怎样才能达到线性一致?这就要求 Server 在执行 Operations 时需要满足以下三点:
- 瞬间完成(或者原子性)
- 发生在 Inv 和 Resp 两个事件之间
- 反映出“最新”的值
这里的最新很有意思,因为操作时原子性的,那么client A读取x可能发生在client B写A之前也可能发生在之后。但是一致性语义的核心就是,一旦client A读取到了最新的write,那么发生在client A这次读操作的任意client读操作(也就是其他client发出inv在client A这次收到resp之后),一定可以会看到最新的值。
回到内存的一致性语义:
![image-20221126083638959](https://image-2021-wu.oss-cn-beijing.aliyuncs.com/image/image-20221126083638959.png)
- 所有processor对于内存的并行操作,可以被序列化为一个processor的操作
- 单个processor的对内存的任何操作都是顺序的
- 读取操作返回的是该内存地址最近一次write的结果。
实现Cache一致性,这里教授主要讲了一种基于snoop的硬件实现算法:
![image-20221126090659580](https://image-2021-wu.oss-cn-beijing.aliyuncs.com/image/image-20221126090659580.png)
![image-20221126090731206](https://image-2021-wu.oss-cn-beijing.aliyuncs.com/image/image-20221126090731206.png)
可以用状态机描述Cache状态的变化
![image-20221126090751410](https://image-2021-wu.oss-cn-beijing.aliyuncs.com/image/image-20221126090751410.png)