PC_Cache和主存的映射方式

本文详细探讨了计算机内存管理中的Cache映射技术,包括直接映射、全相联映射和组相联映射。直接映射方式简单但灵活性不足,全相联映射提供更高的命中率但成本较高,组相联映射则是两者的折中。地址映射涉及到主存地址的拆分,标记位和块号的计算,以及如何通过取模运算确定Cache块号。通过对不同映射方式的分析,揭示了它们在性能和实现复杂性之间的权衡。
摘要由CSDN通过智能技术生成

地址映射

  • cache行中的信息是主存中某个块的副本,地址映射是指:
    • 主存地址空间映射到cached地址空间🎈
      • 映射函数 y = f ( x ) y=f(x) y=f(x)
        • x x x是某个主存块的地址
        • y 是 x 采 y是x采 yx用映射规则 f f f后对应到的缓存块号
    • 把存放在主存中的信息按照某种规则装入cache
    • 在cache中要为每一个cache块加一个标记T(tag)
      • 标记指明它对应于主存中的那个块的副本
      • 相当于主存中块的编号
    • 为了说明cache行中的信息是否有效,每个cache行还有一个有效位V(vality)
    • 地址映射方式有3种
      • 直接映射
      • 全相联映射
      • 组相联映射

取模的规律🎈

( x n + y ) % n = y % n 或 若 有 x % n = 0 ; 则 ( x + y ) % n = y % n (xn+y)\%n=y\%n \\或 \\ 若有x\%n=0;则(x+y)\%n=y\%n (xn+y)%n=y%nx%n=0;(x+y)%n=y%n

    • x = x 1 + x 2 x=x_1+x_2 x=x1+x2
    • p = x % n p=x\%n p=x%n
    • s 1 = x 1 / / n s_1=x_1//n s1=x1//n
    • s 2 = x 2 / / n s_2=x_2//n s2=x2//n
    • 约定//表示整除(取整数部分,表示向下取整)
    • q 1 = x 1 % n q_1=x_1\%n q1=x1%n
    • q 2 = x 2 % n q_2=x_2\%n q2=x2%n
    • q = q 1 + q 2 q=q_1+q_2 q=q1+q2
    • r = q % n r=q\%n r=q%n
    • p , q 1 , q 2 ∈ [ 0 , n − 1 ] p,q_1,q_2\in[0,n-1] p,q1,q2[0,n1]
      • q ∈ [ 0 , 2 n − 2 ] q\in[0,2n-2] q[0,2n2]
    • p 与 q 的 关 系 ? p与q的关系? pq?
      • 没有一般性断论
    • p 与 r 的 关 系 ? p与r的关系? pr?
      • p = r p=r p=r
      • x % n = ( x 1 + x 2 ) % n = ( x 1 % n + x 2 % n ) % n x\%n=(x_1+x_2)\%n=(x_1\%n+x_2\%n)\%n x%n=(x1+x2)%n=(x1%n+x2%n)%n
  • 分析:
    • 例:
      • 取 x = 9 ; x 1 = 4 , x 2 = 5 , n = 3 取x=9;x_1=4,x_2=5,n=3 x=9;x1=4,x2=5,n=3
      • p = 9 % 3 = 0 p=9\%3=0 p=9%3=0
      • q = q 1 + q 2 = 1 + 2 = 3 q=q_1+q_2=1+2=3 q=q1+q2=1+2=3
      • q % 3 = 0 q\%3=0 q%3=0
      • p = q % 3 p=q\%3 p=q%3

  • 已 知 M % C = 0 ; M , C > 0 已知M\%C=0;M,C>0 M%C=0;M,C>0
    • 则[0,M-1]范围内,最大的可以被C整除的数y是多少?
      • 设 y = M − p , y ∈ [ 0 , M − 1 ] 设y=M-p,y\in[0,M-1] y=Mp,y[0,M1]
    • 分析:
      • 根据前面讨论的规律
      • r= ( M − p ) % C = p % C (M-p)\%C=p\%C (Mp)%C=p%C
      • 为了使得M-p最小,且使得上式(r=0)
      • 取p=0,但是不满足 [ 0 , M − 1 ] [0,M-1] [0,M1]
      • 退一步,再取 p = C p=C p=C,满足所有要求
    • 所以y=M-C是所求的值

