Cache一致性

关于Cache,我感觉通过这门课程学习到的内容可能还不够。我现在思考Cache读Memory有点像思考Memory读SSD。

  • Cache每次都需要从Memory读64B,而内存读SSD每次都会读4KB
  • 内存有带宽bandwidth,而SSD也有限制不过叫IOPS。

而且现在主要还都是再讲shared Memory的Cache一致性,我其实更想关注uniform Memory的Cache一致性。

image-20221126081436275

单核cpu的读写Cache

image-20221126081621618

  • Cache也有分为write though和write back,一般提到的都是write back

shared memory multo-processor

  • 任何processor从address X处读取的value值应该是最近一次任意processor写的值

单核CPU系统的Cache一致性

image-20221126082643684

即使是single cpu system也有可能出现Cache的不一致性。有可能DMA和network card向内存中写了数据,而CPU没有及时flush Cache就会出现不一致性。

解决办法

  • OS直接将这个shared buffers的page标记为不可Cache
  • 显式地flush Cache,当IO完成时

一致性定义

这里的一致性和我当时学操作系统这门课程接触到的一致性很像啊。

所以这里重温一下当时学的线性一致性:

image-20221126084442097

client 发起请求也就是inv,client收到server的回复resp

背景知识介绍完了,怎样才能达到线性一致?这就要求 Server 在执行 Operations 时需要满足以下三点:

  1. 瞬间完成(或者原子性)
  2. 发生在 Inv 和 Resp 两个事件之间
  3. 反映出“最新”的值

这里的最新很有意思,因为操作时原子性的,那么client A读取x可能发生在client B写A之前也可能发生在之后。但是一致性语义的核心就是,一旦client A读取到了最新的write,那么发生在client A这次读操作的任意client读操作(也就是其他client发出inv在client A这次收到resp之后),一定可以会看到最新的值。

回到内存的一致性语义:

image-20221126083638959

  • 所有processor对于内存的并行操作,可以被序列化为一个processor的操作
  • 单个processor的对内存的任何操作都是顺序的
  • 读取操作返回的是该内存地址最近一次write的结果。

实现Cache一致性,这里教授主要讲了一种基于snoop的硬件实现算法:

image-20221126090659580
image-20221126090731206

可以用状态机描述Cache状态的变化

image-20221126090751410

原文地址:http://www.cnblogs.com/kalicener/p/16926896.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性