zoukankan      html  css  js  c++  java
  • Rocket

     https://mp.weixin.qq.com/s/Dyb1XipJtdhGa9mktXXjCg

     
    简单介绍Metadata的实现。
     
     
    1. 基本介绍
     
    Metadata是一个Bundle,即数据结构或者说变量类型。其中存放着Cache的状态,并且跟踪命令执行后状态的变化情况。
     
    2. ClientStates
     
    定义Client状态相关的方法:
     
    1) Cache相关状态
     
    Cache节点的状态,是Nothing/Branch/Trunk/Dirty:
     
    2) 权限判断
     
    a. hasReadPermission:是否具有读权限;
    b. hasWritePermission:是否具有写权限;
     
    3. MemoryOpCategories
     
    定义内存操作的类别:
     
    1) 类别
     
    用来定义操作的写相关的信息,是一个元组:
    a. 是否真要写;
    b. 是否想要写;
     
    2) 三类
     
    a. wr:Write,写操作;
    b. wi:Write Intent,意图要写;
    c. rd:Read,读操作;
     
    3) 分类
     
     
    判断命令的类别:
     
    4. ClientMetadata
     
    ClientMetadata是一个Bundle,即是一个数据结构,其中存放了实际的状态信息:
     
    1) 相等判断
     
     
    2) 是否存在缓存内容
     
     
    3) growStarter
     
    根据命令的分类和现在的状态,来确定是否命中和下一个状态:
     
    首先对命令进行分类,其次在查找表中进行查找。
     
    1) 命令命中Cache的情况
     
    返回是否命中即元组的第一个参数为true。
     
    A. 命令分类为读取rd
     
    读取之后状态不变:
     
    B. 命令分类为想写wi
     
    想写但没有写,状态不变:
     
    另外,Branch状态只可读而不可写,所以这里只有Trunk/Dirty两种状态。
     
    C. 命令分类为要写wr
     
    写了之后就变为了Dirty状态:
     
    2) 命令未命中Cache的情况
     
    返回是否命中即元组的第一个参数为false。
     
    A. 命令分类为读取rd
     
    读取之后,状态从Nothing变为了Branch:
     
    B. 命令分类为想写wi
     
    想写需要变为Trank状态:
     
    C. 命令分类为要写wr
     
    真写亦需变为Trunk状态:
     
    4) growFinisher
     
    第一个参数是命令;第二个参数是Grant的param域的值。
     
    Grant的param是Cap即赋能的意思:
     
    a. 若要读,可以toB/toT;读不改变状态;
    b. 若要写,只能toT,想要写也不改变状态;
    c. 若真写,只能toT,真写改变状态为Dirty,包含脏数据;
     
    5) onAccess
     
    判断当前权限是否能满足访问请求:
     
    6) onSecondaryAccess
     
    连续处理两条命令的情况:
    a. needs_second_acq:第二条命令是否需要先执行Acquire操作获取权限;这里的定义是如果第一条命令不是WriteIntent,而第二条命令是WriteIntent,则需要。命令的分类只有读写两种,第二条命令不是写便是读,第一条命令也是这样。所以若第二条命令是读,经过第一条命令之后,就不需要再额外获取权限。
    b. hit_again:当前权限能够满足两条命令的需要;
    c. dirties:第二条命令是否要立即写;
    d. biggest_grow_param:获取到的最大权限;
    e. dirtiest_state:确定要获取的最大权限;因为growStarter返回的第二个值既可能是下一个状态(命中),也可能是要赋权的参数(未命中),所以这里的dirtiest_state需要结合needs_second_acq和hit_again两个的值使用;
    f. dirtiest_cmd:哪一条命令获取的最大权限;
     
    7) onGrant
     
    命令触发Grant之后的状态:
     
    8) shrinkHelper
     
    Probe操作降权后的状态:
    举例:
    Probe赋权为toN,当前状态为Dirty;返回值为:
    a. hasDirtyData:true,包含脏数据;
    b. resp:权限从Trunk降为Nothing,即TtoN;
    c. next:下一个状态为Nothing;
     
    9) cmdToPermCap
     
    把命令转换为要赋予的权限:
     
    10) onCacheControl
     
    返回Cache控制命令的处理情况:
     
    11) onProbe
     
    返回Probe消息的处理情况:
     
  • 相关阅读:
    mysql增量同步到greenplum
    c笔记06--编译与作用域
    C笔记05-选择顺序结构,关系与相等,优先级和结合性
    C笔记02-C数据类型与数据类型转换
    C笔记01-C简介与补码
    jQuery属性操作之.val()函数
    jQuery属性操作之.attr()
    jQuery笔记: 基本概念与jQuery核心
    笔记: js构造函数与原型
    布尔运算符
  • 原文地址:https://www.cnblogs.com/wjcdx/p/11440302.html
Copyright © 2011-2022 走看看