地址和块号的转换🎈

地址和块号

  • 假设给定内存(单元)地址A,

  • 如果计算机按字节编址,cache块大小为L字节,那么地址A(从0开始编址)对应的主存块号j为

    • j = A × B y t e L × b y t e = A B j=\frac{A\times{Byte}}{L\times{byte}}=\frac{A}{B} j=L×byteA×Byte=BA
  • 地址区间0 ∼ \sim A包含的内存存储单元数为A+1

    • 地址0对应内存中的第1个存储单元(第1个字节)

    • 地址1对应第2个存储单元

    • 表格形式

      地址值(索引)(从0开始编号)内存单元序号(从1开始计数)
      01
      12
      23
      AA+1

组号和块号

  • 设每个组包含R个块,共有Q个组,从0开始编址

  • 组号(从0编址)组内包含的块号范围(从0编址)
    0 [ 0 , R − 1 ] [0,R-1] [0,R1]
    1 [ R , 2 R − 1 ] [R,2R-1] [R,2R1]
    x x x [ x R , ( x + 1 ) R − 1 ] [xR,(x+1)R-1] [xR,(x+1)R1]
    Q − 1 Q-1 Q1 [ ( Q − 1 ) R , Q R − 1 ] [(Q-1)R,QR-1] [(Q1)R,QR1]
    • 相邻组间的首尾块编号是连续的
    • 可以利用上一个分组内的最后一个块的编号+1得到下一组的组内首个块的编号

  • 例如,按字节编址的计算机,某个内存单元地址A=3200(十进制)
    • cache块大小为64B
    • 则A对应的块号(从0开始编址)为
    • j = 3200 B 64 B = 50 j=\frac{3200B}{64B}=50 j=64B3200B=50

直接映射

逻辑结构示意图

在这里插入图片描述

    • 主存共有 M = 2 m M=2^m M=2m个字块,
    • cache共有 C = 2 c C=2^c C=2c个字块
    • 如果从0开始编号,则对应的编号范围为
      • [ 0 , M ] [0,M] [0,M]
      • [ 0 , C ] [0,C] [0,C]
    • 也就是说,M,C可以表示主持和cache的容量
    • 区分M,m;C,c大小写
      • 区分不同缓存块用c位 二进制数来编码区分
      • 主存块用m位二进制数来区分
    • m > > c ( m 远 远 大 于 c ) m>>c(m远远大于c) m>>c(mc)
      • M C = 2 m 2 c = 2 m − c ∈ Z , m , c ∈ Z \frac{M}{C}=\frac{2^m}{2^c}=2^{m-c}\in{\mathbb{Z}},m,c\in\mathbb{Z} CM=2c2m=2mcZ,m,cZ
    • 下面提到的b位则是字块内部的存储单元的地址
  • 直接映射关系式为

    • i = j m o d    C = j % i i = j\mod C=j\%i i=jmodC=j%i

    • 其中(块号理解为地址字段,从0开始编号)

      • i 为 c a c h e 块 号 i为cache块号 icache
        • i ∈ [ 0 , C − 1 ] i\in[0,C-1] i[0,C1]
      • j为主存块号
        • j ∈ [ 0 , M − 1 ] j\in[0,M-1] j[0,M1]
      • C为缓存块数(C= 2 c 2^c 2c)
        • c表示缓存地址的高位部分(缓存块的块号(二进制串))
    • i 是 j 的 函 数 i是j的函数 ij
      i = f ( j ) = f ( j , C ) = j m o d    C i=f(j)=f(j,C)=j\mod{C} i=f(j)=f(j,C)=jmodC

  • 可见

    • 每个主存块只与 一个缓存块相对应

    • 直接映射法是一种固定的映射方法(僵硬而不灵活的)方式

    • 映射结果表明 每个缓存块对应 若干个主存块

    • 根据映射规则f

      • 可 计 算 f 的 反 函 数 f − 1 可计算f的反函数f^{-1} ff1

      • j = f − 1 ( i ) = C j=f^{-1}(i)=C j=f1(i)=C

      • 缓存块号主存块号Note
        0 0 , C , 2 C , ⋯   , M − C 0,C,2C,\cdots,M-C 0,C,2C,,MC M = 2 m ; C = 2 c M=2^m;C=2^c M=2m;C=2c
        1 1 , C + 1 , 2 C + 1 , ⋯   , M − C + 1 1,C+1,2C+1,\cdots,M-C+1 1,C+1,2C+1,,MC+1
        C-1 C − 1 , ⋯   , M − 1 C-1,\cdots,M-1 C1,,M1
      • Note:

        • 上面说到, C = 2 c C=2^c C=2c, M = 2 m M=2^m M=2m; M C = m − c \frac{M}{C}=m-c CM=mc,当然,m,c都是正整数(m>c),它们的差值也是正整数

          • 这意味着,主存的块数是cache块数的整倍数;
            • (从这个语境下看,主存的最后一块会恰好的被映射到cache上的最后一块cache块.)
        • 又因为,我们是从0开始计数的,所以最后一块主存块 2 m − 1 2^m-1 2m1将被映射到cache块的最后块 C − 1 C-1 C1上.

        • 或者从周期(函数)的角度(周期为T=C),可以方便的根据周期,把缓存块号最为该映射上结果序列上的第一个主存块号,再依次+C,得到映射到该cache块的主存块序列(比如,0,C,2C,3C,…, 2 m − C 2^m-C 2mC)

地址结构

  • 主 存 地 址 n = ( t + c ) + b 主存地址n=(t+c)+b n=(t+c)+b
    • 主存字块标记t位
    • cache字块地址c位
    • 字块内地址b位
    • 其 中 , m = t + c ; 其中,m=t+c; ,m=t+c;
    • m位还是用来编址区分主存块的,
    • 只不过,这里将高m位进一步划分为t+c位
    • 最高t位作为标记位
    • 实际上,标记位数是通过 t = m − c t=m-c t=mc来确定的(m和c分别是主存含有的字块数和cache含有的字块数)
  • cpu将需要访存的地址(主存地址用映射规则函数解析这个地址,得到一个对应与cache中的某个cache块的地址AddrCache)
    • 然后cpu根据解析得到的地址(AddrCache)在Cache中找到对应的块判断是否命中有效数据字块
    • 有效位是在cache中的比较器(t位)处做判断,来判读cache的AddrCache位置的字块是否保存着有效的数据
    • 如果是,那么就是命中,本次访问数据不需要访问主存储器(cache满足需求)

cache的总容量

  • cache的总容量包括:
    • 存储容量 S d a t a S_{data} Sdata
    • 标记阵列容量 S t e r m s S_{terms} Sterms
      • 根据具体的要求计算标记项中的成分
  • S = S t e r m s + S d a t a S=S_{terms}+S_{data} S=Sterms+Sdata
标记项和标记矩阵
  • 每个cache行都对应一个标记项,包括以下字段

    • 有效位

    • 标记位

    • 一致性维护位(也叫脏位/清浊位)

    • 替换算法控制位

  • 直接映射方式中,每行的标记项单独一行

  • 组相联映射方式中,每组中的r行排成一个行(包含r个项)

    • r ⩾ 2 r\geqslant{2} r2时, q q q个组构成一个标记项的二维阵列( r × q r\times{q} r×q矩阵)
    • r = 1 r=1 r=1时,相当于直接映射方式(表现为 c × 1 c\times{1} c×1矩阵)
cache行验证容量🎆
  • 为了便于描述包括标记项和cache行存储容量的总和,称其为cache行验证容量 L t + d L_{t+d} Lt+d
  • 不过也没必要用这个概念
缓存块的标记位/类🎈
  • 用于记录(和cache块建立了对应关系的)主存块的标记(身份标识),可以用来检测冲突/判断命中(配合有效位)
  • 不妨将映射到同一个cache位置的主存块记为同一类(class)
    • 对于直接映射而言,一个类中最多有 2 t 2^t 2t个元素
    • 而cache的每一个块都表示一个
    • 地址中的高t位可以用来区分中的不同的[成员]
      • 其后的c位用来计算某个主存块到底属于哪一个
高位地址t+c
  • 在缓存中 主存地址高m位被分成两部分:

    • 低c位是指Cache 的字块地址,

    • 高t位 ( t = m − c ) (t = m-c) (t=mc)是指 主存字块标记tag ,它被记录在 建立了对应关系的缓存块的“标记"位中。

      • 这里 t = m − c t=m-c t=mc是指( 2 t = 2 m 2 c ) 2^t=\frac{2^m}{2^c}) 2t=2c2m);
      • 主存块数是cache块数的 2 t 2^t 2t倍(这个倍数用二进制数表示恰好需要t位)
    • 缓存接到CPU送来的 主存地址 后,只需根据 中间c个bit 的字段(假设为00…01)找到 Cache字块1(cache行1)

      • 然后根据字块1的“标记”是否与主存地址的高t位相符 来判断( t位比较器硬件做的这个事情)
      • 之所以这么做,是因为,一块cache块,会被多块主存块映射
        • 譬如上表格中所示,0号cache块可以被 0 号 , C 号 , 2 C , . . 2 m 0号,C号,2C,..2^m 0,C,2C,..2m,
        • 为了区分这些来自主存的且映射到同一个cache块的不同的主存块,这就依赖于预保留出来的前t位来做一个块身份判断
        • 但是考虑到某些情况下(比如机器初始启动,cache中的内容是无效的(空或者无意义的)),需要一个有效位来判断有效性
    • 若符合,且有效位为“1”(即成功命中)(有效位 用来识别Cache存储块中的数据是否有效,因为有时Cache中的数据是无效的,❤️

      • 例如,在初始时刻Cache应该是“空”的,其中的内容是无意义的(这样,即使判断标记和主存地址一致,取出的数据也是无意义的(标记不是数据本身),

      • 有效位为1,表示该Cache 块已和主存的某块建立了对应关系(即已命中),则可根据b位地址从Cache中取得信息;

      • 若不符合,或有效位为“0”(即不命中),则 从主存读入新的字块来替代旧的字块,同时将信息送往CPU,并修改cache“标记”。

        • 如果原来有效位为“0”,还得将有效位置成“1”。
      • 此外,高t位描述了不同主存块映射到同一个cache块的冲突发生的难易程度

      • t位数越高,冲突越容易发生

特点

  • 直接映射方式的缺点是不够灵活,因每个主存块只能固定地对应某个缓存块,
  • 即使缓存内还空着许多位置也不能占用,使缓存的存储空间得不到充分的利用。
  • 此外,如果程序恰好要重复访问对应同一缓存位置(cache块)不同主存块,就要不停地进行替换,从而降低命中率

小结

  • 计算机的主机包括cpu和存储器

  • cache作为一种高速中间设备主要用来提升性能(然而它不是运行中的必要一环)

  • cpu根据数据(比如操作数)的地址,到对应地址位置去取数据

    • 这时用到的主存地址可以分为三部分t+c+b
    • 前m=(t+c)位可以精确到主存中的某个块
    • 后b位可以进入到指定的主存块中进行字(节)的定位
  • 没有cache的时候,cpu就直接到主存的正确的 地址处去取数据

  • 现在有了cache,cpu会将这个原本要到主存访问的(主存)地址和cache中做对比(主要根据上述主存地址划分中的 中间c位字段计算得到对应映射的cache行(块);

    • 再进行对比高t位的对比(如果对比结果发现相同,且对应的cache块的数据部分中的数据是有效的(根据有效位是否为1判定)(这时视为命中),那么就不用在进一步到主存中去取数,直接将命中的cache块中的数据取出来使用
优点
  • 实现简单,只需 利用主存地址的某些位直接判断,即可确定所需字块是否在缓存中
缺点
  • 直接映射方式的缺点是不够灵活,因每个主存块只能固定地对应某个缓存块,即使缓存内还空着许多位置也不能占用,使缓存的存储空间得不到充分的利用。
  • 此外,如果程序恰好要 重复访问对应 同一缓存块位置不同主存块,就要不停地进行替换,从而降低命中率。
🥰03/07/2022 20:03:441646656842434.png
1646657005307.png

全相联映射🎈

  • 全相联映射允许主存中每一字块映射到Cache中的任何一块位上(任意性)。

  • 这种映射方式可以从已被占满的Cache中替换出任一旧字块。

  • 显然,这种方式灵活,命中率也更高缩小了块冲突率。

  • 与直接映射相比,它的 主存字块标记从t位增加到 t+c

  • 这就使Cache“标记”的位数增多,而且访问Cache时主存字块标记需要和Cache的全部“标记”位进行比较,才能判断出所访问主存地址的内容是否已在Cache 内(由于任意性)

    • 这种比较通常采用“按内容寻址”相联存储器来完成。
  • 总之,这种方式所需的逻辑电路甚多,成本较高,实际的Cache还要采用各种措施来减少地址的比较次数

映射逻辑结构示意图

1646657418935.png

  • 每个主存块都可能映射到任意一个cache块(可以占满整个cache )

地址结构

  • 主存地址结构:
    • 主存字块标记: m = t + c m=t+c m=t+c
      • 相比于直接映射,主存地址的高m位全部被用来作为标记位
    • 字块内地址: b b b
1646657946575.png1646657998977.png
  • 1646657946575.png

  • 1646657998977.png

CAM

  • CAM;Content-addressable memory

    • 内容可寻址存储器
    • 内容可寻址存储器cam(content-addressable memory)以内容进行寻址的存储器,是一种特殊的存储阵列ram。
    • 它的主要工作机制就是将一个输入数据项与存储在cam中的所有数据项自动同时进行比较,判别该输入数据项与cam中存储的数据项是否相匹配,并输出该数据项对应的匹配信息。
  • Content-addressable memory (CAM) is a special type of computer memory used in certain very-high-speed searching applications.

  • It is also known as associative memory or associative storage and compares input search data against a table of stored data, and returns the address of matching data.[1]

    • CAM is frequently used in networking devices where it speeds up forwarding information base and routing table operations.

    • This kind of associative memory is also used in cache memory. In associative cache memory, both address and content is stored side by side. When the address matches, the corresponding content is fetched from cache memory.

组相联映射🎈

  • cache分组-组相联映射: 是对直接映射和全相联映射的一种折中
    • 可以理解为
      • 组间直接映射
      • 组内全相联

cache分组

  • 它把Cache分为Q组🎈,每组有R块

    • 继承前面的上下文中意思

    • C = 2 c C=2^c C=2c,表示缓存块数

    • M = 2 m M=2^m M=2m,表示主存器包含的块数

    • q , r q,r q,r满足以下条件:

    • Q = 2 q Q=2^q Q=2q;

    • R = 2 r R=2^r R=2r

      • q = log ⁡ 2 Q q=\log_{2}Q q=log2Q
      • r = log ⁡ 2 R r=\log_2{R} r=log2R
      • 容易知道,q位,r位二进制数分别可以表示出不同Q种,R种编码
      • 体现在地址中的q位,r位
    • C = Q R c = q + r C=QR \\ c=q+r C=QRc=q+r

映射函数

  • i = f ( j , Q ) = j m o d    Q 为 了 和 直 接 映 射 做 区 分 , 也 可 以 将 i 写 为 I I = f ( j , Q ) = j m o d    Q i = f(j,Q)=j\mod Q \\为了和直接映射做区分,也可以将i写为I \\I=f(j,Q)=j\mod Q i=f(j,Q)=jmodQ,iII=f(j,Q)=jmodQ

  • j为主存的块号

  • i为主存块号j映射到cache后的cache 组号

  • 某一主存块号j按照上述映射函数 f ( j , Q ) f(j,Q) f(j,Q) ,将其映射到缓存的 第i组

  • Q < C Q<C Q<C,模变小了,直接相联的部分变得容易重合

    • 组间采用直接映射有较高的组间冲突率和较低的cache组利用率
    • 组内采用全相联映射,可以具有较低的组内冲突率和较高的cache组内利用率

映射逻辑结构示意图

1646657717835.png

  • 容量为C块的cache被分为Q组
    • 此处提到的常量和cache分组提到的含义是一致的
    • C = 2 c C=2^c C=2c
    • Q = 2 q Q=2^{q} Q=2q
      • 如果给定每cache块小组包含的cache块数R(cache分组大小为R)
      • R = 2 r R=2^r R=2r
      • 那 么 Q = C R ; 即 q = c − r 那么Q=\frac{C}{R};即q=c-r Q=RC;q=cr
  • 分组编号从0开始编址,所有
    • i ∈ [ 0 , Q − 1 ] = [ 0 , 2 q − 1 ] = [ 0 , 2 c − r − 1 ] i\in[0,Q-1]=[0,2^{q}-1]=[0,2^{c-r}-1] i[0,Q1]=[0,2q1]=[0,2cr1]
    • j ∈ [ 0 , M − 1 ] = [ 0 , 2 m − 1 ] j\in[0,M-1]=[0,2^{m}-1] j[0,M1]=[0,2m1]
    • C = Q R ; c = q + r C=QR;c=q+r C=QR;c=q+r
      • Q ∈ [ 1 , C ] Q\in[1,C] Q[1,C]
        • q ∈ [ 0 , c ] q\in[0,c] q[0,c]
      • R ∈ [ 1 , C ] R\in[1,C] R[1,C]
        • r ∈ [ 0 , c ] r\in[0,c] r[0,c]

地址结构

  • 对比直接映射方式的地址结构描述
  • 高m位
    • 组地址
      • q位(q=c-r)
    • 主存字块标记
      • s位
      • s=m-q
      • s=t+r
    • m = s + q m=s+q m=s+q
  • 字块内地址
    • b位

特点

  • 和直接映射类似,每个主存块会被映射到固定的cache块分组(包含若干个cache块的小组)
    • 直接映射则是映射到具体的cache块
    • 相比于直接映射,组相联映射会映射到cache分组
  • 组相联的含义:
    • 主存的某一个字块按照模Q映射到Cache某个分组 I I I的任意一个字块k中
      • I = j m o d    Q I=j\mod{Q} I=jmodQ
      • k ∈ [ 0 , R − 1 ] k\in[0,R-1] k[0,R1]
        • 设组内字块地址(字段部分)从0开始编址
极端组相联映射
  • r r r表示cache分组的大小(块数)

  • r = 0 r=0 r=0时,退化为直接映射(分组数Q=C,每个分组仅包含 R = 2 0 = 1 R=2^{0}=1 R=20=1个cache块🎈)

    • q = log ⁡ 2 Q = log ⁡ 2 C = c q=\log_2{Q}=\log_2{C}=c q=log2Q=log2C=c
    • s=t
  • r = c r=c r=c时,退化为全相联映射(分组数Q=1,该组包含了 R = 2 c R=2^c R=2c个(即,所有)cache块)

    • q = log ⁡ 2 Q = log ⁡ 2 1 = 0 q=\log_2{Q}=\log_2{1}=0 q=log2Q=log21=0
    • s=t+c
  • 结合地址结构分析即可得出上述结论

cpu访存过程

  • 采用组相联映射的情况下,cpu的访存过程:
    • 首先根据访存地址中间的组号(q位),找到对应的cache组号
    • 将对应Cache组中每个cache行(块)的标记和主存地址的高位标记进行比较;
      • 如果其中某一路比较匹配上(相等),有效位V=1
      • 那么cache命中
        • 根据主存地址中的块内地址,在对应的cache行中存取信息
      • 否则,不命中
        • cpu需要访问主存,读出地址改地址所在的一块信息,并调入到某个cache分组中的某个cache块
        • 将有效位置1(1表示有效)
        • 设置标记(位串)
        • 再将地址中的内容送往cpu

三种映射方式总结🎈🎈

  • 直接映射方式全相联映射方式
    映射时间开销
    额外空间消耗
    命中率
  • 组相联映射方式的性能和开销介于直接映射方式和全相联映射方式

例🎈

  • 假设计算机的主存地址空间大小为256MB
    • 按字节编址
    • 数据cache有8个cache行
      • 指令cache此处忽略
    • 行长为64B

cache容量问题

  • 若不考虑用户Cache的脏位和替换算法控制位,采用直接映射方式,该数据cache的容量S=?
    • 内存地址为 log ⁡ 2 256 M = log ⁡ 2 2 8 × 2 20 = 28 \log_2{256M}=\log_2{2^8\times{2^{20}}}=28 log2256M=log228×220=28
      • 其实也用不着计算地址所有位数
      • 由于cache块大小已经知道了
      • 所以只需要知道高位部分的位数m
    • M = 256 M B 64 B = 4 M = 2 22 M=\frac{256MB}{64B}=4M=2^{22} M=64B256MB=4M=222
      • m=22
    • C = 8 = 2 3 C=8=2^3 C=8=23
      • c=3
      • 直接映射法的标记位数t=m-c=22-3=19bit
    • S = S t e r m s + S d a t a S=S_{terms}+S_{data} S=Sterms+Sdata
      • b t e r m s = S v + t = 1 + 19 = 20 b_{terms}=S_v+t=1+19=20 bterms=Sv+t=1+19=20
      • b v = 1 , 表 示 有 效 位 占 1 位 b_v=1,表示有效位占1位 bv=1,1
    • S t e r m s = c b t e r m s = 8 × 20 b i t = 160 b i t = 20 B S_{terms}=cb_{terms}=8\times{20}bit=160bit=20B Sterms=cbterms=8×20bit=160bit=20B
    • S d a t a = c L = 8 × 64 B = 2 9 B S_{data}=cL=8\times{64B}=2^{9}B Sdata=cL=8×64B=29B
    • S=20+512=532B=4256bit

映射块号🎈

  • 主存地址为A=3200(十进制)的内存单元对应的

    • 直接映射方式下的cache行号i是多少?

    • 如果采用直接映射:

      • 方法1:计算块号再取模(公式法)
        • j = 3200 64 = 50 j=\frac{3200}{64}=50 j=643200=50
        • C = 8 C=8 C=8
        • i = 50 % 8 = 2 i=50\%8=2 i=50%8=2
        • 因此i=2
      • 方法2:分析二进制地址法
        • 3200 = 2 5 × 100 3200=2^5\times{100} 3200=25×100
          • 100 = 8 × 12 + 4 = 2 3 × 110 0 2 + 2 2 = 1 , 100 , 000 + 100 = 1100100 100=8\times{12}+4=2^3\times{1100_2}+2^2=1,100,000+100=1100100 100=8×12+4=23×11002+22=1,100,000+100=1100100
          • 3200 = 10000 0 2 × 110010 0 2 = 1100100 , 00000 3200={100000_2}\times 1100100_2=1100100,00000 3200=1000002×11001002=1100100,00000
          • 110,010,000,000
          • 块内地址后的c=3位,即,第7,8,9位是映射后的cache块号地址 01 0 2 = 2 010_2=2 0102=2:
        • 因此块号i=2
    • 二路组相联下的cache组号I是多少,行号i是多少?

    • 如果采用2路组相联(R=2),那么

      • Q = C / R = 8 / 2 = 4 Q=C/R=8/2=4 Q=C/R=8/2=4

      • I = j % Q = 2 I=j\%Q=2 I=j%Q=2

      • 即,对应的组号为2

      • 由于每组中含有的cache块数是R=2

      • 由于组号编号从0开始

        • 那么0号组和1号组共含有 ( 2 − 0 ) R = 2 × 2 = 4 (2-0)R=2\times{2}=4 (20)R=2×2=4
        • 所以第2组包含第5~6块,是 i对应的
        • 考虑到从0编号,所以i=4或5,
      • 组号(从0编址)块号(从0编址)
        0 [ 0 , R − 1 ] [0,R-1] [0,R1]
        1 [ R , 2 R − 1 ] [R,2R-1] [R,2R1]
        2[2R,3R-1]
        • R = 2 , i ∈ [ 4 , 5 ] R=2,i\in[4,5] R=2,i[4,5]
        • 十分推荐列表,不仅有利于归纳通项,还有利于降低错误机率

访存过程问题

  • 以直接映射方式为例,cpu在访问 A = 0123456 H A=0123456H A=0123456H的地址时的过程?
地址分析
  • 地址A共有4*7=28位
  • 低b=6位是块内地址(具体的字节/字地址)
    • 010110
  • 高m=22位:
    • cache块号位c=3位
      • 001
    • 标记位t=22-3=19位
      • 0000 0001 0010 0011 010
标记项比较
  • 根据块号位001得知,A处的主存单元内容只可能会被映射到001号cache块
  • 检查001号块cache行对应的主持标记位和上面计算出来的主存中的t=19位标记位字段,判断是否相同
  • 如果相同
    • 再判断有效位,如果有效位为1,那么cache命中,
    • 按照块内地址6位从001号cache行中读取出来相应的内容字节并送入到cpu,完成高速访存
  • 否则标记比较不相同,或者有效位是0
    • 那么cache未命中,需要访问主存,从主存的A位置将内容送入cpu和cache对应块中
    • 再设置标记项
      • 把主存的高19位tag位存入001行中
      • 置有效位为1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值